python 爬虫加入线程池问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 爬虫加入线程池问题相关的知识,希望对你有一定的参考价值。

我写了个python爬虫,因为考虑到效率的问题,想加入线程池,就是将抓取到的100个URL加入到队列里,然后开启10个线程去队列里取URL同时处理URL对应的内容,应该怎么实现呢!大神求救啊!
就是我的爬虫是单线程的~怎么实现多线程想把第一步爬取的URL加入到队列后,创建多个线程去处理相关页面的抓取~
不会写了

参考技术A

大致思路就是下面了,如果这都看不懂,转行吧。

import threading
import Queue
class MyThread(threaing.Thread):
    def __init__(self, queue, name=None):
        self._queue = queue
        if name:
            self.name = name
        pass
    def run(self):
        while q.empty():
            pass

queue = Queue()
for i in xrange(100):
    queuq.put(i)
threads = []
for i in xrange(10):
    threads.append(MyThread(queue, str(i)))
for i in threads:
    i.start()

python爬虫之线程池和进程池

一、需求

  最近准备爬取某电商网站的数据,先不考虑代理、分布式,先说效率问题(当然你要是请求的太快就会被封掉,亲测,400个请求过去,服务器直接拒绝连接,心碎),步入正题。一般情况下小白的我们第一个想到的是for循环,这个可是单线程啊。那我们考虑for循环直接开他个5个线程,问题来了,如果有一个url请求还没有回来,后面的就干等,这么用多线程等于没用,到处贴创可贴。

二、性能考虑

  确定要用多线程或者多进程了,那我们到底是用多线程还是多进程,有些人对多进程和多线程有一定的偏见,就因为python的GIL锁,下面我们说一下这两个东西的差别。

三、多线程:

   一般情况下我们启动一个.py文件,就等于启动了一个进程,一个进程里面默认有一个线程工作,我们使用的多线程的意思就是在一个进程里面启用多个线程。但问题来了,为什么要使用多线程呢?我知道启动一个进程的时候需要创建一些内存空间,就相当于一间房子,我们要在这个房子里面干活,你可以想一个人就等于一个线程,你房子里面有10个人的空间跟有20个人的空间,正常情况下是不一样的,因为我们知道线程和线程之间默认是可以通信的(进程之间默认是不可以通信的,不过可以用技术实现,比如说管道)。可以多线程为了保证计算数据的正确性,所以出现了GIL锁,保证同一时间只能有一个线程在计算。GIL锁你可以基本理解为,比如在这个房间里要算一笔账,在同一时间内只能有一个人在算这笔账,想一个问题,如果这笔账5个人就能算清楚,我需要10平米的房间就行,那为什么要请10个人,花20平米呢?所以并不是开的线程越多越好。但是,但是,但是,注意大家不用去用脑筋(CPU计算)算这笔账的时候可以去干别的事,比如说算完后记录在账本上以便后面对账,这个的话每个人都有自己的账本,所以多线程适合IO操作,记住了就算是适合IO操作,也不代表说人越多越好,所以这个量还是得根据实际情况而定。

 

四、多进程:

 

 

总结:

 

以上是关于python 爬虫加入线程池问题的主要内容,如果未能解决你的问题,请参考以下文章

python异步爬虫:引入+线程池实战

python 多线程爬取网站数据利用线程池

python爬虫 threading 多线程 ThreadPoolExecutor线程池

Python爬虫基础讲解(十八):线程池的使用

python 线程池的使用

python中设置线程池最大数量不管用