当前位置:   article > 正文

multiprocessing 使用 Process+Queue 的多进程爬虫示例_multiprocessing process+queue

multiprocessing process+queue

《Python网络爬虫:从入门到实践》书中7.3.1节讲到,使用multiprocessing库的第一种方法,是Process+Queue 的多进程爬虫,还给出一个例子,发现有重大逻辑bug,经1天时间研究,将正确的代码公布出来,方便广大爱好者使用、参考。

以下代码同时统计了各个子进程爬取的页面数量,已经在Pycharm 5.0.3上测试通过,欢迎大家评论留言,有问题我看到后会及时回复,谢谢。

  1. from multiprocessing import Process, Queue, cpu_count
  2. import time
  3. import requests
  4. class MyProcess(Process):
  5. def __init__(self, q,amount=0):
  6. Process.__init__(self)
  7. self.q = q
  8. self.amount = amount
  9. def run(self):
  10. times = 0
  11. print ("Starting " , self.pid)
  12. while not self.q.empty():
  13. times += 1
  14. crawler(self.q)
  15. self.amount = times
  16. print ("pid为",self.pid,"的子进程尝试连接的页面数量是:",self.amount)
  17. print ("Exiting " , self.pid)
  18. def crawler(q):
  19. url = q.get(timeout=2)
  20. try:
  21. r = requests.get(url, timeout=20)
  22. print (q.qsize(), r.status_code, url)
  23. except Exception as e:
  24. print (q.qsize(), url, 'Error: ', e)
  25. # 保证当前的.py文件直接运行,也能保证其可以作为模块被其他.py文件导入
  26. if __name__ == '__main__':
  27. # 文件中提取出的保存所有 URL 的列表
  28. link_list = []
  29. # 进程名称列表
  30. ProcessNames = []
  31. # 进程对象列表
  32. processes = []
  33. # CPU 核心数量
  34. count = cpu_count()
  35. print("CPU 核心数量是:",count)
  36. for cpu_num in range(1,count):
  37. ProcessNames.append("Process-" + str(cpu_num))
  38. # 创建一个容量为1000的 FIFO 队列对象
  39. workQueue = Queue(1000)
  40. f_path = r'D:\File_Book_Course\《Python 网络爬虫:从入门到实践》\第二版\Cha 8 -提升爬虫的速度\alexa.txt'
  41. with open(f_path, 'r') as file:
  42. file_list = file.readlines()
  43. for eachone in file_list:
  44. link = eachone.split('\t')[1]
  45. link = link.replace('\n','')
  46. link_list.append(link)
  47. start = time.time()
  48. # 填充队列
  49. for url in link_list:
  50. workQueue.put(url)
  51. # 各核 cpu 开始工作
  52. for i in range(0, count):
  53. processes.append(MyProcess(workQueue))
  54. processes[i].start()
  55. # 等所有进程结束
  56. for n in range(0,count):
  57. processes[n].join()
  58. end = time.time()
  59. print ('Process + Queue 多进程爬虫的总时间为:', end-start)
  60. print ('父进程结束!')

以下是爬取结果截图:

测试文件可以到我的资源中下载,只要不被csdn删了就一直在。

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

闽ICP备14008679号