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

浙公网安备 33010602011771号