【问题标题】:Why Can't I load this page using Python?为什么我不能使用 Python 加载此页面?
【发布时间】:2020-03-07 04:23:37
【问题描述】:

如果我使用 urllib 加载此 url(https://www.fundingcircle.com/my-account/sell-my-loans/),我会收到 400 状态错误。

例如以下返回400错误

>>> import urllib
>>> f = urllib.urlopen("https://www.fundingcircle.com/my-account/sell-my-loans/")
>>> print f.read()

但是,如果我将 url 复制并粘贴到浏览器中,我会看到一个包含我想要查看的信息的网页。

我尝试过使用try,except,然后读取错误。但是返回的数据只是告诉我该页面不存在。例如

import urllib
try:
    f = urllib.urlopen("https://www.fundingcircle.com/my-account/sell-my-loans/")
except Exception as e:
    eString = e.read()
    print eString

为什么 Python 不能加载页面?

【问题讨论】:

  • 您是否获得了fundingcircle.com 的许可来抓取他们的网站?
  • Puciek,根据他们的 T&C,他们知道人们正在这样做,但他们还没有相关政策。
  • 您尚未登录该站点+您可以更改用户代理和其他标题以模仿浏览器。您可能需要在调用之间保持状态:stackoverflow.com/questions/4414683/…
  • 尝试欺骗一些标题。
  • @Puciek 代码是否违反了其他网站的服务条款已经被执行至死,而且 StackOverflow 对提问者如何处理他们的代码不承担任何责任。尽管它们可能不符合您的道德规范,但只要对它们进行研究并具有示例代码,诸如“为什么此导弹代码没有正确针对平民?”之类的问题。或“我怎样才能绕过这个速率限制?”是主题。

标签: python urllib


【解决方案1】:

如果 Python 获得 404 状态,那是因为服务器拒绝向您提供该页面。

为什么这很难知道,因为服务器是黑盒子。但是您的浏览器给服务器提供的不仅仅是 URL,它还给它一组 HTTP 标头。服务器很可能会根据其中一个或多个标头的内容更改行为。

您需要查看浏览器开发工具并查看浏览器发送的内容,然后尝试从 Python 复制这些标头中的一些。明显的候选者是 User-Agent 标头,然后是 AcceptCookie 标头。

但是,在这种特定情况下,服务器会以 401 Unauthorized 响应;您将获得一个登录页面。它对浏览器和 Python 都这样做:

>>> import urllib
>>> urllib.urlopen('https://www.fundingcircle.com/my-account/sell-my-loans/')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/urllib.py", line 87, in urlopen
    return opener.open(url)
  File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/urllib.py", line 208, in open
    return getattr(self, name)(url)
  File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/urllib.py", line 451, in open_https
    return self.http_error(url, fp, errcode, errmsg, headers)
  File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/urllib.py", line 372, in http_error
    result = method(url, fp, errcode, errmsg, headers)
  File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/urllib.py", line 683, in http_error_401
    errcode, errmsg, headers)
  File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/urllib.py", line 381, in http_error_default
    raise IOError, ('http error', errcode, errmsg, headers)
IOError: ('http error', 401, 'Unauthorized', <httplib.HTTPMessage instance at 0x1066f9a28>)

但 Python 的 urllib 没有处理 401 状态代码的处理程序,并将其转换为异常。

响应正文包含登录表单;您必须编写代码才能在此处登录,并且可能会跟踪 cookie。

如果使用更专业的工具,这项任务会容易得多。您可以使用robobrowser 加载页面、解析表单并为您提供填写表单的工具,然后为您发布表单并跟踪保持登录所需的 cookie。它建立在出色的 @ 987654322@ 和 BeautifulSoup 库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    相关资源
    最近更新 更多