赞
踩
《Python网络爬虫:从入门到实践》书中7.3.1节讲到,使用multiprocessing库的第一种方法,是Process+Queue 的多进程爬虫,还给出一个例子,发现有重大逻辑bug,经1天时间研究,将正确的代码公布出来,方便广大爱好者使用、参考。
以下代码同时统计了各个子进程爬取的页面数量,已经在Pycharm 5.0.3上测试通过,欢迎大家评论留言,有问题我看到后会及时回复,谢谢。
- from multiprocessing import Process, Queue, cpu_count
- import time
- import requests
-
- class MyProcess(Process):
- def __init__(self, q,amount=0):
- Process.__init__(self)
- self.q = q
- self.amount = amount
-
- def run(self):
- times = 0
- print ("Starting " , self.pid)
- while not self.q.empty():
- times += 1
- crawler(self.q)
- self.amount = times
- print ("pid为",self.pid,"的子进程尝试连接的页面数量是:",self.amount)
- 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)
-
- # 保证当前的.py文件直接运行,也能保证其可以作为模块被其他.py文件导入
- if __name__ == '__main__':
- # 文件中提取出的保存所有 URL 的列表
- link_list = []
- # 进程名称列表
- ProcessNames = []
- # 进程对象列表
- processes = []
- # CPU 核心数量
- count = cpu_count()
- print("CPU 核心数量是:",count)
- for cpu_num in range(1,count):
- ProcessNames.append("Process-" + str(cpu_num))
- # 创建一个容量为1000的 FIFO 队列对象
- workQueue = Queue(1000)
- f_path = r'D:\File_Book_Course\《Python 网络爬虫:从入门到实践》\第二版\Cha 8 -提升爬虫的速度\alexa.txt'
- with open(f_path, 'r') as file:
- file_list = file.readlines()
- for eachone in file_list:
- link = eachone.split('\t')[1]
- link = link.replace('\n','')
- link_list.append(link)
- start = time.time()
-
- # 填充队列
- for url in link_list:
- workQueue.put(url)
- # 各核 cpu 开始工作
- for i in range(0, count):
- processes.append(MyProcess(workQueue))
- processes[i].start()
-
- # 等所有进程结束
- for n in range(0,count):
- processes[n].join()
-
- end = time.time()
- print ('Process + Queue 多进程爬虫的总时间为:', end-start)
- print ('父进程结束!')
以下是爬取结果截图:
测试文件可以到我的资源中下载,只要不被csdn删了就一直在。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。