我正在尝试教自己一些基本的网络抓取。使用Python的请求模块,在尝试以下操作之前,我能够抓取各种网站的html:
>>> r = requests.get('http://www.wrcc.dri.edu/WRCCWrappers.py?sodxtrmts+028815+por+por+pcpn+none+mave+5+01+F')
我得到的不是基本的html,而是本页面的内容:
>>> r.text
'\x1f\ufffd\x08\x00\x00\x00\x00\x00\x00\x03\ufffd]o\u06f8\x12\ufffd\ufffd\ufffd+\ufffd]...
>>> r.content
b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\xed\x9d]o\xdb\xb8\x12\x86\xef\xfb+\x88]\x14h...
我已经尝试过将get /
post与我可以从文档,SO和其他示例中猜到的每种语法进行多种组合。我不明白上面看到的内容,无法将其转换为可以阅读的任何内容,也无法弄清楚如何获得自己真正想要的东西。我的问题是,如何获取以上页面的html?
有问题的服务器正在给您 答复 。服务器也 很坏 ;它发送以下标头:
$ curl -D - -o /dev/null -s -H 'Accept-Encoding: gzip, deflate' http://www.wrcc.dri.edu/WRCCWrappers.py?sodxtrmts+028815+por+por+pcpn+none+mave+5+01+F
HTTP/1.1 200 OK
Date: Tue, 06 Jan 2015 17:46:49 GMT
Server: Apache
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd"><html xmlns="http: //www.w3.org/1999/xhtml" lang="en-US">
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 3659
Content-Type: text/html
该<!DOCTYPE..>
行 没有有效的HTTP标头 。这样,过去的其余标头Server
将 被忽略
。为什么服务器插入的原因尚不清楚;在所有可能的情况下,WRCCWrappers.py
都是CGI脚本,它不输出标头,但在doctype行之后确实包含一个双换行符,将Apache服务器复制到其中插入其他标头中。
因此,requests
也不会检测到数据是gzip编码的。数据就在那里,您只需要解码即可。或者,如果不是很不完整,也可以。
解决方法是告诉服务器不要打扰压缩:
headers = {'Accept-Encoding': 'identity'}
r = requests.get(url, headers=headers)
并返回未压缩的响应。
顺便说一下,在Python 2上,HTTP标头解析器不是那么严格,它设法将doctype声明为标头:
>>> pprint(dict(r.headers))
{'<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "dtd/xhtml1-transitional.dtd"><html xmlns="http': '//www.w3.org/1999/xhtml" lang="en-US">',
'connection': 'Keep-Alive',
'content-encoding': 'gzip',
'content-length': '3659',
'content-type': 'text/html',
'date': 'Tue, 06 Jan 2015 17:42:06 GMT',
'keep-alive': 'timeout=5, max=100',
'server': 'Apache',
'vary': 'Accept-Encoding'}
并且content-encoding
信息得以requests
保留,因此可以按预期为您解码内容。
问题内容: 我正在尝试解析使用Python Requests库完成的HEAD请求的结果,但似乎无法访问响应内容。 根据文档,我应该能够从request.Response.text访问内容。这对GET请求对我来说效果很好,但对HEAD请求返回None。 GET请求(有效) 内容= HEAD请求(无内容) 内容= 编辑 好的,我很快就从答案中意识到,HEAD请求不应返回仅内容标头。但这是否意味着,要访
问题内容: 尝试使用Requests会话发出一个简单的get请求,但是我一直在获取特定网站的SSLerror。我认为问题可能出在网站上(我使用https://www.ssllabs.com进行了扫描,结果下降了),但是我不确定,因为我对该领域一无所知:)我想了解发生了什么。 一个解决方案/解释将是巨大的,谢谢! 编码: 我收到下一个错误: 我在https://www.ssllabs.com上进行了
问题内容: 我使用请求库从网站上获取了一些cookie,但是我只能从响应中获取cookie,如何从请求中获取cookie?谢谢! 问题答案: 或者,您可以在请求之前和之后使用和观察:
问题内容: 我正在使用Python请求库从网络获取PDF文件。这可以正常工作,但我现在也想要原始文件名。如果我在Firefox中转到PDF文件,然后单击它,则已经定义了文件名来保存pdf。如何获得此文件名? 例如: 我检查了是否有任何有趣的内容,但其中没有文件名。我实际上希望的是.. 有人知道如何通过请求库获取下载的PDF文件的文件名吗? 问题答案: 它在http标头中指定。因此,要提取名称,您将
我和Gremlin.Net一起工作
问题内容: 我在应用程序的一种方法中使用Python的请求库。该方法的主体如下所示: 我想为该方法编写一些单元测试,但是,我想做的是传递一个伪本地URL,例如: 当我使用本地URL调用 requests.get 时,出现以下 KeyError 异常: 问题是如何将本地URL传递给 request.get ? PS:我整理了上面的示例。它可能包含许多错误。 问题答案: 正如@WooParadog解释