正则匹配的抓取猫眼电影排行Top100

CSDN博客:皮乾东
知乎:Htrying
微博:Htring的微博
GitHub:Htring
微信公众号:自然语言处理爱好者(ID:NLP_lover)

本案例,我们利用requests库和正则表达式来抓取猫眼电影TOP100的相关内容。

1.目标

提取猫眼电影Top100的电影名称、时间、评分、图片(下载),提取的站点URL为:http://maoyan.com/board/4,图片将保存到指定文件夹中。

2.准备工作

需要安装requests包(安装方式:在配好的环境中:pip install requests即可)

3.抓取分析

通过打开网页,找到网页之间的规律,如图:
这里写图片描述
可以发现页面的URL变成:http://maoyan.com/board/4?offset=10,比之前的URL多一个参数,offset=10,并且目前显示的结果是:11~20名的电影,由此可以找到其他排名电影页面的URL规律。

4. 正则提取分析

在浏览器端的开发者模式下的Network监听组件下查看源码,如图:
这里写图片描述
而每个电影的内容都在一个dd标签下:
这里写图片描述
正则表达式书写:

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

需要说明的是:以上的每个括号表示的就是要获取的内容。

5.写入文件

在获取提取的结果后,我们将数据写到一个txt文档中,这里数据是使用json格式的内容书写的。

6.下载图片

涉及到语言、图片、视频的时候,我们可以使用:with open("",'rb')的形式书写。保存。

7.代码详解

#爬虫库
import requests
#json数据格式库
import json
#requests异常
from requests.exceptions import RequestException
#正则表达式
import re
#延迟函数
import time

#定义一个读取一个url并返回相应信息的函数
def get_one_page(url):
    try:
        #伪装浏览器
        headers={
        "User-Agent":'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
        }
        #读取网页
        response=requests.get(url,headers=headers)
        #判断是否读取成功
        if response.status_code==200:
            #返回读取的内容(html代码)
            return response.text
        return None
    except RequestException:
        return None
#定义一个解析html代码的函数
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)
    #遍历查找到的内容
    for item in items:
        #使用关键字yield 类似于return 返回的是一个生成器对象
        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]
        }
#将结果写到一个txt文档中
def write_to_file(content):
    with open('result.txt', 'a', encoding='utf-8') as f:
        f.write(json.dumps(content, ensure_ascii=False) + '\n')
#图片下载
def pic_download(url,title):
    r=requests.get(url)
    with open("pics/"+title+".jpg",'wb') as f:
        f.write(r.content)
#打开需要爬取得所有网页,并进行爬取
def main(offset):
    #网页链接
    url='http://maoyan.com/board/4?offset='+str(offset)
    #请求网页,获取html
    html=get_one_page(url)
    #遍历处理后的html结果
    for item in parse_one_page(html):
        #下载图片
        pic_download(item['image'], item['title'])
        #写入到文件中
        write_to_file(item)
if __name__ == '__main__':
    for i in range(10):
        main(offset=i*10)
        #延迟1秒,避免反爬机制
        time.sleep(1)

8.运行结果

这里写图片描述

这里写图片描述
这里写图片描述

猜你喜欢

转载自blog.csdn.net/meiqi0538/article/details/81022857