【发布时间】: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