python爬虫(二)-requests库学习总结

Requests是用python语言基于urllib编写的,但相对比于urllib.request库的繁琐,python提供了一套更为便捷的网络请求方法即requests库。

一.基本方法

1.GET请求
get这个API所写的底层函数如下,必须传参为URL,可选参数有params以及其他自定义等等,参数传入为字典形式,requests会自动编码成url形式。
查看源码:
(1)第一层源码
python爬虫(二)-requests库学习总结
(2)具体可添加参顺如下:
python爬虫(二)-requests库学习总结
实例应用如下:

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
感谢大神~~~