【问题描述】:
我正在尝试使用 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, ...]
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]
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"
如何并行运行获取行,这样我的代码不会花费很长时间来逐一处理每一行?
【讨论】:
© 版权声明
本站下载的源码均来自公开网络收集转发二次开发而来,
若侵犯了您的合法权益,请来信通知我们1413333033@qq.com,
我们会及时删除,给您带来的不便,我们深表歉意。
下载用户仅供学习交流,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担,访问及下载者下载默认同意本站声明的免责申明,请合理使用切勿商用。
THE END
暂无评论内容