【发布时间】:2016-01-25 20:38:03
【问题描述】:
我尝试使用 requests 库从 URL 获取内容。更详细地说,我按以下方式进行:
import requests
proxies = {'http':'my_proxy.blabla.com/'}
r = requests.get(url, proxies = proxies)
print r.text
结果我得到以下信息:
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>404 - Not Found</title>
</head>
<body>
<h1>404 - Not Found</h1>
</body>
</html>
所以,看起来代理让我走了,我到达了服务器。但是,Web 服务器无法解释我的请求(路径错误左右)并且不知道要返回什么内容。我的解释正确吗?
这可能是什么原因?如果我将 URL 放在我的浏览器之一中,我确实会得到预期的内容。
添加
在 cmets 中已建议问题的根源在于标头。因此,我使用了这个网站:http://www.procato.com/my+headers/ 来了解我的浏览器发送了哪些标头。我使用这些值来设置给requests.get 函数的headers 变量。我为以下键设置了值:'User-Agent'、'Accept'、'Referer'、'Accept-Encoding'、'Accept-Language'、'X-Forwarded-For'、'Cache-Control'、'联系'。不幸的是,它不能解决问题。我仍然收到相同的 404 响应。
增加了 2 个
我已经针对两个不同的 URL 测试了我的函数并得到了完全相同的响应。所以,我之前关于响应(我看到的 XML)来自网络服务器的假设可能是错误的。两个完全不同的网络服务器(其中一个是 Google)不太可能生成相同的响应。
所以,现在我不明白 XML 的来源。会不会是来自代理服务器?
【问题讨论】:
-
如果服务器不喜欢“用户代理”标识,它可以拒绝传递内容。在这种情况下响应 404 错误并不好,但可能是为了欺骗搜索引擎,或者服务器希望机器人对站点有完全不同的想法,因此出现 404。
-
我能否以某种方式设置“用户代理”,以便来自 Python 的请求看起来与来自 Firefox 或 Chromium 的请求相同。我之所以问,是因为 Web 服务器接受了来自浏览器的请求,并且它提供了一些内容。换句话说,Python 可以伪装成浏览器吗?我想我需要类似:
headers={'User-Agent': 'firefox'} -
类似的东西。但是琴弦有点长。请使用您最喜欢的搜索引擎和/或 Python 文档;你会很容易找到答案。
标签: python http-status-code-404 python-requests