requests库的基本用法
get请求
import requests
r = requests.get('网址') # 返回一个Response对象它有好几个属性可以参考源码[链接]
#(https://requests.readthedocs.io/zh_CN/latest/_modules/requests/models.html#Response)
#在这说几个常用的属性
r.text # 网页的内容(字符串形式)
r.content # 网页的内容(二进制形式)
r.status_code # http的响应状态码(知道200为请求成功,其它为请求出现问题即可)
#requests中封装了各个响应状态码在requests.codes中。例如:requests.codes.ok(200)
r.raise_for_status # 如果请求出现错误用它来抛出异常,请求成功则为None。
r.headers # 响应头
r.encoding # 判断网页的编码方式,也可以用这个属性来更改编码方式
r.url # 请求的网址
r.cookie # 可以访问响应返回的cookie
r.json() # 如果响应为json则可以用这个方法直接接收
get请求中有一个params参数给它的数据类型为字典类型,它的作用是给url添加查询字符串的。
示例:
在百度搜索Python得到的链接为 https://www.baidu.com/s?ie=UTF-8&wd=Python
?后面的内容就是查询字符串它是以键值对的形式表示的。查询字符串分为两种被动参数和活动参数,被动参数对页面内容没有影响是网站用来访问分析的,附带与不附带没有区别,如上面的:ie=utf-8就是被动参数。活动参数关系到页面的内容,如:wd = Python。因此下面的示例我们需要设置活动参数的键值对就可以了。
import requests
key = input('输入百度搜索关键字\n')
dicts={
'wd':key
}
headers = 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:84.0) Gecko/20100101 Firefox/84.0'
r = requests.get('http://www.baidu.com/s',params=dicts)
print(r.status_code)
print(r.url)
print(r.text)
结果:
带请求头的get请求
请求头的作用是告诉被请求的服务器,请求的来源的一些信息。有的网站如果没有请求头可能就会拒绝访问,因为你在明目张胆的告诉人家你是爬虫,正常的浏览器请求都有请求头,包含请求的浏览器是啥,系统是什么等。
注意: 所有的 header 值必须是 string、bytestring 或者 unicode。尽管传递 unicode header 也是允许的,但不建议这样做。
import requests
header = {"user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36"}
# 请求头是一个字典
r = requests.get(url='网址',headers=header)
print(r.status_code)
带cookie的get请求
第一种方式
import requests
header = {"user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36",
"cookie":"放网页的rquest的cookie"
}
# 请求头是一个字典
r = requests.get(url='网址',headers=header)
print(r.status_code)
第二种方式是使用在get请求中加入cookies参数,参数的类型为字典。
r = requests.get(url, cookies=cookies)
post请求
header = {"user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36"}
# 请求头是一个字典
data={
} # 字典内容从网页查看,必要的输入
r = requests.post('网址',headers=header,data=data)
data传的参数可以是字典、元组列表。
示例:
网址为百度翻译查看network找到post请求发送的内容。
返回的响应是json格式
data={
'kw': "Python"
}
r = requests.post('https://fanyi.baidu.com/sug',headers=header,data=data)
text = r.json() # 因为返回的响应是json格式所以用json方法接收
print(text)
使用post请求上传文件
url = 'http://httpbin.org/post'
files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=files)
r.text
输出:
{
...
"files": {
"file": "<censored...binary...data>"
},
...
}