【发布时间】:2020-01-04 01:09:38
【问题描述】:
我正在尝试在premier league player stats 中应用过滤器时复制请求。我注意到在为 2019/20 赛季应用过滤器时,该 url 添加了组件 '?co=1&se=274'
https://www.premierleague.com//players/5140/Virgil-van-Dijk/stats?co=1&se=274
而不是
https://www.premierleague.com//players/5140/Virgil-van-Dijk/stats
但是在做的时候
requests.get('https://www.premierleague.com//players/5140/Virgil-van-Dijk/stats?co=1&se=274')
并刮掉内容,就像没有应用过滤器一样被刮掉。如何在应用了网页过滤器的地方提出请求?
通过深入研究,我了解到它受 CloudFront 保护,这意味着在发布请求之前,所有查询参数都已被剥离。有没有办法解决这个问题?
这是我抓取数据的方式:
from bs4 import BeautifulSoup as soup
import requests
from tqdm import tqdm
from pprint import pprint
players_url =['https://www.premierleague.com//players/5140/Virgil-van-Dijk/stats?co=1&se=274']
# this is dict where we store all information:
players = {}
for i in tqdm(players_url):
player_page = requests.get(i)
cont = soup(player_page.content, 'lxml')
time.sleep(2)
data = dict((k.contents[0].strip(), v.get_text(strip=True)) for k, v in zip(cont.select('.topStat span.stat, .normalStat span.stat'), cont.select('.topStat span.stat > span, .normalStat span.stat > span')))
clud_ele = cont.find('div', attrs={'class' : 'info'})
club = {"Club" : clud_ele.get_text(strip=True)}
position = {"Position": clud_ele.find_next('div', attrs={'class' : 'info'}).get_text(strip=True)}
data.update(club)
data.update(position)
players[cont.select_one('.playerDetails .name').get_text(strip=True)] = data
pprint(players)
在输出中我可以清楚地看到没有应用过滤器,因为本赛季还没有 45 场比赛
{'Virgil van Dijk': {'Accurate long balls': '533',
'Aerial battles lost': '207',
'Aerial battles won': '589',
'Appearances': '122',
'Assists': '2',
'Big chances created': '11',
'Blocked shots': '23',
'Clean sheets': '45',
【问题讨论】:
-
@MisterButter:过滤器是使用
javascript完成的,因此您不能使用BeautifulSoup通过过滤器进行废弃。
标签: python beautifulsoup request