一、requests其他操作
1.requests之ssl
https=http+ssl(ssl证书:第三方证书):传输过程中加密了,可以截获到。
大部分网站都是https,需要证书验证,代码怎么改进呢?
解决:
1、强制使用http连接不验证证书
verify=False
2、携带上证书
cert=('/path/server.crt', '/path/key')
示例:
import requests
respone = requests.get('https://www.12306.cn') # 如果是ssl请求,首先检查证书是否合法,不合法则报错,程序终端
# 改进1:去掉报错,但是会报警告
import requests
respone=requests.get('https://www.12306.cn',verify=False) #不验证证书,报警告,返回200
print(respone.status_code)
# 改进2:去掉报错,并且去掉警报信息
import requests
from requests.packages import urllib3
urllib3.disable_warnings() #关闭警告
respone=requests.get('https://www.12306.cn',verify=False)
print(respone.status_code)
# 改进3:加上证书
# 很多网站都是https,但是不用证书也可以访问,大多数情况都是可以携带也可以不携带证书
# 知乎、百度等都是可带可不带
# 有硬性要求的,则必须带,比如对于定向的用户,拿到证书后才有权限访问某个特定网站
import requests
respone = requests.get('https://www.12306.cn',
cert=('/path/server.crt',
'/path/key'))
print(respone.status_code)
2.requests之超时设置
加上timeout参数
import requests
respone=requests.get('http://127.0.0.1:8000',timeout=3)
print(respone.status_code)
3.requests之异常处理
加上try...except...
import requests
from requests.exceptions import *
try:
respone = requests.get('http://127.0.0.1:8000', timeout=3)
print(respone.status_code)
except ReadTimeout:
print('===:')
except ConnectionError: # 网络不通
print('-----')
except Timeout:
print('aaaaa')
except RequestException:
print('Error')
except Exception as e:
print(e)
4.requests之上传文件
加上参数files
import requests
files = {'file': open('a.jpg', 'rb')}
respone = requests.post('http://httpbin.org/post', files=files)
print(respone.status_code)
补充:
老款的路由器的认证 ,公司内部可能会看到
import requests
from requests.auth import HTTPBasicAuth
r=requests.get('xxx',auth=HTTPBasicAuth('user','password'))
print(r.status_code)
# HTTPBasicAuth可以简写为如下格式
r=requests.get('xxx',auth=('user','password'))
print(r.status_code)
requests与其他服务交互的实际应用---->短链生成

二、requests使用代理
为什么使用代理?
因为网站访问频率过高,会封ip、限制ip访问次数(后端频率类)。
使用代理,隐藏访问者ip(正向代理)
代理服务器
- 免费的:不稳定,不好用
- 收费:稳定,好用
示例:
import requests
proxies = {'http': 'http://117.68.194.189:1133', }
response=requests.get('http://127.0.0.1:8000/',proxies=proxies)
print(response.text)
目前写死了,后期我想,每次访问,随机取一个,把一堆字典,放到列表中,每次从列表中取一个(简单的代理池)
自己爬取免费代理网站,解析出ip地址,组装成字典。
# 基于别人开源的项目,搭建一个可用的代理池 (python+flask+爬虫+redis)
from threading import Thread
def task():
res = requests.get('http://demo.spiderpy.cn/get/').json()['proxy']
print(res)
for i in range(10000):
t = Thread(target=task)
t.start()
搭建免费代理池:
1、下载代码
git clone https://github.com/jhao104/proxy_pool.git
2、安装依赖
pip3 install -r requirements.txt
3、修改setting.py中的redis连接
DB_CONN = 'redis://127.0.0.1:6379/2'

