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

《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 ('父进程结束!')

以下是爬取结果截图:

multiprocessing 使用 Process+Queue 的多进程爬虫示例_第1张图片

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

你可能感兴趣的:(数据存储,爬虫程序,Python)