赞
踩
——在学完多线程爬虫之后,我们多多少少了解了一些关于提升爬虫速度的方法。接下来我们学习的另外一种方法多进程爬虫。之前我学习的多线程方法来说是基于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!")
代码下载地址:点击这里
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。