python web抓取使用多处理和列表理解非常慢(python webscra

【问题描述】:

我正在尝试使用 bs4 抓取网站。但是代码非常非常慢,因为有很多trs要一一获取。

我尝试了循环,但是抓取3000 tr(1000行)需要3多分钟:

ROWS = []
#soup.select('tr[id^=mix]') is a list of html elements
for tr in soup.select('tr[id^=mix]'): 
    dt = tr.select_one('.h').text 
    H_team = tr.select_one('td.Home').text.strip()
    A_team = tr.select_one('td.Away').text.strip()
    #....
    row = [dt, H_team, A_team, ...]    

图片[1]-python web抓取使用多处理和列表理解非常慢(python webscra-唐朝资源网

ROWS.append(row) print(row)

我试过 List ,但它并没有改变速度(甚至更慢):

def my_funct(tr):
    dt = tr.select_one('.h').text 
    H_team = tr.select_one('td.Home').text.strip()
    A_team = tr.select_one('td.Away').text.strip()
        
    row = [dt, H_team, A_team]    

    return row 
ROWS = [my_funct(tr) for tr in soup.select('tr[id^=mix]')]

模块试过了,速度还是一样的

from multiprocessing.dummy import Pool as ThreadPool
def my_funct(tr):
    dt = tr.select_one('.h').text 
    H_team = tr.select_one('td.Home').text.strip()

    A_team = tr.select_one('td.Away').text.strip()
        
    row = [dt, H_team, A_team]    
    return row 
pool = ThreadPool(4)
ROWS = pool.map(my_funct, soup.select('tr[id^=mix]'))
pool.close()
pool.join()

我试过了,但没用(返回错误)

import asyncio
async def my_funct(tr):
    dt = tr.select_one('.h').text 
    H_team = tr.select_one('td.Home').text.strip()
    A_team = tr.select_one('td.Away').text.strip()
        
    row = [dt, H_team, A_team]    

图片[2]-python web抓取使用多处理和列表理解非常慢(python webscra-唐朝资源网

return row async def s(): await asyncio.gather(*[my_funct(tr) for tr in soup.select('tr[id^=Today]')]) asyncio.run(s()) #return error: "RuntimeError: asyncio.run() cannot be called from a running event loop"

如何并行运行获取行,这样我的代码不会花费很长时间来逐一处理每一行?

【讨论】:

© 版权声明
THE END
喜欢就支持一下吧
点赞82赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容