【问题标题】:Why is mechanize throwing a HTTP 403 error?为什么 mechanize 会抛出 HTTP 403 错误?
【发布时间】:2013-07-30 02:07:54
【问题描述】:

由于某种原因,当我尝试打开页面 http://questionablecontent.net 时,我得到了一个 HTTP Error 403: Forbidden。我曾经收到robots.txt 错误,但已解决。此外,我什至找不到他们的 robots.txt 文件。

我仍然可以从 chrome 查看网页,所以我想知道的是:即使在设置了适当的标题后,mechanize 看起来是否与 chrome 不同?

这是我的代码(不起作用):

br = mechanize.Browser()
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)
br.set_handle_equiv(True)
br.set_handle_redirect(True)
br.set_handle_robots(False)
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]   

我还尝试将 addheaders 设置为与我的浏览器相同的标题(我找到了 here):

br.addheaders = [('User-agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36')]

...但这也没有用。

最后,我尝试使用 Selenium 并且效果很好,看到它在 chrome 中加载页面,然后与 Python 通信。但是,我仍然想让它与机械化一起工作。另外,我仍然不确定 chrome 和 mechanize 与他们的服务器有何不同。

【问题讨论】:

  • 你的问题真的帮助了我,解决了我的问题!非常感谢老兄

标签: python http-headers mechanize


【解决方案1】:

诀窍可能在于 selenium 发送的请求标头,除了用户代理标头之外,一些服务器还会检查其他标头以确保真正的浏览器正在与它们对话。看看我的旧答案之一:

urllib2.HTTPError: HTTP Error 403: Forbidden

在您的位置,我会尝试添加您真正的 chrome 浏览器发送的所有标题,然后消除不必要的标题。

【讨论】:

  • 很奇怪,我在不更改代码的情况下停止收到 403 错误。虽然我在他们的网站上使用了相同的代码并且它曾经可以工作,所以我会假设他们的结果发生了一些变化。我已经添加了额外的标题以防万一。
  • 为了清楚起见,如果我发送了我真正的 chrome 浏览器发送的所有标头,它看起来是否与我的 chrome 浏览器发送请求完全相同?还有其他事情吗?
  • 如果您将所有接收到的cookies以及真实浏览器发送的所有标头都发回,它看起来肯定是一样的。唯一可以有所作为的是javascript。大量基于 ajax 的页面通常在发送请求之前在客户端进行一些数据/cookie 修改,并且可能更难以“逆向工程”并使用原始请求模拟该行为。在这些情况下,最好使用 web 驱动程序,例如 selenium,或者使用 PySide/PyQt 的 QtWebKit 模块从头开始编写一个。
猜你喜欢
  • 2020-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
相关资源
最近更新 更多