知足常乐

日常学习的记录与分享

python爬虫-抓取猫眼电影排行

1. 目标

我们要提取出猫眼电影TOP100的电影名称、时间、评分、图片等信息,提取的站点URL为http://maoyan.com/board/4,提取的结果会以文件形式保存下来

2. 抓取分析

我们需要抓取的目标站点为http://maoyan.com/board/4,打开之后便可以查看到榜单信息

《python爬虫-抓取猫眼电影排行》

我们可以看到榜单上 名称,主演,上映时间,评分,图片这些信息滑动到不我们可以看到分页信息,接下来我们点击每一页观察他url中的参数是如何变化的

《python爬虫-抓取猫眼电影排行》

我们发现如下 https://maoyan.com/board/4?offset=10 且第二页显示的是排名从11-20的电影信息。我们在看第三页发现url变为https://maoyan.com/board/4?offset=20,印证了前面的思路

那么我们确定offset为偏移量 当为offset==n时 显示n+1 – n+10排名范围的内容,想要得到排名前100的名单我们只要让n累加到90即可

然后我们分析一下每一段的源代码 右键源代码查看 或者构造一个方法查看

《python爬虫-抓取猫眼电影排行》
#获取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

我们可以发现每个电影的信息都在

<dl class=”board-wrapper”> 中并用<dd>标签包含着

排名信息<i class=”board-index board-index-21″ 标签中我们可以用用正则表达式去通配信息

 <dd>.*?board-index.*?>(.*?)</i> 

图片信息在 <img data-src 信息中 我们可以续写正则表达式

<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)"

同理我们可以根据网页html标签 写出电影名称,主演,发布时间,评分的内容 最后 我们得到这样一个正则表达式

<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>

正则表达式中都采用非贪婪模式去匹配信息 每一个(.*?)代表一个我们需要的信息 这样我们就可以 获取到我们需要的6个信息 下面我们写一个方法去匹配从html中匹配所需内容的方法(ps: yield 返回的是一个生成器,不清楚的同学可以去看廖大的解释 附上链接 生成器讲解

#正则提取关键信息
def parse_one_page(html):
    pattern = re.compile('<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)
    for item in items:
        yield {
            'index': item[0],
            'image': item[1],
            'title': item[2],
            'actor': item[3].strip()[3:],
            'time': item[4].strip()[5:],
            'score': item[5] + item[6]
        }

这样我们就可以获取到我们想要的信息了

3. 写入文件

随后,我们将提取的结果写入文件,这里直接写入到一个文本文件中。这里通过JSON库的dumps()方法实现字典的序列化,并指定ensure_ascii参数为False,这样可以保证输出结果是中文形式而不是Unicode编码

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

4. 构造方法分页爬取

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

最后呢我们只需要自己写一个main入门即可,下面我们给出完整代码(为了不会因为过度访问而被封掉ip所以我们每爬取一个分析sleep1秒)

import json
import requests
from requests.exceptions import RequestException
import re
import time

#判断url是否请求成功
def get_one_page(url):
    try:
        response = requests.get(url)
        if response.status_code == 200:
            return response.text
        return None
    except RequestException:
        return None
#正则提取关键信息
def parse_one_page(html):
    pattern = re.compile('<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)
    for item in items:
        yield {
            'index': item[0],
            'image': item[1],
            'title': item[2],
            'actor': item[3].strip()[3:],
            'time': item[4].strip()[5:],
            'score': item[5] + item[6]
        }
#写入文件
def write_to_file(content):
    with open('result.txt', 'a', encoding='utf-8') as f:
        f.write(json.dumps(content, ensure_ascii=False) + '\n')
 
#构造URL
def main(offset):
    url = 'http://maoyan.com/board/4?offset=' + str(offset)
    html = get_one_page(url)
    for item in parse_one_page(html):
        print(item)
        write_to_file(item)
 
if __name__ == '__main__':
    for i in range(10):
        main(offset=i * 10)
        time.sleep(1)

下面我们来看看 控制台 和 写入的文件

《python爬虫-抓取猫眼电影排行》
控制台输出
《python爬虫-抓取猫眼电影排行》
写入文件的内容

最后附上 参考资料 :

本文是我在学习崔庆才的python3网络爬虫实战一书中对猫眼电影爬取的总结,同时也将这本书推荐给大家

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注