首页 > 系统相关 >使用POOL+Queue的多进程爬虫

使用POOL+Queue的多进程爬虫

时间:2024-04-06 11:30:41浏览次数:25  
标签:args Pool 爬虫 阻塞 Queue link POOL pool

前面说的multiprocessing里面的Process动态生成多个进程,如果限制数量过大就繁琐了,现在就可以使用Pool进程的功效。

在使用Pool前,我们先了解一下阻塞和非阻塞两个概念。

阻塞和非阻塞关注的是程序在等待调用结果时的状态。阻塞要等到回调结果出来,在有结果之前,当前进程会被挂起。非阻塞为添加进程后,不一定非要等待结果出来就可以添加其它的进程。

我们现在开始使用Pool的非阻塞和Queue来获取网页数据:

import multiprocessing import pool,Manager
import time
import requests

link_list=[]
with open('eqwaak.txt','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)

strat=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__':
    manager=Manager()
    workQueue=manager.Queue(1000)
    
    for url in link_list:
        workQueue.put(url)
    pool=pool(prscesses=3)
    for i in range(4):
        pool.apply_async(crawler,args=(workQueue,i))
        
    print('started ')
    pool.close()
    pool.join()
    
    end=time.time()
    print('Pool+Queue多进程爬虫的时间:',end-strat)
    print('END')

如果我们要将线程池Pool和Queue结合起来,Queue就需要改变,用到前面multiprocessing里面的Manger,使用manger=Manger()和workQueue=manager.Queue(1000)来创建列表:

pool=Pool(processe=3)
for i in range(4):
         pool.apply_async(crawler,args=(workQueue,i))

上面我们使用的是非阻塞方法,换成阻塞也简单:将pool.apply_async(target=func,args=(args)改为pool.apply(target=func,args=(args))就好了。

标签:args,Pool,爬虫,阻塞,Queue,link,POOL,pool
From: https://blog.csdn.net/eqwaak0/article/details/137356979

相关文章

  • 用Rust反爬虫,这里有你要的教程和代码
    Everwantedtomesswithpeoplescanningthewebforvulnerabilities?Icertainlydid.ThisisthestoryhowIfoundawaytopunishthem,thenusedRusttoimproveit,andthenkilledmywebserverusingavan.有没有想过给那些总是利用网络漏洞搞爬虫的人添......
  • 【爬虫】项目篇-selenium爬取大鱼潮汐网
    爬取指定日期的潮汐数据创建driver对象,并设为最大窗口url="https://www.chaoxibiao.net/tides/75.html"option=Options()option.binary_location=r"C:\Users\txmmy\AppData\Local\Google\Chrome\Application\chrome.exe"drvier=webdriver.Chrome(options=option......
  • 【爬虫】项目篇-新东方六级听力音频
    importrequests,time,randomfromfake_useragentimportUserAgenturls=open(r'E:\01pycharmproject\网络爬虫技术\sjj1.txt',encoding='utf-8').read().split()i=1forurlinurls:headers={#'User-agent':'Mozilla/5......
  • 【爬虫】项目篇-使用selenium、requests爬取天猫商品评论
    目录使用selenium使用requests使用seleniumfromselenium.webdriverimportChrome,ChromeOptionsfromselenium.webdriver.support.waitimportWebDriverWaitfromselenium.webdriver.common.byimportByfromselenium.webdriver.supportimportexpected_conditionsasE......
  • 【爬虫】项目篇-爬取豆瓣电影周榜Top10,保存至Redis
    写法一:编写两个爬虫程序文件:爬虫1将豆瓣一周口碑榜的电影url添加到redis中名为movie_url的列表中(注意避免多次运行导致重复的问题);爬虫2从movie_url中读出网址,爬取每一部电影的导演、主演、类型、制片国家/地区、语言、上映日期、片长,并将它们保存到redis的hash表(自行命名)中。d......
  • 【爬虫】项目篇-在https://www.kanunu8.com/book2抓取电子书
    目录1)使用正则表达式2)使用bs41)使用正则表达式#使用requests库和正则表达式抓取在https://www.kanunu8.com/book3/任选的一本电子书importrequestsimportreimportosimporttimeheader={'user-agent':"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit......
  • 【爬虫】项目篇-豆瓣读书Top250(https://book.douban.com/top250)
    抓取豆瓣读书Top250(https://book.douban.com/top250)每本书的书名、作者、出版社、出版时间、价格、评分等数据,将结果分别保存为csv文件和excel文件importxlwtimportxlsxwriterimportreimportrequestsfromfake_useragentimportUserAgentimportcchardetimporttime......
  • 【爬虫】项目篇-爬取丁香园的疫情数据
    ```#编写程序,从丁香园获取国内近期疫情数据,按省份提取当前确诊数,#确诊总数,疑似病例数,治愈数,死亡数,高危数等数据,保存到csv文件或excel文件中。importrequestsimportxlsxwriterfromfake_useragentimportUserAgentimportcchardetimportreimportjsonfrombs4importBeautif......
  • 【爬虫】项目篇-爬取福州公交线路并保存至MongoDB
    #http://www.fz-bus.cn/index.asp#1)在MongoDB中创建一个数据库和一个集合。#2)在程序执行过程中可输入线路名称查询公交线路,#每查询到一条线路的信息后,查询MongoDB数据库中是否存在该线路。若存在,则不做任何操作,否则执行第3步。#将线路名称、起点和终点、途径站点、#冬季首......
  • AbstractQueuedSynchronizer源码分析
    在分析Java并发包java.util.concurrent源码的时候,少不了需要了解AbstractQueuedSynchronizer(以下简写AQS)这个抽象类,因为它是Java并发包的基础工具类,是实现ReentrantLock、CountDownLatch、Semaphore、FutureTask等类的基础。在分析Java并发包java.util.concurren......