1、requests + 正则表达式 获取 ‘猫眼电影top100’。
使用 进程池Pool 提高速度。(问题:使用进程池数据有缺少,待解决中)
1 import requests 2 from requests.exceptions import RequestException 3 import re 4 import json 5 from multiprocessing import Pool 6 7 8 """获取猫眼电影Top100的数据""" 9 # 获取单页数据信息; 10 def get_one_page(url, headers): 11 try: 12 response = requests.get(url, headers=headers) 13 if response.status_code == 200: 14 return response.text 15 return None 16 except RequestException: 17 return None 18 19 # 使用正则表达式解析数据; 20 def parse_one_page(html): 21 pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a.*?>' 22 +'(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>.*?integer">' 23 +'(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>', re.S) 24 items = re.findall(pattern, html) 25 # 将获取的数据以字典形式返回; 26 for item in items: 27 yield { 28 'index': item[0], 29 'image': item[1], 30 'title': item[2], 31 'actor': item[3].strip()[3:], 32 'time': item[4].strip()[5:], 33 'score': item[5]+item[6] 34 } 35 36 # 将字典转换为字符串保存, 37 def write_to_file(content): 38 with open('result.txt', 'a',encoding="utf8") as f: 39 f.write(json.dumps(content, ensure_ascii=False) + "\n") 40 f.close() 41 42 # 传入爬取链接,运行函数; 43 def main(offset): 44 url = "https://maoyan.com/board/4?offset=" + str(offset) 45 headers = { 46 "User-Agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36" 47 } 48 html = get_one_page(url, headers=headers) 49 for item in parse_one_page(html): 50 write_to_file(item) 51 52 if __name__ == '__main__': 53 # for i in range(10): 54 # main(i*10) 55 # 使用 进程池 提高爬取速度; 56 # 将数组中的每个元素提取出来当作函数的参数,创建一个个进程,放进进程池中; 57 # 第一个参数是函数,第二个参数是迭代器,将迭代器中的数字作为参数依次传入函数中; 58 Pool = Pool() 59 Pool.map(main, [i*10 for i in range(5)])