python - 如何让 python 浏览网站并获取有用的数据?
问题描述
我想使用 python 从网站futbin.com 获取一些数据。该网站拥有 FIFA Ultimate Team 中每位球员的价格数据。例如,如果我想查看 Vidal 的价格,我会去链接:https ://www.futbin.com/20/player/19765/arturo-vidal并查看他的当前价格。
我试图为这个特定的播放器制作一个程序,但我无法这样做,因为我对使用“请求”库非常陌生。所以我在网上查了一下,通过 darkyin87 https://github.com/darkyin87/futbin-scraper找到了这个确切程序的代码;
import requests
import json
domain = 'https://www.futbin.com'
version = 19
page = 'playerPrices'
player_ids = {
'Arturo Vidal': 181872,
'Pierre-Emerick Aubameyang': 188567,
'Robert Lewandowski': 188545,
'Jerome Boateng': 183907,
'Sergio Ramos': 155862,
'Antoine Griezmann': 194765,
'David Alaba': 197445,
'Paulo Dybala': 211110,
'Radja Nainggolan': 178518
}
def fetch_prices():
ret_val = {}
for name, id in player_ids.iteritems():
url = "%s/%s/%s?player=%s" % (domain, version, page, id)
response = requests.get(url)
data = response.json()
ret_val[name] = data[str(id)]['prices']['ps']['LCPrice']
return ret_val
if __name__ == "__main__":
prices = fetch_prices()
fetch_prices
该代码转到与我上面提到的不同的网站,并且不包含任何图形元素。它只有纯文本和一堆关于纯文本播放器的其他详细信息,这使得程序更容易阅读和操作:https ://www.futbin.com/20/playerPrices/?player=181872 。
我不知道开发人员是如何访问该网站的,因为我无法通过浏览 futbin.com 找到它。
所以我想我有两个问题:
- 如果我无法访问纯文本网站,我将如何完成这项任务,以及
- 我如何找到这样的网站,这些网站具有代码可以操作的简单纯文本。
解决方案
所以经过一番谷歌搜索后,我发现了这个类似的问题。
正如您从那里的答案中看到的那样,Selçuk 建议他们正在为图表数据发出 http 请求。按照该逻辑,您可以在开发人员工具中检查您的网络选项卡并监控请求。
如果我们监控请求并寻找产生价格数据的请求,我们会收到以下请求。
https://www.futbin.com/20/playerPrices?player=181872
请注意,该 ID 与您提到的链接(19765)中的玩家 ID 不同。为了得到这个唯一的 ID,我们必须做一些额外的工作。
- 加载您链接的原始页面。
- 在页面中找到新的唯一 ID。
- 使用新的唯一 ID 向上面的链接发出请求。
- 结果是一个 JSON,您可以弄清楚如何根据需要进行解析。
import requests
from bs4 import BeautifulSoup
player_id = 19765 #Arturo Vidal
# Request the main page to get info about the player
r = requests.get("https://www.futbin.com/20/player/" + str(player_id)).content
soup = BeautifulSoup(r, 'html.parser')
page_info = soup.find(id='page-info')
request_id = page_info['data-player-resource'] #Get the ID to make the second request
# Request to get a JSON of price data for player 19765 with internal id request_id
r = requests.get("https://www.futbin.com/20/playerPrices?player=" + request_id).content
print(r)
推荐阅读
- html - 创建一个带您到另一个页面的按钮
- angular - 如何在 Angular 数据表中显示来自服务的数据
- php - excel file read rows and columns - php
- android - 如何通过插入和测试数据正确进行 Room 迁移测试?
- php - laravel 重置密码不重置密码
- notepad++ - 在记事本++中选择并删除整列
- javascript - 几分钟后如何使用时间前的javascript更改为小时然后像facebook一样的一天?
- azure - 部署逻辑应用程序时如何使用 Salesforce API 连接参数?
- java - 想要将多个 JSON 对象存储到 jsonArray 并将结果作为单个字符串获取
- c# - 如何根据字符串动态调用类?