我正试着教自己一些基本的网络抓取。使用Python的requests模块,我能够抓取各种网站的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?
有问题的服务器会给您一个gzip响应。服务器也很坏;它发送以下头:
那里的
<!DOCTYPE..>
行不是有效的HTTP头。因此,经过Server
的其余头将被忽略。为什么服务器会插入不清楚的内容;在所有可能的hood中,WRCCWrappers.py
是一个CGI脚本,它不输出头,但在doctype行后面包含一个双换行符,欺骗Apache服务器在那里插入额外的头。因此,
requests
也没有检测到数据是gzip编码的。所有的数据都在那里,你只要解码就行了。如果不是很不完整的话你也可以。解决方法是告诉服务器不要为压缩而烦恼:
并返回未压缩的响应。
顺便说一句,在Python 2上,HTTP头解析器并不那么严格,它设法将doctype声明为头:
而
content-encoding
信息仍然存在,因此requests
将按预期为您解码内容。此URL的HTTP头现在已修复。
相关问题 更多 >
编程相关推荐