前言

这一篇我们利用多线程从猫眼电影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()
Powered By Valine
v1.4.14

一个可爱的人