CC

自然万物都趋向从有序变得无序

0%

python爬取猫眼电影

之前暑假之余一直在学习python的爬虫,但由于忙于acm的训练,一直没有时间好好的敲代码,现在终于空下来了,想把之前的教程上面的项目实战写一遍,顺便温习一下学过的 内容。

本次爬虫主要利用了requests模块进行网站的链接和网页获取,利用re模块的正则表达式进行特定内容的获取。

我们先打开链接:http://maoyan.com/board/4, 利用开发者模式查看网页的源代码,分析源代码。

我们需要爬取的目标是每个电影的名称,排名,演员,上映时间,封面图片,评分等内容,

我们利用开发者工具查看源代码:

匹配过程

我们可以发现每一个电影的信息都在一个 dd 标签里面,于是我们可以利用正则表达式来提取到dd里面的内容。

大致的提取过程是先匹配到dd标签然后通过非贪婪模式匹配到我们需要的内容,最后利用group函数得到我们匹配的地方。

我使用的正则表达式是

1
2
pattern = re.compile('<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?class="name"><a.*?>(.*?)'
'</a>.*?"star">(.*?)</p>.*?>(.*?)</p>.*?<i class="integer">(.*?)</i><.*?>(.*?)</i>.*?</dd>', re.S)

表示的意思是先匹配到dd标签,然后使得非贪婪匹配和通配符匹配中间过程的的任意内容,然后再提取我们需要的内容,一直这样直到我们所有的内容都收到,re.S的意思是使 . 匹配包括换行在内的所有字符。

具体关于正则表达式的内容可以看我之前的博客:https://woodcb.com/2018/python的re库学习/

获取网页

这个网站似乎经常被爬,所以有了很多的反爬虫措施,我们必须设置User-Agent才能进行访问,并且如果同一个ip地址访问次数太多的话,这个ip地址也会被封。

关于设置User-Agent和代理ip的可以看我之前的文章:https://woodcb.com/2018/python的requests库用于爬虫的基本知识/

或者直接看代码也可以。

我们点击下一页,发现地址栏里面的有一个参数一直在变换,所以我们可以确定那个参数是用于翻页的,于是我们可以通过传入这个参数来改变页数,从而达到获取每一页的内容的目的。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#!/usr/bin/python3.6 python
# coding=utf-8

import requests
import re
import time


def get_one_page(url):
proxy = {'http': '218.14.115.211:3128'}
header = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 '
'(KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}
response = requests.get(url, headers=header, proxies=proxy)
print(response.status_code)
if response.status_code == 200:
return response.text
return None


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


def out(items):
for item in items:
x = ({
'rank': item[0],
'image': item[1],
'name': item[2].strip(),
'actors': item[3].strip(),
'time': item[4].strip(),
'score': item[5] + item[6].strip()
})
print(x)


if __name__ == '__main__':
url = 'http://maoyan.com/board/4?offset='
for i in range(10):
html = get_one_page(url+str(i*10))
if html is not None:
items = process_html(html)
out(items)
else:
print("ERROR")
time.sleep(1)