首页 > Python资料 博客日记
《探索Python Requests中的代理应用与实践》
2024-07-12 14:30:02Python资料围观111次
文章《探索Python Requests中的代理应用与实践》分享给大家,欢迎收藏Python资料网,专注分享技术知识
requests加代理
高匿API代理
此处使用的小象代理:1元100个,便宜,可以购买尝试加下代理
存活期1到2分钟
import time
import requests
from lxml import etree
response = requests.get('https://api.xiaoxiangdaili.com/ip/get?appKey=1128886144755716096&appSecret=2ICgJR7q&cnt=&wt=json&method=https&city=&province=').json()
for ip in response['data']:
proxy = f'http://{ip["ip"]}:{ip["port"]}'
print(proxy)
proxies = {
'http': proxy,
'https': proxy
}
# 加代理
# requests是proxies: {
# 'http': proxy,
# 'https': proxy
# }
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0'
}
source = requests.get('https://tool.lu/ip/', proxies=proxies, headers=headers).content.decode('utf-8')
# source = requests.get('https://tool.lu/ip/', headers=headers).content.decode('utf-8')
IP = etree.HTML(source).xpath("//form[@id='main_form']/p[1]/text()")
print(f"IP: {IP}")
注意:
proxies = {
'http': proxy,
'https': proxy
}
这个指的是代理服务商提供的代理服务器支持什么请求,两个都加比较保险。
如果代理服务器支持http,但你发送https请求,代理服务器不会对你的请求进行转发,但是会消耗你的代理IP
隧道代理(短效版)
此处用的小象代理,1元1小时,便宜,可以尝试加下代理
介绍:
隧道代理,一分钟自动更换IP,不需要人为搭建代理IP池去加代理IP。
隧道代理有并发请求限制,默认每秒允许 5 个请求。
也可以手动切换代理IP(但切换间隔最低10秒):可以爬取网站报错时尝试手动切换IP。
但一般一分钟自动切换已经很快了
弊端:
- 有的网站跳转使它的代理IP加不上,但代理服务商提供的接口文档提供了解决方案
from lxml import etree
import requests
target_url = "https://tool.lu/ip/"
proxy_host = 'http-short.xiaoxiangdaili.com'
proxy_port = 10010
proxy_username = '1128907524343746560'
proxy_pwd = 'wZ3WMRtm'
proxyMeta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % {
"host": proxy_host,
"port": proxy_port,
"user": proxy_username,
"pass": proxy_pwd,
}
proxies = {
'http': proxyMeta,
'https': proxyMeta,
}
try:
# 设置手动切换IP
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0',
'Proxy-Switch-Ip': 'true'
}
source = requests.get(url=target_url, proxies=proxies, headers=headers).content.decode('utf-8')
IP = etree.HTML(source).xpath("//form[@id='main_form']/p[1]/text()")
print(f"IP: {IP}")
# IP: ['你的外网IP地址是:110.88.30.181']
# IP: ['你的外网IP地址是:49.74.88.38']
except Exception as e:
print(e)
隧道代理(动态转发版)
隧道代理(动态转发)无须自己提取代理IP,在用户隧道内每一个请求通过一个随机 IP 进行转发,也就是ip存活时间不长。
弊端:
- IP存活时间不长
适用:
- 如果网站只是单纯的封ip,而不以IP生成cookie,并用cookie进行登录抓取数据,可以用动态转发版。
高匿API代理和隧道代理(短效版)
-
高匿API代理:可以取出来IP并看到,按量或按时购买
-
隧道代理:无法取出来IP并看到,隧道帮你切,只能按时购买
部署一个属于自己的可以获取代理IP的服务器
- 用户
- 调用普通服务器的IP加端口号,获取代理IP
- 普通服务器
- 开设一个端口:用来接受拨号服务器发来的IP
- 再开设一个端口:用来展示接受到的IP
- vps动态拨号服务器
- 拨号上网,关闭网络,之后服务器更换一次IP。
- 用miniproxy软件占用一个端口进行请求转发。
- 服务器有一套程序获取自身IP地址,利用socket协议与普通服务器进行通信,向普通服务器发送我们的IP,每更换一次IP就发送一次。
野生代理
市面上有野生代理,安全性低、稳定性差,不能用
来源:
- 黑客攻击别人电脑,在别人电脑开设端口:设置转发请求服务
- 如果别人电脑是个小服务器,可能IP可用时间还长点
- 如果别人电脑是个私人电脑,关机你就没法用了
- 代理服务器未知,可能会获取你的请求携带的隐私
刷票
刷票程序一般根据IP进行票数计算,可以根据代理IP进行刷票
简易代理IP池
此处用到redis数据库作为IP池
这个只是简易代理IP池,理解其思想即可,后续我会发布一个复杂代理IP池,是一个项目,可以用于实战的。
思想:
add_IP:如果IP池少于5,则补充,补充的IP初始分数为0
get_IP:取出一个代理IP,进行访问,访问失败,则分数加1,若分数小于3则插回IP池,若分数大于等于3则舍弃
-
代理IP池的补充
import time import requests import redis # 建立redis连接 r = redis.Redis(host='127.0.0.1', port=6379, db=4, decode_responses=True) # decode_responses=True: redis中存储二进制数据, True表示取出数据自动进行解码 while True: if r.llen("my_proxy") < 5: response = requests.get( 'https://api.xiaoxiangdaili.com/ip/get?appKey=1128886144755716096&appSecret=2ICgJR7q&cnt=5&wt=json&method=https&city=&province=').json() for ip in response['data']: proxy = f'{ip["ip"]}:{ip["port"]}|0' r.lpush('my_proxy', proxy) else: print("代理IP池已经满了") time.sleep(5)
-
代理IP池的弹出使用
import time import requests from lxml import etree import redis # 建立redis连接 r = redis.Redis(host='127.0.0.1', port=6379, db=4, decode_responses=True) while True: try: # 取出代理IP rr = r.rpop('my_proxy').split('|') ip = rr[0] score = int(rr[1]) # 添加代理IP proxy = f'http://{ip}' proxies = { 'http': proxy, 'https': proxy } print(f"代理IP: {proxy}") # 加代理 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0' } source = requests.get('https://tool.lu/ip/', proxies=proxies, headers=headers) # source = requests.get('https://tool.lu/ip/', headers=headers).content.decode('utf-8') except Exception as e: print(e) if score < 3: score += 1 print(f'请求{ip}出错,分数为:{score}') r.lpush('my_proxy', f'{ip}|{score}') else: print(f'舍弃{ip}') continue IP = etree.HTML(source.content.decode('utf-8')).xpath("//form[@id='main_form']/p[1]/text()") print(f"IP: {IP}") print(f"状态码:{source.status_code}") if source.status_code in (200, 302): r.lpush('my_proxy', f'{ip}|0') else: if score < 3: score += 1 print(f'请求{ip}出错,分数为:{score}') r.lpush('my_proxy', f'{ip}|{score}') else: print(f'舍弃{ip}')
更多精致内容
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
相关文章
最新发布
- 【Python】selenium安装+Microsoft Edge驱动器下载配置流程
- Python 中自动打开网页并点击[自动化脚本],Selenium
- Anaconda基础使用
- 【Python】成功解决 TypeError: ‘<‘ not supported between instances of ‘str’ and ‘int’
- manim边学边做--三维的点和线
- CPython是最常用的Python解释器之一,也是Python官方实现。它是用C语言编写的,旨在提供一个高效且易于使用的Python解释器。
- Anaconda安装配置Jupyter(2024最新版)
- Python中读取Excel最快的几种方法!
- Python某城市美食商家爬虫数据可视化分析和推荐查询系统毕业设计论文开题报告
- 如何使用 Python 批量检测和转换 JSONL 文件编码为 UTF-8
点击排行
- 版本匹配指南:Numpy版本和Python版本的对应关系
- 版本匹配指南:PyTorch版本、torchvision 版本和Python版本的对应关系
- Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO
- 相关性分析——Pearson相关系数+热力图(附data和Python完整代码)
- Anaconda版本和Python版本对应关系(持续更新...)
- Python与PyTorch的版本对应
- Windows上安装 Python 环境并配置环境变量 (超详细教程)
- Python pyinstaller打包exe最完整教程