爬虫:爬取猫眼电影top100

Posted Felix Wang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了爬虫:爬取猫眼电影top100相关的知识,希望对你有一定的参考价值。

一:分析网站

目标站和目标数据
目标地址:http://maoyan.com/board/4?offset=20
目标数据:目标地址页面的电影列表,包括电影名,电影图片,主演,上映日期以及评分。

二:上代码

(1):导入相应的包

import requests
from requests.exceptions import RequestException # 处理请求异常
import re
import pymysql
import json
from multiprocessing import Pool

(2):分析网页

通过检查发现需要的内容位于网页中的<dd>标签内。通过翻页发现url中的参数的变化。

(3):获取html网页

# 获取一页的数据
def get_one_page(url):
    # requests会产生异常
    headers = {
        \'User-Agent\': \'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36\',
    }
    try:
        response = requests.get(url, headers=headers)
        if response.status_code == 200:  # 状态码是200表示成功
            return response.text
        else:
            return None
    except RequestException:
        return None

(4):通过正则提取需要的信息 --》正则表达式详情

# 解析网页内容
def parse_one_page(html):
    pattern = re.compile(
        \'<dd>.*?board-index.*?>(\\d+)</i>.*?data-src="(.*?)".*?class="name"><a.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>\',
        re.S)  # re.S可以匹配任意字符包括换行
    items = re.findall(pattern, html)  # 将括号中的内容提取出来
    for item in items:
        yield {  # 构造一个生成器
            \'index\': item[0].strip(),
            \'title\': item[2].strip(),
            \'actor\': item[3].strip()[3:],
            \'score\': \'\'.join([item[5].strip(), item[6].strip()]),
            \'pub_time\': item[4].strip()[5:],
            \'img_url\': item[1].strip(),
        }

(5):将获取的内容存入mysql数据库

# 连接数据库,首先要在本地创建好数据库
def commit_to_sql(dic):
    conn = pymysql.connect(host=\'localhost\', port=3306, user=\'mydb\', passwd=\'123456\', db=\'maoyantop100\',
                           charset=\'utf8\')
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 设置游标的数据类型为字典
    sql = \'\'\'insert into movies_top_100(mid,title,actor,score,pub_time,img_url) values("%s","%s","%s","%s","%s","%s")\'\'\' % (
        dic[\'index\'], dic[\'title\'], dic[\'actor\'], dic[\'score\'], dic[\'pub_time\'], dic[\'img_url\'],)
    cursor.execute(sql)  # 执行sql语句并返回受影响的行数
    # # 提交
    conn.commit()
    # 关闭游标
    cursor.close()
    # 关闭连接
    conn.close()

(6):主程序及运行

def main(url):
    html = get_one_page(url)
    for item in parse_one_page(html):
        print(item)
        commit_to_sql(item)


if __name__ == \'__main__\':
    urls = [\'http://maoyan.com/board/4?offset={}\'.format(i) for i in range(0, 100, 10)]
    # 使用多进程
    pool = Pool()
    pool.map(main, urls)

 (7):最后的结果

 

完整代码:

# -*- coding: utf-8 -*-
# @Author  : FELIX
# @Date    : 2018/4/4 9:29

import requests
from requests.exceptions import RequestException
import re
import pymysql
import json
from multiprocessing import Pool


# 连接数据库
def commit_to_sql(dic):
    conn = pymysql.connect(host=\'localhost\', port=3306, user=\'wang\', passwd=\'123456\', db=\'maoyantop100\',
                           charset=\'utf8\')
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 设置游标的数据类型为字典
    sql = \'\'\'insert into movies_top_100(mid,title,actor,score,pub_time,img_url) values("%s","%s","%s","%s","%s","%s")\'\'\' % (
        dic[\'index\'], dic[\'title\'], dic[\'actor\'], dic[\'score\'], dic[\'pub_time\'], dic[\'img_url\'],)
    cursor.execute(sql)  # 执行sql语句并返回受影响的行数
    # # 提交
    conn.commit()
    # 关闭游标
    cursor.close()
    # 关闭连接
    conn.close()


# 获取一页的数据
def get_one_page(url):
    # requests会产生异常
    headers = {
        \'User-Agent\': \'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36\',
    }
    try:
        response = requests.get(url, headers=headers)
        if response.status_code == 200:  # 状态码是200表示成功
            return response.text
        else:
            return None
    except RequestException:
        return None


# 解析网页内容
def parse_one_page(html):
    pattern = re.compile(
        \'<dd>.*?board-index.*?>(\\d+)</i>.*?data-src="(.*?)".*?class="name"><a.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>\',
        re.S)  # re.S可以匹配任意字符包括换行
    items = re.findall(pattern, html)  # 将括号中的内容提取出来
    for item in items:
        yield {  # 构造一个生成器
            \'index\': item[0].strip(),
            \'title\': item[2].strip(),
            \'actor\': item[3].strip()[3:],
            \'score\': \'\'.join([item[5].strip(), item[6].strip()]),
            \'pub_time\': item[4].strip()[5:],
            \'img_url\': item[1].strip(),
        }
    # print(items)


def write_to_file(content):
    with open(\'result.txt\', \'a\', encoding=\'utf8\')as f:
        f.write(json.dumps(content, ensure_ascii=False) + \'\\n\')


ii = 0


def main(url):
    html = get_one_page(url)
    for item in parse_one_page(html):
        global ii
        print(ii, item)
        ii = ii + 1
        commit_to_sql(item)
        write_to_file(item)


# print(html)


if __name__ == \'__main__\':
    urls = [\'http://maoyan.com/board/4?offset={}\'.format(i) for i in range(0, 100, 10)]
    # 使用多进程
    pool = Pool()
    pool.map(main, urls)

 

以上是关于爬虫:爬取猫眼电影top100的主要内容,如果未能解决你的问题,请参考以下文章

爬虫:爬取猫眼电影top100

python爬虫,爬取猫眼电影top100

爬虫练习 | 爬取猫眼电影Top100

[爬虫]requests+正则表达式爬取猫眼电影TOP100

python爬取猫眼电影top100

Python爬虫实战之Requests+正则表达式爬取猫眼电影Top100