【问题标题】:Grabbing HTML source after delayed redirect延迟重定向后抓取 HTML 源
【发布时间】:2016-09-23 20:57:48
【问题描述】:

我正在尝试使用 Python 获取网站的 HTML 源代码。但是,当您访问网站上的任何页面时,都会出现延迟重定向,就像加载屏幕一样。每当我执行requests.get(url) 时,我最终都会抓住那个加载屏幕,而不是它之后的内容。我正在使用请求库。有没有办法让请求等到重定向之后?重定向大约需要 3 秒。

这是我使用的代码:

import Requests
page = requests.get(url)
print(page.text)

【问题讨论】:

  • 如果网站在加载屏幕后使用 javascript 呈现内容,则请求可能不是最好的工具。你有你想抓取来源的网站的url吗?
  • 重定向很可能在浏览器中执行,因为浏览器执行的是Javascript代码。要么使用无头浏览器执行相同的操作,要么对 javascript 进行反向工程以直接加载目标。

标签: python python-3.x redirect python-requests


【解决方案1】:

您可以关闭默认的自动重定向特性,并通过请求存储重定向位置的 r.history 中指示的网页来获取对象页面

【讨论】:

    【解决方案2】:

    重定向可能是由您的浏览器完成的,而不是由服务器完成的。有两种常用方式:"meta refresh" 或 Javascript。

    对于前者,您可以使用 BeautifulSoup 之类的东西解析 HTML 响应,检查它的元刷新标记,提取目标 URL,然后使用第二个请求检索它。

    如果使用 Javascript 完成重定向会更加困难,因为可以通过多种方式完成重定向。

    无论哪种方式都有点麻烦,所以最好的办法是使用selenium 之类的东西,它基本上可以让你编写浏览器脚本,这样你就可以让浏览器为你进行元刷新/javascript 重定向。

    【讨论】:

    • 当我使用 selenium 并尝试从 driver.page_source 打印 html 源代码时,我得到一个错误。 ` [Py3] C:\Users\Evan\PythonProjects>python test.py Traceback(最近一次调用最后):文件“test.py”,第 9 行,在 print(html_source) 文件“C:\Users\ Evan\Miniconda3\envs\Py3\lib\encodings\cp437.py",第 19 行,在编码中返回 codecs.charmap_encode(input,self.errors,encoding_map)[0] UnicodeEncodeError: 'charmap' codec can't encode character '\u2026' 在位置 7006:字符映射到 `
    • 这意味着您的终端无法显示该字符,因为它无法在您的终端编码中表示'\u2026'(水平省略号),即cp437。使用现代终端编码,例如 Windows-1251 或 UTF-8。而不是打印 html 源代码,而是将其写入文件。然后你应该能够检查它。
    • import codec 然后使用page.encode('utf-8') 然后它会让我打印html。
    • @Gamegoofs2:您不需要import codec 来执行此操作,但是是的,这是查看页面的另一种方式。
    猜你喜欢
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    相关资源
    最近更新 更多