python - 抓取数千个网址
问题描述
我有一个抓取 url 列表的功能,200k url,花了很多时间,有没有办法加快这个过程?
def get_odds(ids):
headers = {"Referer": "https://www.betexplorer.com",
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'}
s = requests.Session()
matches=[]
for id in ids:
url = f'https://www.betexplorer.com{id}'
response = s.get(url, headers=headers)
soup = BeautifulSoup(response.text,'html.parser')
season = url.split('/')[5]
"do stuff.."
ids 是一个list
['/soccer/england/premier-league/brentford-norwich/vyLXXRcE/'
...]
解决方案
是的,您可以使用多处理。
就像是:
from multiprocessing import Pool
if __name__ == "__main__":
threads = 10 # The number of concurrent requests
p = Pool(threads)
p.map(get_odds, ids)
p.terminate()
其中 ids 是 id 列表,而 get_odds 是您提供的函数,但已修改为仅对其中一个 id 进行操作。请记住,您一次将向他们的服务器发送 10 个请求,这可能导致临时 IP 阻塞(因为您被视为敌对)。您应该注意这一点并调整池大小或添加 sleep() 逻辑。
获取赔率函数应该是这样的:
def get_odds(id):
headers = {"Referer": "https://www.betexplorer.com",
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'}
s = requests.Session()
matches=[]
url = f'https://www.betexplorer.com{id}'
response = s.get(url, headers=headers)
soup = BeautifulSoup(response.text,'html.parser')
season = url.split('/')[5]
"do stuff.."
推荐阅读
- javascript - 如何获取数组中的周围对象?
- javascript - Vanilla JavaScript 搜索 - 如何仅在单击按钮时显示结果?
- reactjs - 如何在本机反应中再次将用户带到路线。我想在按钮单击时完全刷新屏幕
- python - 我的模型在恢复后预测不同
- python - Django 表单未在 html 页面中呈现
- javascript - 数据表日期范围过滤器,但是,我想删除分页,并可能添加或删除一些其他功能
- python-3.x - FileField / ImageField 迁移不适用
- android - 如何等到我的 Android 应用程序中的协程作用域执行完成?
- javascript - 我如何在css中曲线到进度条
- python - re.sub 多次替换两个特定字符之间的子字符串