requests高级部分 urllib简单介绍

1. requests高级用法

1.1 文件上传功能

import requests
​
# 定义上传文件数据, 键为file, 值为文件句柄
f=open('filepath','rb')
files = {
'file':f
}
r = requests.post(url=url,headers = headers,files=files)
print(res.text)

 

1.2 cookie处理


# cookie处理方式:
    1.headers添加cookie键值对
    2.RequestsCookieJar对象
                3.session类自动封装cookie

# 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生效

 

1.3 会话维持

# HTTP无状态:
    使用requests模块中的get()和post()方法请求网页时, 每一次请求都是独立的, 没有连续请求之间的状态保持. 假象, 如果你登陆了淘宝后向查看订单, 那么如果没有状态的维持就无法实现.
    
# 会话的维持: Session对象
from requests import Session
s = Session()
res = s.get('https://www.baidu.com')
​

 

1.4 SSL证书验证


# 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)

  

1.5 代理设置

# 代理: 代理即代理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)

 

1.6 超时设置

# 超时设置:
    由于网络状况的不同, 服务器配置差异以及服务器处理并发的能力不同, 有时会出现服务器的响应时间过长, 甚至无法获取响应而抛出异常. 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.7 构建Request对象


# 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)

 

 


2. urllib简单介绍

# urllib简介:
1.urllib模块是Python的一个请求模块
2.Python2中是urllib和urllib2相结合实现请求的发送. Python3中同一为urllib库
3.urllib是Python内置的请求库, 其包含4个模块:
(1).request模块: 模拟发送请求
(2).error模块: 异常处理模块
(3).parse模块: 工具模块, 提供关于URL的处理方法, 如拆分, 解析, 合并等
(4).robotparser模块: 识别robots协议

  

 

 

posted @ 2020-09-09 11:30  高登汗  阅读(228)  评论(0编辑  收藏  举报