爬取猫眼电影top100

昨天学了正则,有点膨胀,来爬爬猫眼电影top100试试看。http://maoyan.com/board/4

用到的模块

1
2
import requests
import re

用正则表达式匹配下载当页信息

首先打开网页,右键霸王别姬检查元素,可以发现我们要提取的信息。
箭头就是我们要提取的内容
接下来就是写代码用正则把内匹配下来

1
2
3
4
5
6
7
8
9
10
11
12
13
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.4094.1 Safari/537.36'}
r = requests.get('http://maoyan.com/board/4?offset=0',headers=headers)
results = re.findall(
'<a.*?title="(.*?)".*?class="image-link".*?class="star">(.*?)</p>.*?<p class="releasetime">(.*?)</p>.*?<i class="integer">(.*?)</i><i class="fraction">(.*?)</i></p> ',
r.text, re.S)
'''
findall方法会把匹配到的小括号里的一组内容加工成元组,再把所有元组以列表形式返回
.*?可以非贪婪匹配任意除换行字符,只要把想提取的内容以.*?代替就好了,再加个小括号
我们只需要写要提取的内容前面和后面的几个字符就好了,其他的冗长字符也可用.*?代替
第二个参数是被匹配的文本,传入网页源代码即可
因为标签之间还有好多换行,而.*?无法匹配换行,加上re.S这个参数,就可以匹配到了
'''

再写个循环把提取到的内容写进txt文件即可

1
2
3
4
5
6
7
8
9
for i in results:
with open('top100.txt', 'a',encoding='utf-8') as f:
f.write(i[0] + ' ' + re.sub('\n\s+', '', str(i[1])) + ' ' + i[2] + ' ' + '评分:' + i[3] + i[4] + '\n')
'''
a表示追加写入,要加上encoding='utf-8',不然会编码错误
i[0] i[1]等表示当前列表里的某个元组的第几个内容
我们会发现元组里的第二个内容有许多空格和换行,所以我们用sub方法拿''空字符替换掉,第一个参数是被替换字符,第二个参数是替换字符,第三个参数是被操作的文本,所以我们需要把元组的内容转换成字符串。

'''

写个循环爬取所有页面的内容

我们发现网页的地址格式是http://maoyan.com/board/4?offset= + 0,10,20,30…100

1
2
3
4
5
for i in range(0,110,10):
url = 'http://maoyan.com/board/4?offset=' + str(i)
'''第三个参数是步长,即每次增加10,因为range里的两个数字是前闭后开,所以第二个参数要比100大,这样我们就得到0,10,20到100的数
然后再把上面的代码写成函数,在这个循环里调用即可
'''

最后

附上全部代码,原谅小白的代码吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import requests
import re

def get_information(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.4094.1 Safari/537.36'}
r = requests.get(url,headers=headers)
result = re.findall(
'<a.*?title="(.*?)".*?class="image-link".*?class="star">(.*?)</p>.*?<p class="releasetime">(.*?)</p>.*?<i class="integer">(.*?)</i><i class="fraction">(.*?)</i></p> ',
r.text, re.S)
for i in result:
with open('top100.txt', 'a',encoding='utf-8') as f:
f.write(i[0] + ' ' + re.sub('\n\s+', '', str(i[1])) + ' ' + i[2] + ' ' + '评分:' + i[3] + i[4] + '\n')
for i in range(0,110,10):
url = 'http://maoyan.com/board/4?offset=' + str(i)
get_information(url)