当前位置:   article > 正文

python之多进程和多协成爬虫_多进程爬取获得的列表合并起来

多进程爬取获得的列表合并起来

——在学完多线程爬虫之后,我们多多少少了解了一些关于提升爬虫速度的方法。接下来我们学习的另外一种方法多进程爬虫。之前我学习的多线程方法来说是基于GIL虽然说速度有了明显的提升,但是对CPU的资源利用没有充分;然而,多进程是利用CPU核数进行的进行的操作,这需要用python中的muiltprocessing这个库。

1、使用mulitProcessing的多进程爬虫
++++一般情况下,我们写这种多进程的爬虫时,需要先获取相应的电脑的CPU核心数,以防止使用核心过多导致电脑死机。

代码如下:

from multiprocessing import Process,Queue
import requests
import time

link_list = []
with open('url.txt','r') as file:
    file_list = file.readlines()
    for each in file_list:
        link = each.split('\t')[1]
        link = link.replace('\n','')
        link_list.append(link)

start = time.time()
class MyProcess(Process):
    def __init__(self,q):
        Process.__init__(self)
        self.q = q
    def run(self):
        print('Starting ',self.pid)
        while not self.q.empty():
            crawler(self.q)
        print('Exiting ',self.pid)
def crawler(q):
    url = q.get(timeout=2)
    try:
        r = requests.get(url,timeout=20)
        print(q.qsize(),r.status_code,url)
    except Exception as e:
        print(q.qsize(),url,'Error: ',e)

if __name__ == '__main__':
    ProcessName = ["Process-1","Process-2","Process-3"]
    workQueue = Queue(300)
    for url  in link_list:
        workQueue.put(url)
    for i in range(4):
        p = MyProcess(workQueue)
        p.daemon = True
        p.start()
        p.join()

    end = time.time()
    print("Process+Queue多线程爬虫总的时间:",end-start)
    print("Exiting Main Thread!")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

*注意:

p.daemon = True
  • 1

这句代码的意思就是当所有的父进程关闭时,字进程就会被关闭。
2、使用pool+Queue的多进程爬虫
++++当被操作的对象数目不大时,可以利用Process+Queue类的方法来实现这一操作,但是操作对象如果过多,上百个、上千个等等时,手动的限制进程数就太过繁琐,此时可以使用Pool发挥进程池的功效。
++++Pool可以提供指定数量的进程供用户来使用。当有了新的请求提交到pool中,如果池还没有满,就会创建一个新的进程用来执行该请求;但是如果池中的进程已经达到规定的最大值,请求就会继续等待,知道池中的有进程结束才能够创建新的进程。
++++现在我们使用非阻塞的方法和Queue获取网页数据,代码如下:

from multiprocessing import Pool,Manager
import requests
import time

link_list = []
with open('url.txt','r') as file:
    file_list = file.readlines()
    for each in file_list:
        link = each.split('\t')[1]
        link = link.replace('\n','')
        link_list.append(link)

start = time.time()
def crawler(q,index):
    Process_id = 'Process-' + str(index)
    while not q.empty():
        url = q.get(timeout=2)
        try:
            r = requests.get(url,timeout=20)
            print(Process_id,q.qsize(),r.status_code,url)
        except Exception as e:
            print(Process_id,q.qsize(),url,'Error: ',e)

if __name__ == '__main__':
    managers = Manager()
    workQueue = managers.Queue(300)
    for url  in link_list:
        workQueue.put(url)
    pool = Pool(processes=3)
    for i in range(4):
        pool.apply_async(crawler,args=(workQueue,i))
    pool.close()
    pool.join()

    end = time.time()
    print("Pool+Queue多线程爬虫总的时间:",end-start)
    print("Exiting Main Thread!")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

代码下载地址:点击这里

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/189700
推荐阅读
相关标签
  

闽ICP备14008679号