【问题标题】:How do you make python go through websites and get useful data?如何让 python 浏览网站并获取有用的数据?
【发布时间】:2020-08-23 01:25:48
【问题描述】:

我想使用 python 从网站futbin.com 获取一些数据。该网站拥有 FIFA Ultimate Team 中每位球员的价格数据。例如,如果我想查看 Vidal 的价格,我会去链接:https://www.futbin.com/20/player/19765/arturo-vidal 并查看他的当前价格。

我试图为这个特定的播放器制作一个程序,但我无法这样做,因为我对使用“请求”库非常陌生。所以我在网上查了一下,通过darkyin87https://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. 我如何找到这样的网站,这些网站具有代码可以操作的简单纯文本。

【问题讨论】:

  • 请注意,我稍微修改了我的答案,因为我最初给出的结果似乎不适用于所有玩家。要引用的正确属性是data-player-resource
  • 您正在描述 Web 服务调用和网页之间的区别。 https://www.futbin.com/20/playerPrices/?player=181872 是一个网络服务调用。您可能希望访问 api 定义,这样您就可以只请求您需要的信息,而不会浪费带宽和精力来抓取 html。

标签: python python-requests


【解决方案1】:

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

Web-scraping futbin.com

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

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

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

请注意,该 ID 与您提到的链接中的玩家 ID (19765) 不同。要获得这个唯一 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)

【讨论】:

    【解决方案2】:

    这个 URL,你得到的 GitHub 代码,用于网站后端,它是为前端提供数据的 API。因此,当您导航到播放器页面时,前端会向后端发出请求并获取它应该呈现的数据。

    如果您打开浏览器开发人员工具并在导航到页面之前转到网络选项卡,则可以检查前端调用的内容。

    【讨论】:

      猜你喜欢
      • 2016-03-11
      • 2020-05-05
      • 2015-02-22
      • 2021-09-08
      • 2021-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多