前言
Requests实现简单易用的HTTP库,基于urllib,比urllib方便,做爬虫使用Requests比urllib方便。
GET基本用法
- 基本GET请求
import requests
response = requests.get('http://www.baidu.com')
print(response.text)
其中response.text是字符串类型
- 带参数的GET请求1
import requests #package
response = requests.get('http://httpbin.org/get?name=zhou&age=29') #__init__.py中的方法直接用包名.方法名
?分割参数和路径。&风格参数。
3.使用字典传入参数发送GET请求
dict = {'name':'zhou',
'age':29
}
response = requests.get('http://httpbin.org/get',params=dict)
print(response.text)
- 解析json.即将返回结果可以用dict保存
dict = {'name':'zhou',
'age':29
}
response = requests.get('http://httpbin.org/get',params=dict)
print(response.json())
response.json() 将json用python的dict类型保存
- 获取二进制数据 response.conent
response = requests.get("https://github.com/favicon.ico")
print(type(response.content))
with open('2.icon', 'wb') as f:
f.write(response.content)
解释一下with...open() as f:
等价于
response = requests.get("https://github.com/favicon.ico")
print(type(response.content))
with open('2.icon', 'wb') as f:
f.write(response.content)
对于open()
内置方法,第一个参数是文件全路径。第二个参数'wb'
表示,以byte形式write.
- 添加headers
有些网站爬虫的时候,如果不加上headers(比如请求的应用程序是什么),可能会出现响应不正确返回。
import requests # package
response = requests.get("https://www.zhihu.com/explore")
print(response.status_code)
输出500而不是200
修改一下
import requests # package
dict = {'User-Agent':'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'}
response = requests.get("https://www.zhihu.com/explore",headers=dict)
print(response.status_code)
输出200
POST基本用法
post和get方法类型,唯一的区别可以添加数据到request body
响应
查看repsonse的一些属性
import requests # package.
response = requests.get('http://www.jianshu.com') #__init__.py中的方法可以直接这样调用
print(type(response.status_code), response.status_code)
print(type(response.headers), response.headers)
print(type(response.cookies), response.cookies)
print(type(response.url), response.url)
print(type(response.history), response.history)
输出如下
<class 'int'> 200
<class 'requests.structures.CaseInsensitiveDict'> {'Date': 'Sun, 05 Nov 2017 13:37:40 GMT', 'Server': 'Tengine', 'Content-Type': 'text/html; charset=utf-8', 'Transfer-Encoding': 'chunked', 'X-Frame-Options': 'DENY', 'X-XSS-Protection': '1; mode=block', 'X-Content-Type-Options': 'nosniff', 'ETag': 'W/"85a833d01f43b34ca494a1f2d556eb57"', 'Cache-Control': 'max-age=0, private, must-revalidate', 'Set-Cookie': '_m7e_session=3547b198f318f3554b571be30322df3a; path=/; expires=Sun, 05 Nov 2017 19:37:40 -0000; HttpOnly', 'X-Request-Id': 'ab775f20-eb6c-490e-8fc8-e65a3b36de73', 'X-Runtime': '0.008022', 'Content-Encoding': 'gzip', 'X-Via': '1.1 shendianxin28:0 (Cdn Cache Server V2.0)', 'Connection': 'keep-alive'}
<class 'requests.cookies.RequestsCookieJar'> <RequestsCookieJar[<Cookie _m7e_session=3547b198f318f3554b571be30322df3a for www.jianshu.com/>]>
<class 'str'> http://www.jianshu.com/
<class 'list'> []
状态码类型是int 值 200
headers类型是requests.structures.CaseInsensitiveDict
cookies类型是requests.cookies.RequestsCookieJar
等等其他
状态码的判断
访问一个不存在的页面,返回状态码为404
import requests # package,只能调用__init__.py中的方法,要调用request.auth.py的方法,需要import request.auth
response = requests.get('http://www.jianshu.com/hello.html')
print(response.status_code)
import requests # package,只能调用__init__.py中的方法,要调用request.auth.py的方法,需要import request.auth
response = requests.get('http://www.jianshu.com')
exit() if not response.status_code == 200 else print('succesful') # 如果不等于200 退出程序,否则输出成功
文件上传
import requests # package,只能调用__init__.py中的方法,要调用request.auth.py的方法,需要import request.auth
files = {'files': open('1.icon', 'rb')}
response = requests.post('http://httpbin.org/post', files = files)
print(response.text)
获取cookies
import requests # package,只能调用__init__.py中的方法,要调用request.auth.py的方法,需要import request.auth
response = requests.get('https://www.baidu.com')
print(response.cookies.items())
for key, value in response.cookies.items():
print(key + '=' + value)
# a list of name-value tuples
[('a', 'b'), ('c', 'd')]
注意只有 a list of name-value tuples(list的成员都是tuple,tuple中只有两个值)才能用这种遍历方法,一般list不能用这个方法。
for in 后面要加:
会话维持
import requests # package,只能调用__init__.py中的方法,要调用request.auth.py的方法,需要import request.auth
response = requests.get('http://httpbin.org/cookies/set/num/12312456')
response = requests.get('http://httpbing.org/cookies')
print(response.text)
不会输出cookie值,相当于两个浏览器访问了访问了。
创建一个session,用session发请求,可以拿到cookie
s = requests.Session()
s.get('http://httpbin.org/cookies/set/num/12312456')
response = s.get('http://httpbin.org/cookies')
print(response.text)
输出如下
{
"cookies": {
"num": "12312456"
}
}
https证书验证
有些证书并不是证书颁发机构下发的服务器的,浏览器不信任这个证书。以访问https://12306.cn为例,打开网站后就会下图提示这样的结果。
屏幕快照 2017-11-06 上午12.52.38.png对于这种情况,如果使用requests库的话,会抛出一个异常
import requests # package,只能调用__init__.py中的方法,要调用request.auth.py的方法,需要import request.auth
response = requests.get('https://www.12306.cn')
我们只需要设置verify参数为NO,就可以了,不再验证证书合法性
import requests # package,只能调用__init__.py中的方法,要调用request.auth.py的方法,需要import request.auth
response = requests.get('https://www.12306.cn', verify = False)
现在虽然验证成功了。但是发现log窗口依然会报一个警告,如下。
InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
InsecureRequestWarning)
将警告屏蔽掉不输出即可
import requests # package,只能调用__init__.py中的方法,要调用request.auth.py的方法,需要import request.auth
import urllib3
urllib3.disable_warnings()
response = requests.get('https://www.12306.cn', verify = False)
代理
import requests # package,只能调用__init__.py中的方法,要调用request.auth.py的方法,需要import request.auth
proxy = {
'http':'http://127.0.0.1:9734',
'https': 'https://127.0.0.1:9734'
}
response = requests.get('https:wwww.taobao.com', proxy = proxy)
http认证
有些网站访问的时候会弹出框提示用户输入账号和密码才能访问。这个就涉及到了http认证。即服务器查询用户是否有访问服务器资源的权限。
import requests # package,只能调用__init__.py中的方法,要调用request.auth.py的方法,需要import request.auth
import requests.auth
auth = requests.auth.HTTPBasicAuth('user','123'); # requests.auth.HTTPBasicAuth 对象创建
# print(type(auth))
r = requests.get('http://120.27.34.24',auth=auth)
超时设置
设置允许最大的超时时间,如果一旦这个超时时间内依然没有返回,那么程序就不能正常运行了。
import requests # package,只能调用__init__.py中的方法,要调用request.auth.py的方法,需要import request.auth
from requests.exceptions import ReadTimeout
try:
response = requests.get('http://httpbin.org/get', timeout = 0.5)
print(response.status_code)
except ReadTimeout:
print('Timeout')
异常处理
可以google requests,然后查看文档Exceptions,拿到所有的异常类
import requests.exceptions
try:
response = requests.get('http://httpbin.org/get', timeout = 0.1)
print(response.status_code)
except requests.exceptions.ReadTimeout:
print('Timeout')
except requests.exceptions.HTTPError:
print('HTTPError')
except requests.exceptions.ConnectionError:
print('ConnectionError')
参考
- post request body 的编码方式 http://www.cnblogs.com/aaronjs/p/4165049.html
- 有关https和证书 http://www.cnblogs.com/taomylife/p/4778009.html
网友评论