人性化的Requests模块(响应与编码、header处理、cookie处理、重定向与历史记录、代理设置)

Requests库是第三方模块,需要额外进行安装。Requests是一个开源库

  • pip install requests
  • 去GitHub下载回来,进入解压文件,运行setup.py

比urllib2实现方式的代码量少,下面是POST请求:

import requests
postdata= {'key':'value'}
r = requests.post('http://www.cnblogs.com/login',data=postdata)
print(r.content)
  • 下面是get请求,但有些get请求url包含参数,如:www.xxx.com?keyword=bolg;guguobao&pageindex=1,怎么简化url,requests提供其他方法:
payload = {'opt':1}
r = requests.get('https://i.cnblogs.com/EditPosts.aspx',params=payload)
print r.url

响应与编码

import requests
r = requests.get('http://www.baidu.com')
print 'content -- >'+ r.content
print 'text -- >'+ r.text
print 'encoding -- >'+ r.encoding
r.encoding='utf-8'
print 'new text-- >'+r.text

uploading-image-85581.png

r.content 返回是字节,text返回文本形式

  • 如果输出结果为encoding -->encoding -- >ISO-8859-1,则说明实际的编码格式是UTF-8,由于Requests猜测错误,导致解析文本出现乱码。Requests提供解决方案,可以自行设置编码格式,r.encoding='utf-8'设置成UTF-8之后,“new text -->”就不会出现乱码。但这种方法笨拙。因此就有了:chardet,优秀的字符串/文件编码检测模块。

  • 安装pip install chardet

  • 安装完成后,使用chardet.detect()返回字典,其中confidence是检测精确度,encoding是编码方式

import requests,chardet
r = requests.get('http://www.baidu.com')
print chardet.detect(r.content)
r.encoding = chardet.detect(r.content)['encoding']
print(r.text)
  • 运行结果
C:\Python27\python.exe F:/python_scrapy/ch03/3.2.3_3.py
{'confidence': 0.99, 'language': '', 'encoding': 'utf-8'}
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div ..
.................
Process finished with exit code 0

3 请求头header处理

  • Requests对headers的处理和urllib2非常相似,在Requests的get函数添加headers参数
import requests
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers={'User-Agent':user_agent}
r = requests.get('http://www.baidu.com',headers=headers)
print r.content

响应码code和响应头header处理

import requests
r = requests.get('http://www.baidu.com')
if r.status_code == requests.codes.ok:
    print r.status_code#响应码
    print r.headers#响应头
    print r.headers.get('content-type')#推荐使用这种获取方式,获取其中的某个字段
    print r.headers['content-type']#不推荐使用这种获取方式,因为不存在会抛出异常
else:
    r.raise_for_status()

cookie处理

  • 如果响应包含cookie的值,可以如下方式取出:
import requests
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers={'User-Agent':user_agent}
r = requests.get('http://www.baidu.com',headers=headers)
#遍历出所有的cookie字段的值
for cookie in r.cookies.keys():
    print cookie+':'+r.cookies.get(cookie)
  • 如果想自定义cookie发出去,使用以下方式:
import requests
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers={'User-Agent':user_agent}
cookies = dict(name='guguobao',age='10')
r = requests.get('http://www.baidu.com',headers=headers,cookies=cookies)
print r.text
  • 还有一种更加高级,且能自动处理Cookie的方式,有时候我们不需要关心Cookie值是多少,只是希望每次访问的时候,程序都会自动把cookie带上。Requests提供一个session的概念,在连续登录网页,处理登录跳转特别方便,不需要关注具体细节
import requests
loginUrl= 'http://www.xxx.com/login'
s = requests.Session()
#首先访问登录界面,作为游客,服务器会先分配一个cookie
r = s.get(loginUrl,allow_redirects=True)
datas={'name':'guguobao','passwd':'guguobao'}
#向登录链接发送post请求,验证成功,游客权限转为会员权限
r =s.post(loginUrl,data=datas,allow_redirects=True)
print r.text
  • 这种使用Session函数处理Cookie的方式很常见

重定向与历史记录

  • r =requests.get('http://www.baidu.com/',allow_redirects=True),将allow_redirects设置为True,允许重定向,FALSE不允许。可以通过r.hisory字段查看历史成功访问请求跳转信息:
import requests
r = requests.get('http://github.com')
print r.url
print r.status_code
print r.history

7 超时设置

  • r = requests.get('http://github.com',timeout=2)

8 代理设置

import requests
proxies = {
  "http": "http://127.0.0.1:1080",
  "https": "http://127.0.0.1:1080",
}
r = requests.get("http://www.google.com", proxies=proxies)
print r.text
  • 也可以通过环境变量HTTP_PROXY和HTTPS_PROXY来配置代理,但不常用。你的代理需要使用HTTP Basic Auth,可以使用http://user:password@host:端口
proxies = {
  "http": "http://user:[email protected]:1080",
]

猜你喜欢

转载自www.cnblogs.com/guguobao/p/9404614.html