在做爬虫项目的时候,想要提高相应的爬取效率,多线程爬虫是避免不了的。
下面,跟着小编直接进入主题,代码如下:
import requests
from threading import Thread
import random
from queue import Queue
import time
# 目标keyword
keyword_list = ['ring', 'rings for women', 'box', 'book', 'toy']
ua = ['Mozilla/5.0 (Windows NT 6.1; rv,2.0.1) Gecko/20100101 Firefox/4.0.1',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36']
headers = {'User-Agent': random.choice(ua),
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'accept-encoding': 'gzip, deflate, br'}
def get_url(in_q):
for keyword in keyword_list:
for page in range(1, 8):
url = 'https://www.amazon.com/s?k=' + keyword.replace(' ', '+') + '&page=' + str(page)
in_q.put(url)
# print(in_q.queue)
def get_data(out_q):
while 1:
if out_q.empty() is False:
url = out_q.get()
print(url)
else:
break
if __name__ == '__main__':
start = time.time()
q = Queue(maxsize=10) # 实例化队列,最大10个元素
p1 = Thread(target=get_url, args=(q,))
p1.start()
# 创建5个线程
for i in range(5):
p2 = Thread(target=get_data, args=(q,))
p2.start()
p2.join()
p1.join()
end = time.time()
print('spider_task over :%.2f' % (end - start))
这里用到了队列和线程的方法,可以让爬虫项目更加清晰明了,函数A负责生成url,函数B负责消费url。有过爬虫经验的同学,应该都能明白,这样的爬虫初始思路搭建好之后,我们只需将爬虫代码放入到函数B就行。
最后补充一点,在尾部,我们可以根据需求,来自由设定线程的数量(这里用for循环去实现的),爬虫代码这里就不细说了,有兴趣的朋友可以私信我。
运行之后,结果如下(这里由于请求量过少,时间上可以忽略不计):
如果喜欢本文或者本文对你有帮助的话,记得关注小编并点个赞哟,欢迎留言私信。
python爬虫进阶之多线程爬虫——生产者和消费者