4、运行
- 启动调度程序:
python proxyPool.py schedule - 启动webApi服务:
python proxyPool.py server
三、实际应用
1.Peer Video
import requests
import re
res = requests.get('https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=9&start=0')
# print(res.text)
# 解析出视频地址 re
video_list = re.findall('<a href="(.*?)" class="vervideo-lilink actplay">', res.text)
# print(video_list)
for video in video_list:
video_id = video.split('_')[-1]
video_url = 'https://www.pearvideo.com/' + video
# print(video_url)
# res=requests.get(video_url)
# print(res.text)
#
# break
# 第一层反爬,需要带referfer头
header = {
'Referer': 'https://www.pearvideo.com/%s' % video
}
# print(video_id)
res = requests.get('https://www.pearvideo.com/videoStatus.jsp?contId=%s&mrd=0.4930470461853751' % video_id,
headers=header)
mp4_url = res.json()['videoInfo']['videos']['srcUrl']
mp4_url = mp4_url.replace(mp4_url.split('/')[-1].split('-')[0], 'cont-%s' % video_id)
# 下载视频
res_video = requests.get(mp4_url)
with open('./viode/%s.mp4' % video_id, 'wb') as f:
for line in res_video.iter_content(1024):
f.write(line)
"""
不能播放的:
https://video.pearvideo.com/mp4/third/20211014/ 1634271064903 -11980839-104649-hd.mp4
https://video.pearvideo.com/mp4/third/20211014/ cont-1743691 -11980839-104649-hd.mp4
# mp4_url='https://video.pearvideo.com/mp4/third/20211014/ 1634271064903 -11980839-104649-hd.mp4'
# mp4_url=mp4_url.replace(mp4_url.split('/')[-1].split('-')[0],'cont-%s'%video_id)
"""
注:
页面解析出视频地址不能直接播放,需要进一步处理;
第一层反爬,需要带referfer头。
多线程爬取:
import requests
import re
from concurrent.futures import ThreadPoolExecutor
def get_page(url, vid):
res_video = requests.get(url)
return {'res_video': res_video, 'vid': vid}
def parse_page(result):
# 下载视频
result = result.result()
with open('./video/%s.mp4' % result['vid'], 'wb') as f:
for line in result['res_video'].iter_content(1024):
f.write(line)
def callback():
# 获得一个线程池对象 = 开启线程池
tp = ThreadPoolExecutor(10)
# 循环urls列表
res = requests.get('https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=9&start=0')
video_list = re.findall('<a href="(.*?)" class="vervideo-lilink actplay">', res.text)
for video in video_list:
video_id = video.split('_')[-1]
# 第一层反爬,需要带referfer头
header = {
'Referer': 'https://www.pearvideo.com/%s' % video
}
res = requests.get('https://www.pearvideo.com/videoStatus.jsp?contId=%s&mrd=0.4930470461853751' % video_id,
headers=header)
mp4_url = res.json()['videoInfo']['videos']['srcUrl'].replace(
res.json()['videoInfo']['videos']['srcUrl'].split('/')[-1].split('-')[0], 'cont-%s' % video_id)
# 得到一个future对象 = 把每一个url提交一个get_page任务
ret = tp.submit(get_page, mp4_url, video_id)
# 给future对象绑定一个parse_page回调函数
ret.add_done_callback(parse_page) # 谁先回来谁就先写结果进文件
if __name__ == '__main__':
callback()
2.AutoHome
使用bs4解析html
安装:pip3 install beautifulsoup4
import requests
from bs4 import BeautifulSoup
res = requests.get('https://www.autohome.com.cn/news/1/#liststart')
# print(res.text)
# 第一个参数,要解析的文档,第二个参数,解析的解析器('html.parser')
soup = BeautifulSoup(res.text, 'html.parser')
# res=soup.find_all(class_='article',name='ul')
ul_list = soup.find_all(name='ul')
for ul in ul_list:
li_list = ul.find_all(name='li')
for li in li_list:
h3 = li.find(name='h3')
if h3:
title = h3.text # 拿出h3标签的文本内容
# print(title)
url = 'http:' + li.find('a').attrs['href']
# print(url)
img_url = li.find(name='img').attrs['src']
# print(img_url)
desc = li.find('p').text
# print(desc)
print('''
新闻标题:%s
新闻连接:%s
新闻图片:%s
新闻摘要:%s
''' % (title, url, img_url, desc))
# 入库:mysql,建表,字段,pymysql
总结:
requests模块其他操作
-
模拟发送http请求的模块---->原来从浏览器中发出的请求,使用它模拟---->解析
-
ssl认证
-
基本认证
-
超时
-
异常处理
-
代理(重点)
反向代理,正向代理
正向代理:http、https代理,透明和高匿,透明是不隐藏客户端ip
http的请求头中,X-Forwarded-For:client, proxy1, proxy2 -
代理池
每次随机从代理池中取一个代理
使用第三方:爬免费的,放到redis中 -
cookie池
登录认证过后的cookie -
上传文件
-
Peer Video
视频 xx.mp4 放在了返回的数据中
两层反爬:referer,视频真正的地址和返回的地址是不一样的 -
AutoHome
bs4的基本使用:find、find_all -
西瓜Video----搜索mp4----解析json----base64解码----视频、音频分轨----音视频合并(使用ffmpeg)
本文详细介绍了requests模块的使用,包括SSL证书处理、超时设置、异常处理和文件上传。重点讨论了代理的运用,解释了为何需要代理,提供了代理服务器的实例,并简单介绍了如何搭建和使用代理池。同时,文中分享了requests在实际应用中的案例,如Peer Video和AutoHome的抓取,涉及到视频解析、多线程爬取以及网页内容解析等技巧。
2190

被折叠的 条评论
为什么被折叠?



