一起学爬虫——通过爬取豆瓣电影top250学习requests库的使用

1、准备工作
在pycharm中安装request库

python requests


请看上图,在pycharm中依次点击:File->Settings。然后会弹出下图的界面:

python requests

点击2中左上角的“+”按钮,弹出下图的界面:

python requests

在右上角的查询框输入requests,然后点击“Install Package”按钮安装requests插件。

2、目标
抓取每部电影的名字、主演、评分、图片等信息, 并保存在txt文本文件中。

3、分析豆瓣top250电影首页
1、分析豆瓣电影top250的网页https://movie.douban.com/top250,在浏览器中打开该网页:

python requests

可以看到一页显示25部电影。250部电影分10显示:

python requests

要抓取250部电影需要抓取10次。下面是每一页的网页链接:

https://movie.douban.com/top250?start=0&filter= 首页,等效于https://movie.douban.com/top250 https://movie.douban.com/top250?start=25&filter= #第2页 https://movie.douban.com/top250?start=50&filter= #第3页 ... ... ... https://movie.douban.com/top250?start=225&filter= #第10页

通过分析上面的链接可以得出一个规律:start=0显示1到25部电影,start=25显示26到50部电影,以此类推,在抓取每一页的电影时,是需要改变start的值即可。

4、抓取豆瓣电影top250首页
代码如下:

import requests import re import json headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0"} url = 'https://movie.douban.com/top250?start=0&filter=' proxies = { "http": "http://123.207.96.189:80" } response = requests.get(url, proxies = proxies,headers=headers) text = response.text print(text)

通过上述的代码我们可以学习到requests类库中如何使用headers信息和设置代理。
headers头信息和proxies代理信息都是定义为dict词典变量,然后在调用requests.get()方法时传输这个两个参数:

response = requests.get(url, proxies = proxies,headers=headers)

很多网站都有反爬虫的措施,对于没有headers头信息的请求一律认为是爬虫,禁止该请求的访问。因此在每次爬取网页时都需要加上headers头信息。

对于访问过于频繁的请求,客户端的IP会被禁止访问,因此设置代理可以将请求伪装成来自不同的IP,前提是要保证代理的IP地址是有效的。

5、抓取每一部电影的信息

查看网页源代码有两种方式:
通过鼠标右键点击查看“查看源文件”选项,或者通过浏览器的开发者工具选项,然后点击Network查看源码:

python requests

下图是一部电影在HTML网页中的显示,我们要做的就是从HTML中提取出电影名称、主演、图片等信息。

python requests

提取电影的信息需要用到正则表达式。
通过上图可以看到一部电影的信息对应的源代码是<div>节点,红色框所示。我们先用正则表达式提取到每部电影的所有信息:
regix = '<div>'
class为pic的div节点包含电影的排名和电影图片信息,提取电影排名和电影图片信息的正则表:

regix = '<div>.*?<div>.*?<em>(.*?)</em>.*?<img.*?src="(.*?)">'

class为info的div标签中包含了电影的名字、导演和演员等信息,电影名字是在class为hd的div的节点内,<span>节点内包含的是电影的名字,<span>节点内包含的是电影的别名,上图中的褐色框部分,因此提取电影名字的正则表达式为:

regix = '<div>.*?<div>.*?<em>(.*?)</em>.*?<img.*?src="(.*?)">.*?divhd".*?class="title">(.*?)</span>.*?class="other">(.*?)</span>'

class为bd的节点内包含的是电影的导演和主演信息,其中class为“”的p节点内包含的是电影的导演和演员信息,其中还包含了<br>标签,上图中的紫色框部分,为了提取电影导演和演员的信息,正则表达式改写为:

regix = '<div>.*?<div>.*?<em>(.*?)</em>.*?<img.*?src="(.*?)">.*?divhd".*?class="title">(.*?)</span>.*?class="other">(.*?)</span>.*?<div>.*?<p>(.*?)<br>(.*?)</p>'

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpgdpp.html