《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删了就一直在。