首页 > 解决方案 > 如何让 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 找到它。

所以我想我有两个问题:

  1. 如果我无法访问纯文本网站,我将如何完成这项任务,以及
  2. 我如何找到这样的网站,这些网站具有代码可以操作的简单纯文本。

标签: pythonpython-requests

解决方案


所以经过一番谷歌搜索后,我发现了这个类似的问题。

网页抓取 futbin.com

正如您从那里的答案中看到的那样,Selçuk 建议他们正在为图表数据发出 http 请求。按照该逻辑,您可以在开发人员工具中检查您的网络选项卡并监控请求。

如果我们监控请求并寻找产生价格数据的请求,我们会收到以下请求。

https://www.futbin.com/20/playerPrices?player=181872

请注意,该 ID 与您提到的链接(19765)中的玩家 ID 不同。为了得到这个唯一的 ID,我们必须做一些额外的工作。

  1. 加载您链接的原始页面。
  2. 在页面中找到新的唯一 ID。
  3. 使用新的唯一 ID 向上面的链接发出请求。
  4. 结果是一个 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)

推荐阅读