【问题标题】:What to do when Python requests.get gets a browser error from the website?Python requests.get 从网站收到浏览器错误怎么办?
【发布时间】:2021-11-28 06:20:49
【问题描述】:

我正在尝试从网站中读取表格,但是当我这样做时,我从网站得到的结果显示:“您的浏览器可能已过时。为了获得最佳网站体验,我们建议您更新浏览器。”

我可以在同一个 PGA 网站的 Stats 部分使用 requests.get 而不会出现问题,但由于某些原因,这些历史结果表的显示方式会导致问题。发生的一件有趣的事情是该网站允许您为显示的表格选择不同的年份,但这样做不会导致地址有任何差异,所以我怀疑他们正在以 read_html 不起作用的方式格式化它.还有其他建议吗?代码如下。

    import pandas as pd
    import requests
    farmers_url = 'https://www.pgatour.com/tournaments/farmers-insurance-open/past-results.html'
    farmers = pd.read_html(requests.get(farmers_url).text, header=0)[0]
    farmers.head()

【问题讨论】:

  • 该消息是因为该网站已检查其 lcient(您的代码)是否可以运行 javascript,而那些表明它不能,因此您的代码就像一个无法运行的非常旧的浏览器javascript 这意味着他们正在检查抓取工具,和/或他们希望在浏览器中运行 javascript 来读取/显示数据,而不是提供完整的 html 页面。您必须使用像 Selenium 这样的浏览器模拟,或者深入研究 jvascript 以找到它从浏览器发出的请求,看看您是否可以使用 Python+requests 复制这些请求。
  • ;check 可能只是客户端的行为不像普通浏览器,例如浏览器总是会请求刚刚交付的页面中指定的图像和 javascript/css 文件,但是您的代码没有这样做。或者检查可能更微妙/更复杂,例如 JS 代码发出 ajaz 请求,但您的代码没有。

标签: python pandas web-scraping


【解决方案1】:

我看到对以下文件的请求以获取您想要的内容。否则,这将是浏览器从您的起始 URL 发出的附加请求。您当前获得的是在浏览器动态发生的任何更新之前请求的 url 中表格的实际内容。

import requests
import pandas as pd

headers = {'User-Agent': 'Mozilla/5.0'}
r = requests.get('https://www.pgatour.com/tournaments/farmers-insurance-open/past-results/jcr:content/mainParsys/pastresults.selectedYear.2021.004.html', headers=headers).text
pd.read_html(r)

如果您想整理看起来像实际的网页,那么可以进行以下转换和清理:

import requests
import pandas as pd

headers = {'User-Agent': 'Mozilla/5.0'}
r = requests.get('https://www.pgatour.com/tournaments/farmers-insurance-open/past-results/jcr:content/mainParsys/pastresults.selectedYear.2021.004.html', headers=headers).text
t = pd.read_html(r)[0]
t.reset_index()
t.columns = [':'.join([i[0], i[1]]) if 'ROUNDS' in i else i[0] for i in t.columns]
t.POS = t.POS.map(lambda x: x.split(' ')[-1])
round_columns = [i for i in t.columns if 'ROUNDS' in i]
t[round_columns] = t[round_columns].applymap(lambda x: x.split(' ')[0])
t.drop('TO PAR', inplace = True, axis = 1)
t.rename(columns={"TOTALSCORE": "TOTAL SCORE", "OFFICIALMONEY": "OFFICIAL MONEY", "FEDEXCUPPOINTS":"FEDEX CUP POINTS"}, inplace = True)

详情:

【讨论】:

  • 感谢您的回复!一些后续问题 1) 使用新 URL 而不更改标头到 Mozilla 仍然有效。你对你所做的标题更改做了什么?为什么推荐它?我看不出有什么不同。 2) 你是怎么找到那个网址的?当我转到 2021 年结果并查看该表时,显示年份的地址栏中的此 URL 没有更改 3)有一个区别 - 在显示的 URL 中,列出了最终的 POS,但在您的链接中,所有 4 轮组合在一个 POS 列中。有什么方法可以让结果表像在主站点上一样显示?
  • 1) 添加标题是为了模拟浏览器 2) 我在刷新 (F5) 原始网页时在浏览器的网络选项卡 (F12) 中找到了 url 3) 我需要一个看
  • 我写了一些代码来整理数据框。是否如愿?
  • 谢谢!你完全解决了我正在寻找的东西。我将深入研究代码,试图弄清楚你做了什么来帮助我更好地学习(非常适合初学者)。在您之前的回答中,我不确定在按下 F12 并查看 Elements 之后我在任何地方都看不到那个字符串。我猜你是根据 Javascript 拼凑起来的?如果我将来遇到这种事情,有什么提示如何找到这些“隐藏”的 URL?或者只是学习一些 Javascript 以便我更好地理解结构?
  • 谢谢!对这个请求的所有请求都完成了,您提供了巨大的帮助!
猜你喜欢
  • 2020-11-04
  • 2020-05-19
  • 1970-01-01
  • 2019-06-19
  • 2020-11-24
  • 1970-01-01
  • 1970-01-01
  • 2020-03-13
  • 2016-02-06
相关资源
最近更新 更多