Hysteria

Python爬虫-爬取猫眼电影Top100
猫眼电影Top100爬取爬虫写的好,牢饭吃到老。滑稽警告~1 首先导入需要的工具包import requests ...
扫描右侧二维码阅读全文
18
2019/04

Python爬虫-爬取猫眼电影Top100

猫眼电影Top100爬取

爬虫写的好,牢饭吃到老。滑稽警告~

1 首先导入需要的工具包

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

当然,是写到哪里需要哪个工具再导入哪个工具包,按照思维的行进来导入。这里为了代码的整齐就一次放上来

2 抓取目标页面,获取html内容

def get_one_page(url):
    try:
        response = requests.get(url)
        if response.status_code == 200:
            return response.text
        return None
    except RequestException:
        return None

定义一个获取目标页面的函数,并使用requests库中的RqusetException异常类对捕获目标页面进行一个容错处理。当状态码为200时返回html的文本内容。

3 获取页面后,那就定义一个解析页面的函数

def parse_one_page(html):
    pattern = re.compile(
        r'<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a.*?>'
        '(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>.*?integer">(.'
        '*?)</i>.*?fraction">(.*?)</i>.*?</dd>',
        re.S)
    items = re.findall(pattern, html)
    # print(items)
    for item in items:
        yield {'index': item[0],
               'image': item[1],
               'file_title': item[2],
               'actor': item[3].strip()[3:],
               'time': item[4].strip()[5:],
               'score': item[5] + item[6]
               }

获取的html规整是不可能规整的

avatar

正则表达式大法好,在凌乱的html源代码中有序缜密地提取我所需要的影片信息。爬虫对于这种连续的html结构 (.*?)这种非贪婪匹配十分实用,从代码中看是一对<dd>标签中提取出一则影片信息并构造一个生成器产出一个包含影片的排名,主演,片名,封面链接等信息的一个字典。

当然这种正则的写法适用于 每一个<dd>标签的结构都相同才成立,如果不相同没准一个页面十部影片只能抓下来几个造成数据缺失

4 既然数据已经抓到了,那么写入文件。打完收工

定义一个写入文件的函数

def write_to_file(content):
    with open('result.txt', 'a', encoding='utf-8') as f:
        f.write(json.dumps(content, ensure_ascii=False) + '\n')  # dumps 解析字典写入文件
        f.close()

利用 with open结构创建一个写入文件(with open的结构很好,对于懒人来说不用每次都要把文件对象执行close()函数),对于我这菜鸡来说编码是很麻烦的事情,所以一般无脑统一‘utf-8’ 。这里值得注意的一个点是上面提及的解析函数生成的是一个字典的数据类型是没办法直接write写入的。所以使用json模块的dumps()函数把Python对象编码成json字符串,这个ensure_ascii = False参数很重要,可以很大程度减少乱码的出现。

5 最后,定义一个主函数,干就完事了

def main(offset):
    url = 'http://maoyan.com/board/4?offset=' + str(offset)
    html = get_one_page(url)
    parse_one_page(html)
    for item in parse_one_page(html):
        print(item)
        write_to_file(item)

由于抓的是Top100的电影,在观察页面的url后发现,只要改变url后的offset数值就能实现翻页。0代表第一页,90代表第十页,这很程序员。So~ for 循环依次乘10,收工。

if __name__ == '__main__':
    for i in range(10):
        main(i*10)
    end = timeit.default_timer()
    print(f'成功爬取猫眼电影网榜单前100,用时{str(end - start)}s.')

附两张效果图:
avatar
avatar

这个案例是跟着崔庆才大佬敲得,大佬功力高深。代码简洁高效~

大佬博客————>静觅丨崔庆才的个人博客

Last modification:April 29th, 2019 at 10:12 pm

Leave a Comment