文章目录

  • 1.抓取目标
  • 2.准备工作
  • 3.抓取分析
  • 4.抓取首页
  • 5.正则提取
  • 6.写入文件
  • 7.整合代码
  • 8.分页爬取
  • 9.运行结果
  • 10.本节代码

最近刚开始了解爬虫,学习了一下基本库的使用。跟着书上做一个小练习,利用requests库抓取猫眼电影TOP100的相关内容。因为还没系统学习过HTML解析库,所以就用正则表达式来作为解析工具。

1.抓取目标

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

2.准备工作

开始之前,需要确保已经安装了requests库。可以通过pip命令直接安装,也可以利用pycharm插件。

3.抓取分析

目标站点为http://maoyan.com/board/4,打开之后就可以看到榜单信息,如图所示

排名第一的是我不是药神,页面中显示的有效信息有影片名称、主演、上映时间、上映地区、评分、图片等信息。
我们点击第二页,观察页面的URL和内容发生了怎样的变化,如图

发现页面的URL变成了https://maoyan.com/board/4?offset=10,比之前多了一个参数,那就是offset=10,显示的为排行11 ~ 20名的电影,初步推断这是一个偏移量的参数。再点击下一页,发现URL变成了https://maoyan.com/board/4?offset=20,参数offset变成了20,显示21 ~ 30的电影。
所以可以总结出来,offset代表偏移量值,如果偏移量为n,则显示的电影序号就是n+1到n+10,每页显示10个。所以要获取TOP100电影,只需要分开请求10次,而10次的offset参数分别设置为0,10,20……90就可以了。再用正则表达式提取出相关信息,就可以得到TOP100的所有电影信息。

4.抓取首页

下面用代码实现,首先抓取第一页内容。我们实现get_one_page()方法,并给他传入url参数。然后将抓取的页面结果返回,再用main()方法调用。初步代码如下:

import requestsdef get_one_page(url):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'}response = requests.get(url,headers=headers)if response.status_code == 200:return response.textreturn None
def main():url = 'http://maoyan.com/board/4'html = get_one_page(url)print(html)
main()

运行之后就可以成功获取首页的源代码了。获取之后需要解析页面,提取出我们想要的信息。

5.正则提取

我们去网页看一下真实的源码。在开发者模式下的Network监听组件中查看源代码,如图

注意,这里不要直接去Elements选项卡查看,因为这里的源码可能经过JavaScript操作而与原始请求不同,而是需要从Network中查看原始请求得到源码。我们来分析其中一个条目。

可以看到,一部电影信息对应的源代码是一个dd节点,我们用正则表达式来提取这里面的一些信息。首先是排名信息。它的排名在class为board-index的i节点内,这里用非贪婪匹配来提取i节点内的信息,正则表达式写为:

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

随后需要提取的是电影图片。可以看到,后面有a节点,其内部有两个img节点。经过检查后发现,第二个img节点的data-src属性是图片链接。这里提取第二个img节点的data-src属性,表达式改成这样:

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

再往后,需要提取电影名称,它在后面的p节点内,class为name。所以,还可以用name做一个标志位,然后进一步提取其内a节点的正文内容,此时正则表达式改写如下:

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

再提取主演、发布时间、评分等内容,都是同样的原理,最后的正则表达式为:

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

这样一个正则表达式就可以匹配一个电影的结果了,有七条信息。下面通过调用findall()方法提取所有内容。
下面,我们再定义一个解析页面的方法parse_one_page(),主要通过正则表达式来从结果中提取出我们想要的内容,代码如下:

def parse_one_page(html):pattern = re.compile('<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>',re.S)items = re.findall(pattern,html)print(items)

输出结果如下,这是一个列表形式。

但是这样数据比较杂乱,我们再将匹配结果处理一下,遍历提取结果并生成字典,改成这样:

def parse_one_page(html):pattern = re.compile('<dd>.*?board-index.*?>(.*?)</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].strip(),'actor': item[3].strip()[3:] if len(item[3]) > 3 else '','time': item[4].strip()[5:] if len(item[3]) > 3 else '','score': item[5].strip() + item[6].strip()}

这样就可以成功提取电影的排名、图片、标题、演员、时间、评分等内容了,并把它赋值为一个个字典,形成结构化数据。运行结果如下:

6.写入文件

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

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

通过调用write_to_file()方法即可实现将字典写入到文本文件的过程,此处的content参数就是提取结果,是一个字典。

7.整合代码

最后,实现main()方法来调用前面的方法,将单页的电影结果写入到文件,代码如下:

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

到这里我们就完成了单页的提取。

8.分页爬取

因为我们需要抓取的是TOP100的电影,所以还需要遍历一下,给这个链接传入offset参数,实现其他90部的爬取,此时添加如下调用:

if __name__ == '__main__':for i in range(10):main(offset= i*10)

还需要将main方法修改一下,接收一个offset值作为偏移量,然后进行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)

至此,整合完成后的代码如下:

import json
import requests
from requests.exceptions import RequestException
import re
import time
import httpdef get_one_page(url):try:headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'}response = requests.get(url, headers=headers)if response.status_code == 200:return response.textreturn Noneexcept RequestException:return Nonedef 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, str(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')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)

因为猫眼有反爬虫,如果速度过快会无响应,所以又加了一个延时等待。可能有人在做练习的时候就已经觉察到了,ip已经被封了,其实这里最好的解决办法还是设置代理,可以找一些免费的代理服务器。

