day3 ~ requests高级部分 & urllib简单介绍
import requests
# 定义上传文件数据, 键为file, 值为文件句柄
files = {
'file': open('favicon.ico', 'rb')
}
r = requests.post('http://httpbin.org/post', files=files)
print(res.text)
# cookie处理方式:
1.headers添加cookie键值对
2.RequestsCookieJar对象
# headers内添加cookie键值对处理cookie
import requests
url = 'https://www.baidu.com'
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36',
'Cookies':'BAIDUID=79A570F8D90B2C45E42D40A3666ADC46:FG=1; BIDUPSID=79A570F8D90B2C45E42D40A3666ADC46; PSTM=1551074009; BD_UPN=12314753; sugstore=0; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; yjs_js_security_passport=10c9ca61409abe70ac5c03db796f78648e697d8f_1563711806_js; COOKIE_SESSION=2860_2_2_7_3_5_0_0_2_4_106_0_3778_177561_116_109_1563714759_1563714752_1563714643%7C9%23177557_14_1563714643%7C7; delPer=0; BD_HOME=0; H_PS_PSSID=1452_21117_29522_29521_28519_29099_28831_29221'
}
res = requests.get(url=url, headers=headers)
res.encoding = 'utf-8'
with open('baidu_cookie.html', 'w', encoding='utf-8') as f:
f.write(res.text)
# RequestsCookieJar对象处理cookie: 用cookie维持百度登陆
import requests
cookies = 'BAIDUID=79A570F8D90B2C45E42D40A3666ADC46:FG=1; BIDUPSID=79A570F8D90B2C45E42D40A3666ADC46; PSTM=1551074009; BD_UPN=12314753; sugstore=0; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; yjs_js_security_passport=10c9ca61409abe70ac5c03db796f78648e697d8f_1563711806_js; COOKIE_SESSION=2860_2_2_7_3_5_0_0_2_4_106_0_3778_177561_116_109_1563714759_1563714752_1563714643%7C9%23177557_14_1563714643%7C7; delPer=0; BD_HOME=0; H_PS_PSSID=1452_21117_29522_29521_28519_29099_28831_29221; BDUSS=lSVnBVVkRVNFpNZ2ZJZ2ZpNFpjblFFSX5EaW9DNzBpcnNkaDZIQVdRd2Z1bHhkRVFBQUFBJCQAAAAAAAAAAAEAAABwfMtW09rQodPjMDgyMGZyZWUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8tNV0fLTVdYX'
jar = requests.cookies.RequestsCookieJar()
headers = {
'User-Agetn': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
}
for cookie in cookies.split(';'):
key, value = cookie.split('=', 1)
jar.set(key, value)
res = requests.get('http://www.baidu.com', cookies=jar, headers=headers)
print(res.text) # 响应数据中包含用户名信息, 说明cookie生效
# HTTP无状态:
使用requests模块中的get()和post()方法请求网页时, 每一次请求都是独立的, 没有连续请求之间的状态保持. 假象, 如果你登陆了淘宝后向查看订单, 那么如果没有状态的维持就无法实现.
# 会话的维持: Session对象
from requests import Session
s = Session()
res = s.get('https://www.baidu.com')
# 1.SSL证书验证
requests提供了证书验证的功能. 当发起HTTP请求时, 模块会检查SSL证书. 但检查的行为可以用verify参数来控制.
verify = False # 不检查SSL证书
verify = True # 检查SSL证书
# 2.异常
如果使用requests模块的SSL验证, 验证不通过会抛出异常, 此时可以将verify参数设置为False
# 3.www.12306.cn的证书验证
# 会抛出异常
import requests
response = requests.get('https://www.12306.cn')
print(response.status_code)
# 不抛异常, 但会出现警告
import requests
response = requests.get('https://www.12306.cn', verify=False)
print(response.status_code)
# 禁止警告
import requests
from requests.packages import urllib3
urllib3.disable_warnings()
response = requests.get(url='https://www.12306.cn', verify=False)
print(response.status_code)
# 代理: 代理即代理ip
代理ip是指在请求的过程中使用非本机ip进行请求, 避免大数据量频繁请求的过程中出现ip封禁, 限制数据的爬取.
# 代理ip分类:
1.透明代理ip: 请求时, 服务器知道请求的真实ip, 知道请求使用了代理
2.匿名代理ip: 请求时, 服务器知道请求使用了代理, 但不知道请求的真实ip
3.高匿代理ip: 请求时, 服务器不知道请求使用了代理, 也不知道请求的真实ip
# requests模块使用代理ip
import requests
url = 'http://www.httpbin.org'
proxies = {
'http': 'http://61.183.176.122:57210'
}
res = requests.get(url=url, proxies=proxies)
print(res.text)
# 超时设置:
由于网络状况的不同, 服务器配置差异以及服务器处理并发的能力不同, 有时会出现服务器的响应时间过长, 甚至无法获取响应而抛出异常. requests模块发送请求可以设置超时时间, 在超时时间内未得到响应, 便会抛出异常.
一方面, 减少了请求的阻塞时间, 一方面, 可以进行异常处理, 执行相应的操作.
import requests
url = 'https://www.baidu.com'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
}
res = requests.get(url=url, headers=headers, timeout=0.001) # 在0.001秒为得到响应, 抛出requests.exceptions.ConnectTimeout异常
print(res.text)
# 1.Prepared Request
利用 Prepared Request 数据结构构件Request对象. 其构建及使用步骤如下:
from requests import Request, Session
# 构建Request对象
url = '...'
data = {...
}
params = {...
}
headers = {...
}
session = Session()
# 构建post请求:
req_post = Request(method='POST', url=url, headers=headers, data=data)
req_obj_post = session.prepare_request(req_post)
# 构建get请求:
req_get = Request(method='GET', url=url, headers=headers, params=params)
req_obj_get = session.prepare_request(req_get)
# 利用构建的请求对象, 向服务器发送请求
res = session.send(req_obj_post)
res = session.send(req_obj_get)
# 应用:
通过此方法, 我们可以构建一个独立的request对象, 当需要请求的url很多时, 我们可以为每一个url构建一个request对象, 将所有request对象置于队列中, 便于调度.
# 构建request对象, 请求糗事百科获取页面
from requests import Request, Session
url = 'https://www.qiushibaike.com/'
headers = {
"User-Agent":'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
}
session = Session()
req_get = Request(url=url, headers=headers, method='GET')
req_get_obj = session.prepare_request(req_get)
res = session.send(req_get_obj)
res.encoding = 'utf-8'
with open('qb_reqobj.html', 'w', encoding='utf-8') as f:
f.write(res.text)
# urllib简介:
1.urllib模块是Python的一个请求模块
2.Python2中是urllib和urllib2相结合实现请求的发送. Python3中同一为urllib库
3.urllib是Python内置的请求库, 其包含4个模块:
(1).request模块: 模拟发送请求
(2).error模块: 异常处理模块
(3).parse模块: 工具模块, 提供关于URL的处理方法, 如拆分, 解析, 合并等
(4).robotparser模块: 识别robots协议
# 部分方法使用介绍:
on3中同一为urllib库
3.urllib是Python内置的请求库, 其包含4个模块:
(1).request模块: 模拟发送请求
(2).error模块: 异常处理模块
(3).parse模块: 工具模块, 提供关于URL的处理方法, 如拆分, 解析, 合并等
(4).robotparser模块: 识别robots协议
```Python
# 部分方法使用介绍: