首页 > 解决方案 > 抓取数千个网址

问题描述

我有一个抓取 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/'
...]

标签: pythonweb-scrapingbeautifulsouppython-requests

解决方案


是的,您可以使用多处理。

就像是:

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.."

推荐阅读