python的requests库
requests库适合我这种懒人。
为什么要用requests而不用urllib2呢?
官方文档中是这样说的:
python的标准库urllib2提供了大部分需要的HTTP功能,但是API太逆天了,一个简单的功能就需要一大堆代码。
发送HTTP请求
r = requests.get('http://www.qq.com')
r = requests.get('https://twitter.com')
HTTP请求还有很多类型,比如POST,PUT,DELETE,HEAD,OPTIONS。
r = requests.post("http://httpbin.org/post")
r = requests.put("http://httpbin.org/put")
r = requests.delete("http://httpbin.org/delete")
r = requests.head("http://httpbin.org/get")
r = requests.options("http://httpbin.org/get")
传递参数
比如在采集百度搜索结果时,我们wd参数(搜索词)和rn参数(搜素结果数量),你可以手工组成URL:
payload = {'wd': '张亚楠', 'rn': '100'}
r = requests.get("http://www.baidu.com/s", params=payload)
print r.url
获取response
print r.text
print r.content
r.content是以字节的方式去显示,在输出结果中以b开头。但我在cygwin中用起来并没有,下载网页正好。所以就替代了urllib2的urllib2.urlopen(url).read()功能。
获取网页编码
print r.encoding
当你发送请求时,requests会根据HTTP头部来猜测网页编码,当你使用r.text时,requests就会使用这个编码。当然你还可以修改requests的编码形式。
r = requests.get('http://www.zhidaow.com')
r.encoding = 'ISO-8859-1'
# 对encoding修改后就直接会用修改后的编码去获取网页内容。
获取网页状态码
print r.status_code
遇到跳转的页面,例如访问http://github.com是302跳转到https
r.status_code会显示最终的状态码,若查看跳转前的状态码:
print r.history
# 结果:
# (<Response [302]>,)
禁止跳转:
r = requests.get('http://github.com', allow_redirects = False)
请求头内容
print r.request.headers
自定义headers:
headers = {'User-Agent': 'alexkh'}
r = requests.get('http://www.zhidaow.com', headers = headers)
获取响应头内容
print r.headers
以字典的形式返回了全部内容,我们也可以访问部分内容。
print r.headers['Content-Type']
# 结果:
# 'text/html; charset=utf-8'
设置超时
一旦超过这个时间还没获得响应内容,抛出timeout异常。
r = requests.get('http://github.com', timeout=0.001)
代理访问
proxies = {
"http": "http://10.10.1.10:3128",
"https": "http://10.10.1.10:1080",
}
r = requests.get("http://www.zhidaow.com", proxies=proxies)
抓取HTTPS网页
当使用requests.get(url)抓取HTTPS网页时,会遇到requests.exceptions.SSLError错误
解决方法:禁用验证
r = requests.get('https://github.com', verify=False)
解析json
像urllib和urllib2,如果用到json,就要引入新模块,如json和simplejson
但在requests中已经有了内置的函数,r.json()。就拿查询IP的API来说:
r = requests.get('http://ip.taobao.com/service/getIpInfo.php?ip=122.88.60.28')
print r.json()['data']['country']
参考文献
requests的官方指南文档
requests的高级指南文档
requests的中文文档
尤其是上面第二个《高级指南》,不错。