Web scraping 如何使用bs4浏览python中的单页应用程序网站

Web scraping 如何使用bs4浏览python中的单页应用程序网站,web-scraping,beautifulsoup,Web Scraping,Beautifulsoup,我正在NBA网站上搜刮球员的名字。玩家姓名网页是使用单页应用程序设计的。玩家按字母顺序分布在几页纸上。我无法提取所有球员的名字。 以下是链接: 在处理SPA时,不应该尝试从DOM中提取信息,因为如果不运行支持JS的浏览器来填充数据,DOM是不完整的。打开页面源代码,您将看到页面HTML没有您需要的数据 但大多数SPA使用XHR请求加载数据。您可以在开发者控制台(F12)中监视网络请求,以查看页面加载期间发出的请求 这里https://in.global.nba.com/playerindex/

我正在NBA网站上搜刮球员的名字。玩家姓名网页是使用单页应用程序设计的。玩家按字母顺序分布在几页纸上。我无法提取所有球员的名字。 以下是链接:


在处理SPA时,不应该尝试从DOM中提取信息,因为如果不运行支持JS的浏览器来填充数据,DOM是不完整的。打开页面源代码,您将看到页面HTML没有您需要的数据

但大多数SPA使用XHR请求加载数据。您可以在开发者控制台(F12)中监视网络请求,以查看页面加载期间发出的请求

这里
https://in.global.nba.com/playerindex/
https://in.global.nba.com/stats2/league/playerlist.json?locale=en

自己模拟这个请求,然后选择你需要的任何东西。检查请求头以确定需要随请求发送的内容

导入请求
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
第页https://in.global.nba.com/playerindex/'
s=请求。会话()
s、 headers={'user-agent':'Mozilla/5.0(windowsnt10.0;Win64;x64;rv:69.0)Gecko/20100101 Firefox/69.0'}
#访问主页以使用必要的cookie填充会话
res=s.get(页面url)
res.为_状态提高_()
json_url='1〕https://in.global.nba.com/stats2/league/playerlist.json?locale=en'
res=s.get(json_url)
res.为_状态提高_()
data=res.json()
玩家名称=[p['playerProfile']['displayName']表示数据['payload']['players']]中的p
打印(玩家姓名)
输出:

['Steven Adams', 'Bam Adebayo', 'Deng Adel', 'LaMarcus Aldridge', 'Kyle Alexander', 'Nickeil Alexander-Walker', ...
处理auth 需要注意的一点是,一些网站要求在发送请求时发送授权令牌。如果存在,您可以在API请求中看到它

如果您正在构建一个需要长期(er)运行的scraper,那么您可能希望通过从页面提取令牌并将其包含在请求中,使脚本更加健壮

这个令牌(主要是JWT令牌,以
ey…
开头)通常位于HTML中的某个位置,编码为JSON。或者将其作为cookie发送到客户端,浏览器将其附加到请求或标头中。简言之,它可能在任何地方。扫描请求和响应,找出令牌来自何处,以及如何自己检索令牌

。。。
const state={“token”:“ey…”,…};
导入json
进口稀土
res=requests.get('url/to/page')
#从页面中提取令牌。这里的“state”是一个序列化为JSON的对象,
#我们将“=”后面的所有内容一直签名到分号,并将其反序列化
state=json.loads(re.search(r'const state=(.*);”,res.text.group(1))
令牌=状态['token']
res=requests.get('url/to/api/with/auth',headers={'authorization':f'Bearer{token}})
很好的解释:-)+
['Steven Adams', 'Bam Adebayo', 'Deng Adel', 'LaMarcus Aldridge', 'Kyle Alexander', 'Nickeil Alexander-Walker', ...