9.运行结果

我们来运行一下代码,输出结果如下

我们再来看下文本文件,如图所示

可以看到,电影的信息也全部保存到文本文件里了。

10.本节代码

本节代码也提交到了GitHub上,代码地址:https://github.com/jiangwenvae/Spider/blob/main/spider/CatEye.py。

利用requests库抓取猫眼电影排行相关推荐

  1. 利用Python爬虫抓取猫眼电影排行(BeautifulSoup方式初试手,欢迎改进)

    from bs4 import BeautifulSoup import requests import json import time from requests.exceptions impor ...

  2. 00_抓取猫眼电影排行TOP100

    前言: 学习python3爬虫有一段时间了,熟悉了爬虫的一些基本原理和基本库的使用,本次就准备利用requests库和正则表达式来抓取猫眼电影排行TOP100的相关内容. 1.本次目标: 爬取猫眼电影 ...

  3. python3网络爬虫开发实战-抓取猫眼电影排行(正则表达式版)

    抓取猫眼电影排行 目前没有学习HTML解析库,这里先选用正则表达式作为解析工具 目标 提取出猫眼电影top100的电影名称.时间.评分.图片等信息.提取的站点URL为http://maoyan.com ...

  4. Python爬虫之requests+正则表达式抓取猫眼电影top100以及瓜子二手网二手车信息(四)...

    requests+正则表达式抓取猫眼电影top100 一.首先我们先分析下网页结构 可以看到第一页的URL和第二页的URL的区别在于offset的值,第一页为0,第二页为10,以此类推. 二.< ...

  5. 正则表达式和requests抓取猫眼电影排行

    一.目的 利用学习的requests库和正则表达式抓取猫眼电影的排行榜的名称.时间.评分和图片等信息.提取站点的地址:https://maoyan.com/board/4 二.准备工作 确保开发环境安 ...

  6. Requests与正则表达式抓取猫眼电影排行!

    本节我们利用 Requests 和正则表达式来抓取猫眼电影 TOP100 的相关内容,Requests 相较于 Urllib 使用更加方便,而目前我们还没有系统学习 HTML 解析库,所以可能对 HT ...

  7. Python3网络爬虫实战-27、Requests与正则表达式抓取猫眼电影排行

    本节我们利用 Requests 和正则表达式来抓取猫眼电影 TOP100 的相关内容,Requests 相较于 Urllib 使用更加方便,而目前我们还没有系统学习 HTML 解析库,所以可能对 HT ...

  8. 【Python】Python3网络爬虫实战-27、Requests与正则表达式抓取猫眼电影排行

    本节我们利用 Requests 和正则表达式来抓取猫眼电影 TOP100 的相关内容,Requests 相较于 Urllib 使用更加方便,而目前我们还没有系统学习 HTML 解析库,所以可能对 HT ...

  9. 【Python3网络爬虫开发实战】3-基本库的使用-4抓取猫眼电影排行

    本节中,我们利用requests库和正则表达式来抓取猫眼电影TOP100的相关内容.requests比urllib使用更加方便,而且目前我们还没有系统学习HTML解析库,所以这里就选用正则表达式来作为 ...

最新文章

  1. jQuery 变量数字相加
  2. 【C++】 18_对象的构造 (中)
  3. Javascript调用OCX控件
  4. 读ACM程序设计竞赛基础教程之-------技巧小结
  5. 互联网1分钟 | 0117 IBM入驻上海张江人工智能岛;IoT业务将成为小米新支撑点
  6. vue函数如何调用其他函数?_好程序员Python教程系列之递归函数与匿名函数调用...
  7. c/c++ code JSON
  8. linux定时任务执行脚本文件找不到,linux中脚本放入计划任务当中为什么没有执行呢?...
  9. python vb 哪个好学_最难学的七大编程语言,VB 第一,Python垫底,看你学的排第几...
  10. c语言手机教程,【图片】【教程】手机c语言入门与手机c编程【mrp吧】_百度贴吧...
  11. 大话企业上云之第二篇
  12. 挑战程序设计竞赛:三角形
  13. c语言进程调度报告,操作系统C进程调度算法实验报告
  14. XSS跨站脚本攻击和预防措施
  15. 内推 | 字节跳动内推
  16. java中通物流api详解
  17. 自学编程系列——4 Numpy数组
  18. 你知道哪些出身最奇特的程序员?
  19. 共创软硬件协同生态:Graphcore IPU与百度飞桨的“联合提交”亮相MLPerf
  20. Excel 公式大全与实战演示

热门文章

  1. SSR和CSR的区别
  2. VSCode 出现 正在保存“xxxx.vue”: 从 “‘Vetur‘, ‘ESLint‘“(configure)中获取代码操作。
  3. TensorRT加速原理
  4. 陈艾盐:《春燕》百集访谈节目第六十九集
  5. java 火车票_Java 面向对象 之 接口 火车票实例
  6. 基于经典蓝牙的安卓蓝牙APP开发(基于蓝牙2.0开发,例:HC-05)
  7. iPhone 换电池 检测新电池实际容量
  8. python之Matplotlib
  9. 【论文阅读笔记 + 代码解读】(2018 AAAI)ST-GCN
  10. 宋浩概率论与数理统计-第八章-笔记