Python Gevent池似乎没有改善性能

Python Gevent池似乎没有改善性能,python,asynchronous,web-scraping,gevent,Python,Asynchronous,Web Scraping,Gevent,我有一个包含900万个http链接的列表,它们存储在lt 对于最低限度的再现性: 这是我最初写的 cat = [] i=0 for l in lt: print(i) if re.search('.+videoStory.+', l): print('video') cat.append('video') else: response=requests.get(l,headers = { 'User-Agent': 'Moz

我有一个包含900万个http链接的列表,它们存储在
lt

对于最低限度的再现性:

这是我最初写的

cat = []
i=0
for l in lt:
    print(i)
    if re.search('.+videoStory.+', l):
        print('video')
        cat.append('video')
    else:
        response=requests.get(l,headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36', })
        if response.status_code == 200:
            bs = BeautifulSoup(response.content.decode('ascii', 'ignore'),'lxml')
            cat.append(bs.findAll('div', {'class':'ArticleHeader_channel_4KD-f'})[0].text)
        elif response.status_code == 404:
            print('404')
            cat.append('404')
        elif response.status_code == 500:
            print('500')
            cat.append('500')
        else:
            print(response.status_code)
            break
    i+=1
bs.findAll('div',{'class':'ArticleHeader_channel_4KD-f'})[0]。text
提取页面的类别

这段代码在1秒内成功地完成了3个链接,这意味着获得900万个链接需要34.7天(通过仅获取5000个链接进行测试需要27分钟左右)

此代码在1秒内成功完成5个链接,这意味着获得900万个链接需要20.8天(通过仅获取5000个链接进行测试需要16分钟左右)

这要花很长时间

应该尝试将
并发性设置为
10000
,这会有帮助吗?(也许路透社不允许这么多并发)


我应该尝试并行处理吗

根据这些信息,您应该能够运行代码的多个实例,这些实例从列表中的不同位置开始

假设您运行了5个代码实例,每个实例负责浏览5000个链接。因此,在一次运行中,您覆盖了25000个链接。你大概需要30分钟

比如说,实例#1为链接1-5000运行,当其列表用尽时,它应该从第250001个链接开始。因此,对于每一个实例,您都必须迭代它以从
运行,其中\u it\u离开+25000
th链接

让我们看看这里的数学。简单的例子:
5000000链接/25000=200次运行。
200*0.5小时=100小时(~4-5天)

如果一次可以运行5个以上的代码实例,甚至可以进一步减少这种情况

另一个更好的方法是使用一些网页抓取软件,如HTTrack。但是,您可能需要在it中进行大量配置才能根据需要获得结果

p = pool.Pool(1000)
yo= []
jobs=[]

def get_link(ul):
    if re.search('.+videoStory.+', ul):
        yo.append('video')
    else:
        r = requests.get(ul, headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36', })
        if r.status_code == 200:
            bs = BeautifulSoup(r.content.decode('ascii', 'ignore'),'lxml')
            crap = bs.findAll('div', {'class':'ArticleHeader_channel_4KD-f'})[0].text
            yo.append(crap)
        elif r.status_code == 404:
    #        print('404')
            yo.append('404')
        elif r.status_code == 500:
    #        print('500')
            yo.append('500')

startTime= datetime.now() 
for yum in lt:
     jobs.append(p.apply_async(get_link, args =(yum,)))

gevent.joinall(jobs)
timeElapsed=datetime.now()-startTime 
print('Time elpased (hh:mm:ss.ms) {}'.format(timeElapsed))