前言
这一篇我们利用多线程从猫眼电影Top100爬取数据。
多线程可以大大的提高我们爬虫的爬取速度,类似的提速方式有
- 多线程
- 进程
- 协程
准备工作
需要引入的包
import requests
import threading
import parsel
import time
import openpyxl
网页分析
其中每一部电影的信息都存在dd标签内,循环遍历dd标签可以得到对应电影的具体信息。
控制分页的参数是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()