下面我们做一个小项目,爬取猫眼电影排行

目标

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

抓取分析

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

将网页滚动到最下方,可以发现有分页的列表,直接点击第 2 页,观察页面的 URL 和内容发生了怎样的变化。

可以发现页面的 URL 变成 http://maoyan.com/board/4?offset=10, 比之前的 URL 多了一个参数,那就是 offset=10,而目前显示的结果是排行 11 - 20 名的电影,初步推断这是一个偏移量的参数。再点击下一页,发现页面的 URL 变成了 http://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 的所有电影信息了。

抓取首页

我们先右键查看页面源代码,看看页面源代码中是否存在我们需要的信息。

可以看到,页面源代码中存在我们需要的电影名称,电影图片,主演、发布时间等信息。所以我们直接抓取页面源代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import requests

def get_one_page(url):
headers = {
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36'
}
resp = requests.get(url,headers = headers)
if resp.status_code == 200:
return resp.text
return None

# 主函数

def main():
url = 'https://www.maoyan.com/board/4'
html_text = get_one_page(url)
print(html_text)

main()

正则提取

我们从页面源代码中使用正则表达式提取出需要的数据

提取电影名称

<p class=”name”>.*?title=”(.*?)” data-act=

提取电影图片

<img data-src=”(.*?)” alt=

提取电影主演

<p class=”star”>(.*?)</p>

提取电影上映时间

<p class=”releasetime”>(.*?)

提取电影评分

<p class=”score”>(.?)(.?)

我们可以把所有的正则表达式整合在一起

<img data-src=”(.?)” alt=.*?

.

?title=”(.?)” data-act=.?

(.?)

.?

(.?)

.?

(.?)(.?)

这样一个正则表达式可以匹配一个电影的结果,里面匹配了 5个信息。

接下来,我们再定义解析页面的方法Analyze_webpage,主要是通过正则表达式来从结果中提取出我们想要的内容,实现代码如下:

1
2
3
4
5
6
def Analyze_webpage(html):
obj_sum = re.compile(
r'<img data-src="(.*?)" alt=.*?<p class="name">.*?title="(?P<name>.*?)" data-act=.*?<p class="star">(.*?)</p>.*?<p class="releasetime">(.*?)</p>.*?<p class="score"><i class="integer">(.*?)</i><i class="fraction">(.*?)</i></p>',
re.S)
result = obj_sum.findall(html)
print(result)