python爬虫(二)-requests库学习总结
Requests是用python语言基于urllib编写的,但相对比于urllib.request库的繁琐,python提供了一套更为便捷的网络请求方法即requests库。
一.基本方法
1.GET请求
get这个API所写的底层函数如下,必须传参为URL,可选参数有params以及其他自定义等等,参数传入为字典形式,requests会自动编码成url形式。
查看源码:
(1)第一层源码
(2)具体可添加参顺如下:
实例应用如下:
import requests
url = "http://www.baidu.com/s?"# 请求头
header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36"}# 发送网络请求
params = {
"wd":"美女"
}#参数一般用字典形式,而且requests不需要转义
reponse = requests.get(url,params=params,headers = header)
data = reponse.content.decode()
with open("03.html","w",encoding="utf-8")as f:
f.write(data)
#优点:requests帮助我们自动转义编码
2.POST请求
实例:
import requests
data = {'name': 'germey', 'age': '22'}
r = requests.post("http://httpbin.org/post", data=data)
print(r.text)
利用response的api可以看到相关状态码以及请求头,cookies等信息。
二.高级方法
1.文件上传
import requests
files = {'file': open('favicon.ico', 'rb')}
r = requests.post("http://httpbin.org/post", files=files)
print(r.text)
2.cookies获取
import requests
r = requests.get("https://www.baidu.com")
print(r.cookies)#获取得到的cookies信息
for key, value in r.cookies.items():
print(key + '=' + value)#对一长串信息进行分段处理
这里我们首先调用cookies属性即可成功得到Cookies,可以发现它是RequestCookieJar类型。然后用items()方法将其转化为元组组成的列表,遍历输出每一个Cookie的名称和值,实现Cookie的遍历解析。
对于需要用cookies进行访问的网页,有两种解决方式:
(1)将cookies写入headers中
import requests
headers = {
'Cookie': 'q_c1=31653b264a074fc9a57816d1ea93ed8b|1474273938000|1474273938000; d_c0="AGDAs254kAqPTr6NW1U3XTLFzKhMPQ6H_nc=|1474273938"; __utmv=51854390.100-1|2=registration_date=20130902=1^3=entry_date=20130902=1;a_t="2.0AACAfbwdAAAXAAAAso0QWAAAgH28HQAAAGDAs254kAoXAAAAYQJVTQ4FCVgA360us8BAklzLYNEHUd6kmHtRQX5a6hiZxKCynnycerLQ3gIkoJLOCQ==";z_c0=Mi4wQUFDQWZid2RBQUFBWU1DemJuaVFDaGNBQUFCaEFsVk5EZ1VKV0FEZnJTNnp3RUNTWE10ZzBRZFIzcVNZZTFGQmZn|1474887858|64b4d4234a21de774c42c837fe0b672fdb5763b0',
'Host': 'www.zhihu.com',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36',
}
r = requests.get('https://www.zhihu.com', headers=headers)
print(r.text)
(2)将cookies直接作为参数传给get请求网络访问的api
import requests
cookies = 'q_c1=31653b264a074fc9a57816d1ea93ed8b|1474273938000|1474273938000; d_c0="AGDAs254kAqPTr6NW1U3XTLFzKhMPQ6H_nc=|1474273938"; __utmv=51854390.100-1|2=registration_date=20130902=1^3=entry_date=20130902=1;a_t="2.0AACAfbwdAAAXAAAAso0QWAAAgH28HQAAAGDAs254kAoXAAAAYQJVTQ4FCVgA360us8BAklzLYNEHUd6kmHtRQX5a6hiZxKCynnycerLQ3gIkoJLOCQ==";z_c0=Mi4wQUFDQWZid2RBQUFBWU1DemJuaVFDaGNBQUFCaEFsVk5EZ1VKV0FEZnJTNnp3RUNTWE10ZzBRZFIzcVNZZTFGQmZn|1474887858|64b4d4234a21de774c42c837fe0b672fdb5763b0'
jar = requests.cookies.RequestsCookieJar()
headers = {
'Host': 'www.zhihu.com',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36'
}
for cookie in cookies.split(';'):
key, value = cookie.split('=', 1)
jar.set(key, value)
r = requests.get("http://www.zhihu.com", cookies=jar, headers=headers)
print(r.text)
此时的关键是利用RequestsCookieJar()对象将复制来的cookies承接,然后对其进行分割key, value = cookie.split(’=’, 1),之后重新设置回jar中,在直接传给get参数。
3.会话维持
一次post,一次get如果用到相同cookie,都手动添加的方法显然比较麻烦,于是会话维持的出现就可以很好的解决这一问题,利用session。
#利用session访问个人中心
import requests
url = "https://www.yaozh.com/member/"# 请求头
header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36"}# 发送网络请求
#1。代码登陆,保存cookie
#session类,,可以保存cookie(他底层就是封装的cookiejar)
session= requests.session()#登陆的url
login_in = "https://www.yaozh.com/login/"
#2拿着保存的cookie去访问个人中心的界面# 拼接参数
login_form_datda ={
'username': '*****',
'pwd': '*********',
'formhash':'*****',
'backurl':'*********'
}
loginres = session.post(login_in,data=login_form_datda,headers = header,verify = False)
print(loginres.content.decode())#保存cookie,查看
messurl = "https://www.yaozh.com/member/"
data = session.get(messurl,headers = header,verify = False).content.decode()#直接利用session继续请求数据,其自带含有刚刚请求到的cookie
with open("02.html","w",encoding="utf-8")as f:
f.write(data)
4.ssl证书验证
当发送HTTP请求的时候,它会检查SSL证书,我们可以使用verify参数控制是否检查此证书。其实如果不加verify参数的话,默认是True,会自动验证。解决方法如下:
(1)改为False终止验证
import requests
response = requests.get('https://www.12306.cn', verify=False)
print(response.status_code)
(2)指定一个本地客户端证书
要包含证书和**二者的路径即可
import requests
response = requests.get('https://www.12306.cn', cert=('/path/server.crt', '/path/key'))
print(response.status_code)
5.代理设置
将代理的ip直接以字典方式给出,传入get参数中即可
import requests
url = "http://www.baidu.com/"# 请求头
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36"}# 发送网络请求
freeproxy = {"http":"192.165.12.3:9999"}
requests.get(url=url,headers=headers,proxies = freeproxy)
print(requests.status_codes)
6.超时设置
分别指定情况
r = requests.get('https://www.taobao.com', timeout=(5,11, 30))
7.身份认证
即需要输入用户名和密码的情况
import requests
from requests.auth import HTTPBasicAuth
r = requests.get('http://localhost:5000', auth=HTTPBasicAuth('username', 'password'))
print(r.status_code)
利用auth这个api
8.Prepared Request(个人没有用过)
前面介绍urllib时,我们可以将请求表示为数据结构,其中各个参数都可以通过一个Request对象来表示。这在requests里同样可以做到,这个数据结构就叫Prepared Request。我们用实例看一下:
from requests import Request, Session
url = 'http://httpbin.org/post'
data = {
'name': 'germey'
}
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36'
}
s = Session()
req = Request('POST', url, data=data, headers=headers)
prepped = s.prepare_request(req)
r = s.send(prepped)
print(r.text)
很多内容还是从崔神哪里学来的依旧附上链接:https://cuiqingcai.com/5523.html
感谢大神~~~