开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第23天,点击查看活动详情
之前的文章中分享了python爬虫开发中的scrapy框架的使用,由于scrapy框架各个部分的中间件执行不同的功能,因此能够显著的提升爬虫的抓取效率,但是数据量大时,使用scrapy框架开发爬虫,虽然单个爬虫的抓取速度快了很多,但是总的时间还是要耗费很久。有没有一种情况就是同一时间内将同一个爬虫程序执行N次,那样就可以大大的缩短爬取的时间,因此就有了多线程爬虫的出现。今天就分享一下使用python中的threading库来实现多线程爬虫
1.线程和进程
线程和进程的概念经常有人会分不清,线程的出现是为了降低内存的消耗,今天就举个例子帮助区分。以微信为例,电脑打开一个微信这个时候就开启了一个进程,而线程指的是微信中的一些功能例如转账,聊天等。
1.下面是我最近抓取某个平台的数据时用到的多线程实现过程:
from shop import ShopSpider
import threading
import time
def loop(num1,num2):
# 店铺数据抓取
shop_spider = ShopSpider()
shop_spider.login(num1)
shop_spider.shop_crawl(num2)
shop_spider.close_driver()
# 多线程开启数据抓取
def main(pools):
threads = []
list_t = []
for i in range(0, pools):
t = "t" + f"{i}"
list_t.append(t)
nloops = range(pools)
for i in nloops:
list_t[i] = threading.Thread(target=loop, args=(i,100))
# loop为目标函数名,args为目标函数参数
threads.append(list_t[i])
for i in nloops: # 开始线程
threads[i].start()
time.sleep(1)
for i in nloops: # 等待所有
threads[i].join() # 线程完成
if __name__ == "__main__":
main(2) # main中的参数决定线程数量
注:这里需要注意的是开启多线程一定要处理好内部的逻辑结构,不然就会出现混乱的情况,比如要使用循环的,第一个线程从0到100遍历,第二个同样的也从0到100遍历,这样就会造成混乱,因此在实现时添加可以添加控制单个线程爬虫的抓取数量