50 行代码教你爬取猫眼电影 TOP100 榜所有信息

涉及到基础爬虫架构中的HTML下载器、HTML解析器、数据存储器三大模块:

  • HTML下载器:利用requests模块下载HTML网页;
  • HTML解析器:利用re正则表达式解析出有效数据
  • 数据存储器:将有效数据通过文件或者数据库的形式存储起来

如果用yield,函数返回的就是一个生成器,而生成器作为一种特殊的迭代器,可以用for——in方法,一次一次的把yield拿出来;

注意:为了提高速度,我们引入Pool模块,用多线程并发抓取

 1 #!/usr/bin/env python  
 2 # -*- coding:utf-8 -*-
 3 """ 
 4 @author:BanShaoHuan
 5 @file: 50 行代码教你爬取猫眼电影 TOP100 榜所有信息.py 
 6 @time: 2018/04/24
 7 @contact: banshaohuan@163.com
 8 @site:  
 9 @software: PyCharm 
10 
11 # code is far away from bugs with the god animal protecting
12     I love animals. They taste delicious.
13               ┏┓      ┏┓
14             ┏┛┻━━━┛┻┓
15             ┃      ☃      ┃
16             ┃  ┳┛  ┗┳  ┃
17             ┃      ┻      ┃
18             ┗━┓      ┏━┛
19                 ┃      ┗━━━┓
20                 ┃  神兽保佑    ┣┓
21                 ┃  永无BUG!   ┏┛
22                 ┗┓┓┏━┳┓┏┛
23                   ┃┫┫  ┃┫┫
24                   ┗┻┛  ┗┻┛ 
25 """
26 
27 import requests
28 import re
29 from requests.exceptions import RequestException
30 import json
31 from multiprocessing import Pool
32 
33 headers = {'User-Agent': 'Mozilla/5.0'}
34 
35 
36 def get_one_page(url):
37     '''
38     构造HTML下载器
39     :param url: 网页URL
40     :return:    成功得到返回HTML文本,否则返回空
41     '''
42     try:
43         res = requests.get(url, headers=headers)
44         if res.status_code == 200:
45             return res.text
46         return None
47     except RequestException:
48         return None
49 
50 
51 def parse_one_page(html):
52     '''
53     构造HTML解析器
54     :param html:HTML文本
55     :return: 包含所有信息的字典
56     '''
57     pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a' + '.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>' + '.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>', re.S)
58     items = re.findall(pattern, html)
59     for item in items:
60         yield {
61             'index': item[0],
62             'image': item[1],
63             'title': item[2],
64             'actor': item[3].strip()[3:],
65             'time': item[4].strip()[5:],
66             'score': item[5] + item[6]
67         }
68 
69 def write_to_file(content):
70     '''
71     构造数据存储器
72     :param content:写入文件的内容
73     :return:None
74     '''
75     with open('result.txt', 'a', encoding='utf-8') as f:
76         f.write(json.dumps(content, ensure_ascii=False) + '\n')
77 
78 def main(offset):
79     '''
80     主函数
81     :param offset: 网页URL的偏移量
82     :return: None
83     '''
84     url = 'http://maoyan.com/board/4?offset=' + str(offset)
85     html = get_one_page(url)
86     for item in parse_one_page(html):
87         print(item)
88         write_to_file(item)
89 
90 if __name__ == '__main__':
91     p = Pool()
92     p.map(main, [i*10 for i in range(10)])

 

posted @ 2018-04-24 16:54  banshaohuan  阅读(257)  评论(0)    收藏  举报