多线程爬虫的实现----threading库的使用

143 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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遍历,这样就会造成混乱,因此在实现时添加可以添加控制单个线程爬虫的抓取数量