使用多线程抓取80s的电影列表和电影的豆瓣评分
# -*- coding: utf-8 -*-
# File : 用resquests爬取80s电影列表.py
# Author: HuXianyong
# Date : 2018-09-10 17:33
import json
import re
import requests
from multiprocessing import Pool
import time
#定义一个电影个数的索引
index = 1
#定义一个获取单页源码的函数
def get_one_page(url):
try:
response = requests.get(url)
if response.status_code == 200:
return response.text
return None
except Exception:
return None
#把电影信息写到文件里面去
def write_to_file(items):
with open('80s_move_list.txt',"a",encoding="utf-8") as f:
f.write(json.dumps(items,ensure_ascii=False)+'\n')
#json.dumps 序列化时对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False
f.close()
#定义一个获取电影名和评分的函数
def parse_one_page(html):
#正则匹配电影的名字和豆瓣评分数
pattern = re.compile(r'<a href="/movie/\d+" title="(.*?)">.*?<a href="/movie/\d+">(.*?)</a></h3>', re.S)
items = re.findall(pattern, html)
recevie_data(items)
#把获取到的电影信息存到字典里面
def recevie_data(items):
global index
for item in items:
#print(index,item[1].strip(),item[0].split(" ")[2])
dic = {
"index":index,
"move_name" : item[1].strip(),
"move_score": item[0].split(" ")[2]
}
write_to_file(dic)
index +=1
#传入电影的页数获取电影源码
def main(page_num):
url = 'https://www.80s.tw/movie/list/-----p/'+str(page_num)
html = get_one_page(url)
parse_one_page(html)
if __name__ == "__main__":
##普通的抓取方式
# start_time = time.time()
# for num in range(1,11):
#
# main(num)
# finish_time = time.time()
# use_time = finish_time - start_time
# print(use_time)
# print('*'*60)
#多线程抓取方式
start_time = time.time()
pool = Pool()
pool.map(main,[i for i in range(1,11)])
finish_time = time.time()
use_time = finish_time - start_time
print(use_time)
第一个是不使用多线程的,第二个是使用多线程的时间,
结果如下:
转载于:https://blog.51cto.com/853056088/2174096