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!")

*注意:

p.daemon = True

这句代码的意思就是当所有的父进程关闭时,字进程就会被关闭。
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!")

代码下载地址:点击这里

猜你喜欢

转载自blog.csdn.net/qq_35490191/article/details/79963459
今日推荐