Phil Lee

前几天结束了Python的基础语法学习,今天开始学习进阶篇之爬虫,第一个实践项目就是爬取猫眼电影top100榜单。


1,抓取首页HTML代码:

首先爬取网页的HTML代码,通过以下代码:

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

def get_one_page(url):
try:
response = requests.get(url) # 获取网页html内容
if response.status_code == 200: # 通过状态码判断是否成功
return response.text
return None
except RequestException:
return None

def main():
url = 'http://maoyan.com/board/4'
html = get_one_page(url)
print(html)

if __name__ == '__main__':
main()

运行结果如下:

2,利用正则提取有用信息

实现的代码:

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

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],
'actor': item[3].strip()[3:],
'time': item[4].strip()[5:],
'score': item[5] + item[6]
}

def main():
url = 'http://maoyan.com/board/4'
html = get_one_page(url)
for item in parse_one_page(html):
print(item) # 修改main函数使结果输出为item

3,爬取top100

通过点击翻页观察url,发现是offset参数发生改变为10、20、···、90,调整代码同时输出为文件如下:

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
import json
import requests
from requests.exceptions import RequestException
import re
import time



def get_one_page(url):
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/67.0.3396.99 Safari/537.36'
}
response = requests.get(url, headers = headers) # 获取网页html内容
if response.status_code == 200: # 通过状态码判断是否成功
return response.text
return None


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:],
'time': item[4].strip()[5:],
'score': item[5].strip() + item[6].strip()
}


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')


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)

4,输出文件

输出文件内容如下(仅展示前五条):

1
2
3
4
5
{"index": "1", "image": "http://p1.meituan.net/movie/20803f59291c47e1e116c11963ce019e68711.jpg@160w_220h_1e_1c", "title": "霸王别姬", "actor": "张国荣,张丰毅,巩俐", "time": "1993-01-01(中国香港)", "score": "9.6"}
{"index": "2", "image": "http://p0.meituan.net/movie/283292171619cdfd5b240c8fd093f1eb255670.jpg@160w_220h_1e_1c", "title": "肖申克的救赎", "actor": "蒂姆·罗宾斯,摩根·弗里曼,鲍勃·冈顿", "time": "1994-10-14(美国)", "score": "9.5"}
{"index": "3", "image": "http://p0.meituan.net/movie/54617769d96807e4d81804284ffe2a27239007.jpg@160w_220h_1e_1c", "title": "罗马假日", "actor": "格利高里·派克,奥黛丽·赫本,埃迪·艾伯特", "time": "1953-09-02(美国)", "score": "9.1"}
{"index": "4", "image": "http://p0.meituan.net/movie/e55ec5d18ccc83ba7db68caae54f165f95924.jpg@160w_220h_1e_1c", "title": "这个杀手不太冷", "actor": "让·雷诺,加里·奥德曼,娜塔莉·波特曼", "time": "1994-09-14(法国)", "score": "9.5"}
{"index": "5", "image": "http://p1.meituan.net/movie/f5a924f362f050881f2b8f82e852747c118515.jpg@160w_220h_1e_1c", "title": "教父", "actor": "马龙·白兰度,阿尔·帕西诺,詹姆斯·肯恩", "time": "1972-03-24(美国)", "score": "9.3"}

至此TOP100的电影信息全部得到了。

由于还没学到多线程爬取,暂不展示多线程代码以及效果。

完事。。。


快去下方评论吧~~

 评论



博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议

本站使用 Material-x 作为主题 , 总访问量为 次 。
载入天数...载入时分秒...