python - 为什么我不能使用 Python 加载此页面?

标签 python urllib

如果我使用 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无法加载页面?

最佳答案

如果 Python 被赋予 404 状态,那是因为服务器拒绝为您提供该页面。

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

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

但是,在这种特定情况下,服务器响应 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。它建立在出色的 requests 之上。和 BeautifulSoup图书馆。

关于python - 为什么我不能使用 Python 加载此页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26597736/

相关文章:

python - 在 Python 中移动和合并列表元素的最有效方法 (2048)

python - 在没有 http ://的情况下修复 url 的正确方法

Python直接从网址解析xml

python - 在 Python 3 中提交表单

python - urllib.py 不适用于 https?

python - 使用 Python urllib 时出现错误

python - Spark 环境中的 pandas.read_csv (IBM Bluemix)

python - 安装cloudera管理代理时,出现No module named cmf.alternatives错误

python - 从 api 响应解析嵌套 json 的最佳方法

python - 如何更改机器人状态但仅在一台服务器中可见