day03

day3 ~ requests高级部分 & urllib简单介绍

文章目录

    • @[toc]
    • 1. requests高级用法
        • 1.1 文件上传功能
        • 1.2 cookie处理
        • 1.3 会话维持
        • 1.4 SSL证书验证
        • 1.5 代理设置
        • 1.6 超时设置
        • 1.7 构建Request对象
    • 2. urllib简单介绍

1. requests高级用法

1.1 文件上传功能

import requests

# 定义上传文件数据, 键为file, 值为文件句柄
files = {
'file': open('favicon.ico', 'rb')
}
r = requests.post('http://httpbin.org/post', files=files)
print(res.text)

1.2 cookie处理

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

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协议
# 部分方法使用介绍:

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


```Python
# 部分方法使用介绍:

你可能感兴趣的:(day03)