【问题标题】:Is there a way to delay my web scraper before it scrapes the page?有没有办法在抓取页面之前延迟我的网络抓取工具?
【发布时间】:2021-10-19 18:33:43
【问题描述】:

这是我的功能:

def clubList(url,yearCode):
    print(url + "/clubs" + yearCode)
    response = requests.get(url + "/clubs" + yearCode)
    time.sleep(10)
    content = response.content
    soup = BeautifulSoup(content, "html.parser")
    cluburl = []
    clubs = []
    ul = soup.find_all(
        "ul",
        attrs={
            "class": "block-list-5 block-list-3-m block-list-1-s block-list-1-xs block-list-padding dataContainer"
        },
    )
    u = str(ul)
    soup2 = BeautifulSoup(u, "html.parser")
    for i, tags in enumerate(soup2.find_all("a")):
        cluburl.append(url + str(tags.get("href")))
    for i in range(0, len(cluburl)):
        cluburl[i] = cluburl[i].replace("overview", "squad")
    return cluburl

我正在尝试爬取英超联赛网站为数据分析项目构建统计数据库。

我当前的链接树看起来像:

https://www.premierleague.com -> https://www.premierleague.com/clubs -> https://www.premierleague.com/clubs?se=418

“?se=418”是我添加到链接中的访问代码,用于指定我想查看哪个赛季的统计数据,每个赛季都有自己的唯一代码。

我将“https://www.premierleague.com”作为 url 和“?se=418”作为 yearCode 传递给我的函数,它应该返回指向该特定赛季各个俱乐部页面的链接列表。 但是,它总是返回当前赛季的俱乐部链接列表。

我注意到,当我直接访问链接 https://www.premierleague.com/clubs?se=418 时,它首先会加载当前赛季的俱乐部,然后会在相应的俱乐部中动态刷新。

所以我认为添加时间延迟可能会解决问题,但我猜它正在解析 requests.get 语句中的页面内容,我不确定我应该在哪里添加延迟以使其正常工作。

这里还有您必须导入才能运行该功能的所有模块:

import requests
from bs4 import BeautifulSoup
import pandas as pd
import locale
import time

locale.setlocale(locale.LC_ALL, "en_US.UTF8")

【问题讨论】:

  • 动态刷新暗示了javascript。您可以在第一次通话后使用for _ in range(2)time.sleep(3) 重试通话。如果没有更新,那么您可能需要像 selenium 这样的东西来通过浏览器呈现 javascript
  • @C.Nivs @C.Nivs 我尝试像这样修改语句:for i in range(3):response = requests.get(url + "/clubs" + yearCode)time.sleep(3)i+=1 ,但这没有用,我不确定这是否是什么你的意思是。如果我的编辑向您发送了通知,我也很抱歉,我是新手在这里制作 cmets 和帖子,而不仅仅是谷歌搜索并立即在这里找到我的答案
  • 听起来 selenium 将成为方式,您需要一个浏览器来呈现和刷新 javascript。 To the docs!
  • @C.Nivs 好的,所以我尝试使用 selenium 实现修复 wd.get(link) wd.implicitly_wait(10) content =wd.page_source 这与我之前的想法相同,但我仍然得到相同输出。你能指导我正确的方向吗?
  • 它应该返回指向该特定赛季各个俱乐部页面的链接列表。 - 我没有看到任何提供此类数据的链接。所有俱乐部链接都显示当前赛季数据。你能详细说明一下吗?一个示例 URL 就可以了。

标签: python html web-scraping beautifulsoup


【解决方案1】:

当您执行季节过滤器时,它使用以下 API:

GET https://footballapi.pulselive.com/football/teams

它需要以下http头来返回数据:account: premierleagueorigin: https://www.premierleague.com

以下示例使用API​​获取俱乐部列表,然后提取俱乐部id和俱乐部名称生成俱乐部url:

import requests

season = 418

r = requests.get("https://footballapi.pulselive.com/football/teams", 
    params = {
        "pageSize": 100,
        "compSeasons": season,
        "compCodeForActivePlayer": "null",
        "comps": 1,
        "altIds": "true",
        "page": 0
    },
    headers = {
        "account": "premierleague",
        "origin": "https://www.premierleague.com"
    }
)

data = r.json()
print([
    f'https://www.premierleague.com/clubs/{int(t["club"]["id"])}/{t["club"]["name"].replace(" ","-")}/squad'
    for t in data["content"]
])

【讨论】:

  • 非常感谢,这非常有效。
  • 能否请您将我链接到此处使用的 api 的更多文档,我尝试使用谷歌搜索它,但它引导我使用付费服务,我还需要在单个小队上使用过滤器选项以获得正确的团队。所以我可能需要获取不同的链接并传递不同的参数
  • @ManishAG 我没有在文档中找到它。我只是在 Chrome 开发控制台的网络选项卡中查看了 http 调用
猜你喜欢
  • 2022-12-20
  • 2011-08-03
  • 2017-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-07
  • 1970-01-01
  • 2019-03-25
相关资源
最近更新 更多