9.Python爬虫利器一之Requests库的用法(一)

requests 官方文档:html

http://cn.python-requests.org/zh_CN/latest/user/quickstart.htmlpython

request 是一个第三方的HTTP库json

 

1.发起请求浏览器

发起GET请求很是简单,直接使用requests的get方法便可。比方说下面的代码获取百度首页的信息。服务器

1 import requests
2 
3 baidu_url = 'https://www.baidu.com'
4 
5 response = requests.get(baidu_url)
6 print(response.content.decode())
若是要在URL上附加参数,也很是简单,使用params参数传入字典便可。参数会自动附加到URL上,列表参数也会正确的附加。这里这个网站是一个HTTP调试网站,值得收藏。若是咱们访问这个网站,它会将浏览器发送的请求头,用户代理、表单参数等信息以格式化JSON形式返回,对HTTP调试很是有帮助。
1 #基本Get请求
2 r = requests.get('http://httpbin.org/get')
3 #若是要加参数,能够利用params参数
4 payload = {'key1':'values','key2':'valus'}
5 r = requests.get('http://httpbin.org/get',params=payload)
6 print r.url

其余经常使用的HTTP操做例如PUT、DELETE、HEAD、OPTIONS等也支持,调用相应方法便可。cookie

获取结果

发起请求以后,返回值是一个Response对象,利用它咱们能够方便的获取结果。数据结构

响应对象的经常使用属性和方法以下。app

属性名 结果
text HTTP字符
encoding 响应编码,这个值能够改变,改变以后text属性也会根据编码而变化
content 未编码的二进制数据
json() 返回JSON数据
raw 结果的原始字节流
url 请求的URL
status_code 状态码
headers 请求头字典
cookies cookies字典
history 若是发生重定向,全部请求对象都会保存到这里
r.status_code #响应状态码
r.raw #返回原始响应体,也就是 urllib 的 response 对象,使用 r.raw.read() 读取
r.content #字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩
r.text #字符串方式的响应体,会自动根据响应头部的字符编码进行解码
r.headers #以字典对象存储服务器响应头,可是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
#*特殊方法*#
r.json() #Requests中内置的JSON解码器
r.raise_for_status() #失败请求(非200响应)抛出异常

自定义header

若是要在请求上添加请求头,也很是简单。有些网站对客户端的限制比较严格,因此咱们必须假装header。post

1 #若是想添加headers 能够传入headers参数
2 headers = {'content-type':'application/jason'}
3 r = requests.get('http://httpbin.org/get',headers = headers)
4 print r.url

假如使用自带的urllib标准库,那么代码就比较复杂了。从这里咱们能够看到requests确实很是方便。网站

headers = {'content-type':'application/jason'}
r = urllib2.request(url,headers = headers)
response = urllib2.urlopen(r)
print response.read().decode()

 

POST数据

若是咱们要发送复杂的表单,就须要POST数据了。和GET传送数据同样,想方法中额外添加一个data参数的事儿。这种方式至关于你在表单中填写这些数据,而后点击表单的提交。

data = {
    'name': 'yitian',
    'age': 22,
    'friends': ['zhang3', 'li4']
}
response = requests.post(f'{base_url}post', data=data)
print(response.text)

 

有时候POST数据不是使用表单方式,而是直接在请求体中附加参数。那么咱们在发送参数的时候不能向data参数添加字典了,而应该传递字符串。

import json

data = {
    'name': 'yitian',
    'age': 22,
    'friends': ['zhang3', 'li4']
}
response = requests.post(f'{base_url}post', data=json.dumps(data))
print(response.text)

备注: json的几个经常使用方法 json.load(), json.dump() ,json.loads(), json.dumps()

json.loads() : 将json结构转变成Python数据结构

json.dumps():将Python数据结构转变成json结构

json.load(): 读取json文件转成Python数据结构

json.dumps():写入jason文件

 

参考自: https://python3-cookbook.readthedocs.io/zh_CN/latest/c06/p02_read-write_json_data.html

有些程序(例如Github的API)须要将JSON字符串直接当作请求体发送,好比说上面这种将字典转换为JSON的例子。在这种状况下,咱们能够直接将字典的引用传递给方法的json参数,这样就不须要咱们手动转换,requests会自动转换。

response = requests.post(f'{base_url}post', json=data)

上传文件

在网页上,上传头像等操做都须要上传multipart/form-data类型的表单。使用requests也很是简单。须要注意打开文件的时候最好使用二进制模式,使用文本模式打开文件可能致使requests不能正确计算文件的大小。

file = open(r'c:\Windows\System32\drivers\etc\hosts', mode='rb')

data = {
    'file': file
}

response = requests.post(f'{base_url}post', files=data)
print(response.text)
#requests 支持流失上传的,容许发送大的数据流或文件而无需先把他读入内存。需使用流式上传
with open('massive-body') as f:
    requests.post('http://some.url/streamed',data=f)

cookies

若是要获取响应的cookies,调用cookies属性便可,它会返回一个RequestsCookieJar对象,它实现了标准库的http.cookiejar。因此咱们能够按照cookiejar的方法来使用RequestsCookieJar。好比说访问百度的时候,它会分配一个cookie,因此咱们可使用下面的代码获取Cookie。

response = requests.get(baidu_url)
print(response.cookies)

若是要在发送数据的时候向服务器传递cookie,须要实例化一个RequestsCookieJar,而后传递给发送方法的cookies参数。

import requests.cookies

cookies = requests.cookies.RequestsCookieJar()
cookies.set('name', 'yitian')
response = requests.get(f'{base_url}cookies', cookies=cookies)
print(response.text)

 

以上就是requests的快速入门。具体的高级应用能够参考官方文档。

相关文章
相关标签/搜索