前言

这一篇我们利用多线程从猫眼电影Top100爬取数据。

多线程可以大大的提高我们爬虫的爬取速度,类似的提速方式有

  • 多线程
  • 进程
  • 协程

准备工作

需要引入的包

import requests
import threading
import parsel
import time
import openpyxl

网页分析

其中每一部电影的信息都存在dd标签内,循环遍历dd标签可以得到对应电影的具体信息。

img

控制分页的参数是offset。

其中第一页是offset=0,第二页是offset=10…第10页是offset=90。

for i in range(0, 100, 10)

代码实现

import requests
import threading
import parsel
import time
import openpyxl


def url_get(ws, page):
    url = 'https://maoyan.com/board/4?offset=' + str(page)
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36"
    }
    response = requests.get(url, headers=headers)

    sel = parsel.Selector(response.text)
    # css选择器 先取dd标签
    dds = sel.css('dd')
    # 遍历dd标签
    for dd in dds:
        name_sel = dd.css('p.name a::text').getall()[0]
        # strip去空格
        star_sel = dd.css('p.star::text').getall()[0].strip()
        time_sel = dd.css('p.releasetime::text').getall()[0]
        # 拼接
        score_sel = ''.join(dd.css('p.score i::text').getall())
        data = [
            name_sel,
            star_sel,
            time_sel,
            score_sel
        ]
        ws.append(data)


def url_start():
    start_time = time.time()
    # 创建工作簿
    wb = openpyxl.Workbook()
    # 创建工作表
    ws = wb.active
    ws.title = '猫眼数据'
    # 表头
    ws.append(['电影', '主演', '上映时间', '评分'])
    for i in range(0, 100, 10):
        # 多线程,同时请求十页
        # target目标方法 args元祖参数 如果一个元祖需要在后边加 ,
        threading.Thread(target=url_get, args=(ws, i)).start()
        # url_get(ws, i)
    # 线程数11 因为有一个主线程
    print('线程数{}'.format(len(threading.enumerate())))
    # 计算真实消耗时间
    while len(threading.enumerate()) > 1:
        pass
    wb.save('cat_data.xlsx')
    end_time = time.time()
    print("消耗时间:%s秒" % (end_time - start_time))


url_start()

一个可爱的人