使用多线程抓取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)

image.png

第一个是不使用多线程的,第二个是使用多线程的时间,

结果如下:

image.png