所以我认为这会很复杂...希望有人能接受挑战。
基本上,我尝试访问特定URL上的所有HREF标记,然后将它们的"profile-box"类打印到GoogleSheet中。
我有一个工作示例,它有一个不同的链接,下面的代码将访问每个URL,访问播放器链接,然后返回它们的相关数据:
import requests
from bs4 import BeautifulSoup
import gspread
gc = gspread.service_account(filename='creds.json')
sh = gc.open_by_key('1DpasSS8yC1UX6WqAbkQ515BwEEjdDL-x74T0eTW8hLM')
worksheet = sh.get_worksheet(3)
# AddValue = ["Test", 25, "Test2"]
# worksheet.insert_row(AddValue, 3)
def get_links(url):
data = []
req_url = requests.get(url)
soup = BeautifulSoup(req_url.content, "html.parser")
for td in soup.find_all('td', {'data-th': 'Player'}):
a_tag = td.a
name = a_tag.text
player_url = a_tag['href']
print(f"Getting {name}")
req_player_url = requests.get(
f"https://basketball.realgm.com{player_url}")
soup_player = BeautifulSoup(req_player_url.content, "html.parser")
div_profile_box = soup_player.find("div", class_="profile-box")
row = {"Name": name, "URL": player_url}
for p in div_profile_box.find_all("p"):
try:
key, value = p.get_text(strip=True).split(':', 1)
row[key.strip()] = value.strip()
except: # not all entries have values
pass
data.append(row)
return data
urls = [
'https://basketball.realgm.com/dleague/players/2022',
'https://basketball.realgm.com/dleague/players/2021',
'https://basketball.realgm.com/dleague/players/2020',
'https://basketball.realgm.com/dleague/players/2019',
'https://basketball.realgm.com/dleague/players/2018',
]
res = []
for url in urls:
print(f"Getting: {url}")
data = get_links(url)
res = [*res, *data]
if res != []:
header = list(res[0].keys())
values = [
header, *[[e[k] if e.get(k) else "" for k in header] for e in res]]
worksheet.append_rows(values, value_input_option="USER_ENTERED")
本代码的结果(正确):
其次,我有一个working代码,它接受一个单独的URL,循环遍历66个页面,并返回表数据:
import requests
import pandas as pd
url = 'https://basketball.realgm.com/international/stats/2023/Averages/Qualified/All/player/All/desc'
res = []
for count in range(1, 66):
# pd.read_html accepts a URL too so no need to make a separate request
df_list = pd.read_html(f"{url}/{count}")
res.append(df_list[-1])
pd.concat(res).to_csv('my data.csv')
这将从URL返回表数据,并且运行良好:
所以...这就引出了我现在的问题
我尝试使用相同的链接(https://basketball.realgm.com/international/stats/2023/Averages/Qualified/All/player/All/desc),并重复与第一段代码相同的操作。
意思是,我想访问每个配置文件(在所有66或x页上),并像第一段代码中那样打印配置文件数据。
我想/希望,我可以用这个URL替换原来的D联赛URL,它会工作-它不会。我有点困惑为什么,因为表数据似乎是相同的设置?
我开始尝试重新编写代码,但是很吃力。我有非常基本的代码,但是我认为我在倒退:
import requests
from bs4 import BeautifulSoup
url = "https://basketball.realgm.com/international/stats/2023/Averages/Qualified/All/player/All/desc"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
for link in soup.find_all("a"):
profile_url = link.get("href")
profile_response = requests.get(profile_url)
profile_soup = BeautifulSoup(profile_response.text, "html.parser")
profile_box = profile_soup.find("div", class_="profileBox")
if profile_box:
print(profile_box)
对此有什么想法吗?就像我说的,最终试图重新创建与第一个脚本相同的操作,只是针对第二个URL。
先谢了。
1条答案
按热度按时间bgibtngc1#
实际上,您可以使用第一个示例中使用的大部分代码,只是对第一个
find_all
循环做了一点修改。您可以使用css
selector
来选择所有包含nowrap
类的表格单元格,然后测试该单元格是否具有从属链接。然后从那里开始,函数的其余部分应该和以前一样工作。下面是一个例子:
输出: