浅谈网络代理 proxy

总会有各种各样需要用到代理的场景

比如批量提交漏洞、批量注册、批量扫描....
简单总结一下

代理简介

IP 代理是一种网络技术,通过这种技术,用户可以隐藏其真实的 IP 地址,并使用另一个 IP 地址来代表自己进行互联网上的活动。IP 代理通常由第三方提供,用户通过连接到代理服务器,使得所有的网络请求都经过代理服务器转发,从而达到隐藏真实 IP 地址的目的

http、https和socks代理

用知乎上面的一张图

HTTP代理适合web端的代理,HTTPS代理添加了加密层
SOCKS代理支持的协议和适用范围最广

代码使用代理

代码里面使用代理很简单,以python requests为例,添加proxies参数即可

proxies = {'http': 'socks5://ip:port', 'https': 'socks5://ip:port'}
r = requests.get('https://www.taobao.com/help/getip.php', proxies=proxies, timeout=3)
print(r.text)

测试代理的可用性

访问这个地址 https://www.taobao.com/help/getip.php 会显示你当前的IP
通过判断IP是否切换、是否正常访问该网址,就可以知道代理是否可用

也可以使用快代理的接口 https://dev.kdlapi.com/testproxy 进行测试

需要认证的代理(以快代理为例

各大代理厂商已经给我们写好了demo

#!/usr/bin/env python
# -*- coding: utf-8 -*-"""使用requests请求代理服务器
请求http和https网页均适用
"""import requests
import randompage_url = "https://dev.kdlapi.com/testproxy"  # 要访问的目标网页# API接口,返回格式为json
api_url = "api_url"# API接口返回的ip
proxy_ip = requests.get(api_url).json()['data']['proxy_list']# 用户名密码认证(私密代理/独享代理)
username = "username"
password = "password"proxies = {"http": "http://%(user)s:%(pwd)s@%(proxy)s/" % {'user': username, 'pwd': password, 'proxy': random.choice(proxy_ip)},"https": "http://%(user)s:%(pwd)s@%(proxy)s/" % {'user': username, 'pwd': password, 'proxy': random.choice(proxy_ip)}
}
headers = {"Accept-Encoding": "Gzip",  # 使用gzip压缩传输数据让访问更快
}
r = requests.get(page_url, proxies=proxies, headers=headers)
print(r.status_code)  # 获取Response的返回码if r.status_code == 200:r.enconding = "utf-8"  # 设置返回内容的编码print(r.content)  # 获取页面内容

所以其实我们要先去获取API接口返回的IP列表,然后在使用代理的时候带上自己的用户名密码,即

http://%(user)s:%(pwd)s@%(proxy)s/

抓包代理

平时我们经常使用的burpsuite、Fiddler会在本机开启HTTP代理,处理用户与目标服务器之间的通信
也有一些HTTP调试工具是开在公网中的,这样就可以被我们扫描到,比如

Fiddler - title="Fiddler Echo Service"

burpsuite - body="Welcome to Burp Suite"

不过尝试了一下好像都用不了

寻找免费代理

免费代理的网站很多,但是存活率,可用率很低,需要自己去重验活,比如

  • https://www.kuaidaili.com/free/
  • http://www.ip3366.net/
  • https://www.89ip.cn/
  • ......

FOFA寻找公开代理

python的一个小demo如下,使用了fofa-hack来免登陆使用 - https://github.com/Cl0udG0d/Fofa-hack

import requestsfrom fofa_hack import fofa
from tookit import fofaUseragentimport requests,sys,mmh3,codecsdef main():result_generator = fofa.api('protocol="socks5" && "Authentication"', endcount=1000)for data in result_generator:for proxy in data:proxies = {'http': "socks5://{}".format(proxy), "https": "socks5://{}".format(proxy)}try:r = requests.get('https://www.taobao.com/help/getip.php', proxies=proxies, timeout=3)if 'ipCallback' in r.text:print(fr'[*] success: ' + str(proxies))except requests.exceptions.ConnectionError:passexcept requests.exceptions.ReadTimeout:passexcept KeyboardInterrupt:print('用户退出')exit()except requests.exceptions.InvalidSchema:print('未检测到pysocks')print('pip install -U requests[socks]')print('pip install pysocks')exit()if __name__ == '__main__':main()

遗憾的是效果很糟糕,在1000+的结果下只有两三个可用代理

搭建自己的代理池

关于搭建自己的代理池这个话题,不建议从零开始写一个,github上有很多优秀的案例,可以基于他们的思路扩展,而不是重复造轮子orz
比如下面要提到的proxy_pool

proxy_pool使用

安装redis和python,下载项目

git clone git@github.com:jhao104/proxy_pool.git

设置settings.py里的IP和redis密码

# setting.py 为项目配置文件# 配置API服务HOST = "0.0.0.0"               # IP
PORT = 5000                    # 监听端口# 配置数据库DB_CONN = 'redis://:pwd@127.0.0.1:8888/0'# 配置 ProxyFetcherPROXY_FETCHER = ["freeProxy01",      # 这里是启用的代理抓取方法名,所有fetch方法位于fetcher/proxyFetcher.py"freeProxy02",# ....
]

启动项目

# 如果已经具备运行条件, 可用通过proxyPool.py启动。
# 程序分为: schedule 调度程序 和 server Api服务# 启动调度程序
python proxyPool.py schedule# 启动webApi服务
python proxyPool.py server

如果没有出现报错的话,浏览器访问 http://127.0.0.1:5010/get/ 就可以获取代理了
web API如下

直接访问 http://127.0.0.1:5010 也可以看到接口说明

proxy_pool分析

proxy_pool 需要启动两个文件

  • python proxyPool.py server &
  • python proxyPool.py schedule

server api部分我们就不用看了,主要看爬取检测验活扩展这部分

这里分为了采集和检查两部分

  • __runProxyFetch
  • __runProxyCheck

__runProxyFetch部分

具体我们会执行那些采集,在setting.py文件里

PROXY_FETCHER = ["freeProxy01","freeProxy02","freeProxy03","freeProxy04","freeProxy05","freeProxy06","freeProxy07","freeProxy08","freeProxy09","freeProxy10","freeProxy11"
]

会对应到 ProxyFetcher 类里面的静态方法,官方文档里面也对这部分有说明

扩展的话我们定义新的代理网站的静态方法,并且在setting.py文件进行设置,就可以使用了

__runProxyCheck

检测代理是否可用分为了三个方法,在validator.py文件里,需要三个方法同时返回True,才说明代理是可用的

IP_REGEX = re.compile(r"(.*:.*@)?\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d{1,5}")@ProxyValidator.addPreValidator
def formatValidator(proxy):"""检查代理格式"""return True if IP_REGEX.fullmatch(proxy) else False@ProxyValidator.addHttpValidator
def httpTimeOutValidator(proxy):""" http检测超时 """proxies = {"http": "http://{proxy}".format(proxy=proxy), "https": "https://{proxy}".format(proxy=proxy)}try:r = head(conf.httpUrl, headers=HEADER, proxies=proxies, timeout=conf.verifyTimeout)return True if r.status_code == 200 else Falseexcept Exception as e:return False@ProxyValidator.addHttpsValidator
def httpsTimeOutValidator(proxy):"""https检测超时"""proxies = {"http": "http://{proxy}".format(proxy=proxy), "https": "https://{proxy}".format(proxy=proxy)}try:r = head(conf.httpsUrl, headers=HEADER, proxies=proxies, timeout=conf.verifyTimeout, verify=False)return True if r.status_code == 200 else Falseexcept Exception as e:return False

formatValidator检测代理IP的格式是否正确
httpTimeOutValidator检测代理IP是否可用,带上代理IP访问http://httpbin.org ,这是一个用来测试 HTTP 请求和响应的网站。
httpsTimeOutValidator检测代理IP是否支持https,访问的是 https://www.qq.com
通过这三个检测方法对获取的代理进行测试,保证代理的可用性

参考连接

  • https://github.com/jhao104/proxy_pool
  • https://proxy-pool.readthedocs.io/zh/latest/
  • 代理(Proxy)和VPN的区别 - 知乎
  • http、https、socks代理各自的优缺点都是什么? - 知乎
  • https://www.kuaidaili.com/doc/dev/sdk_api/
  • https://www.jianshu.com/p/e2454e9a0492
  • https://www.cnblogs.com/g2thend/p/1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/818232.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

xhci 数据结构

xhci 数据结构 xhci 数据结构主要在手册上有详细的定义,本文根据手册进行归纳总结: 重点关注的包括: device contexttrb ringtrb device context设备上下文 设备上下文数据结构由xHC管理,用于向系统软件报告设备配置和状态信息。…

《CSS 知识点》仅在文本有省略号时添加 tip 信息

html <div ref"btns" class"btns"><div class"btn" >这是一段很短的文本.</div><div class"btn" >这是一段很短的文本.</div><div class"btn" >这是一段很长的文本.有省略号和tip.<…

MongoDB副本集部署(windows)

环境准备 本教程演示mongodb4.4 副本集部署&#xff08;一主两从&#xff0c;伪分布式&#xff09; 节点配置主节点localhost:27017从节点1localhost:27018从节点2localhost:27019 每一个节点&#xff08;实例&#xff09;都创建对应的数据文件&#xff08;data&#xff09;…

MySQL中的存储过程详解(上篇)

使用语言 MySQL 使用工具 Navicat Premium 16 代码能力快速提升小方法&#xff0c;看完代码自己敲一遍&#xff0c;十分有用 拖动表名到查询文件中就可以直接把名字拉进来中括号&#xff0c;就代表可写可不写 目录 1.认识存储过程 1.1 存储过程的作用 1.2 存储过程简介…

OpenHarmony轻量系统开发【13】鸿蒙小车开发

13.1 小车介绍 基于鸿蒙系统 Hi3861 的WiFi小车 首先&#xff0c;我们得有一套WiFi小车套件&#xff0c;其实也是Hi3861 加上电机、循迹模块、超声波等模块。 小车安装完大概是这样&#xff1a; 13.2 电机驱动 我们这里先只做最简单的&#xff0c;驱动小车的电机&#xff…

ModuleNotFoundError: No module named ‘llama_index.readers“解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

Centos7,部署etcd集群,基于二进制包,https安全通讯

由于etcd集群https通讯&#xff0c;所以需要自建CA数字证书&#xff0c;学习使用https部署etcd集群前&#xff0c;可以先完成一下&#xff0c;基于http通信的etcd集群&#xff1a; 关于CA原理以及工作可以阅读&#xff0c;以下两篇文章&#xff1a; CA工作原理 对称加密与非对…

【洛谷题解】 CF1468E Four Segments

分析 我们可以知道&#xff0c;如果两个相对的边所在的棍子的长度分别为 a a a 和 b b b&#xff0c;那么这两条边最大只能就为 min ⁡ ( a , b ) \min(a,b) min(a,b)。所以如果让最长的棍子&#xff08;设其长度为 a a a&#xff09;与最短的棍子&#xff08;设其长度为 …

怎样将PDF转成PPT,有免费的工具吗?

PDF转换为PPT的需求在现代办公和学习中越来越常见。很多人可能遇到过需要将PDF文件中的内容转移到PPT中以方便编辑和展示的情况。幸运的是&#xff0c;现在市面上有许多工具可以帮助我们实现这一目标&#xff0c;而且其中不乏一些免费的选项。本文将详细介绍如何使用这些免费工…

自然语言处理、大语言模型相关名词整理

自然语言处理相关名词整理 零样本学习&#xff08;zero-shot learning&#xff09;词嵌入&#xff08;Embedding&#xff09;为什么 Embedding 搜索比基于词频搜索效果好&#xff1f; Word2VecTransformer检索增强生成&#xff08;RAG&#xff09;幻觉采样温度Top-kTop-p奖励模…

全网最完整的软件测试面试八股文

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号&#xff1a;互联网杂货铺&#xff0c;回复1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Part1 1、你的测试职业发展是什么&#xff1f; 测试经…

指定不同版本的jdk运行maven

背景 最近遇到一个业务上问题&#xff0c;使用maven执行线上打包的一个操作&#xff0c;但是java项目有jdk8&#xff0c;有的是jdk11还有的是jdk17的&#xff0c;如何根据不同的项目jdk版本来执行maven呢&#xff1f; 解决方案 这里是临时多版本动态打包&#xff0c;所以不能…

Python | Leetcode Python题解之第24题两两交换链表中的节点

题目&#xff1a; 题解&#xff1a; class Solution:def swapPairs(self, head: ListNode) -> ListNode:dummyHead ListNode(0)dummyHead.next headtemp dummyHeadwhile temp.next and temp.next.next:node1 temp.nextnode2 temp.next.nexttemp.next node2node1.next…

Hello算法11:排序

https://www.hello-algo.com/chapter_sorting/ 选择排序 初始未排序的区间是[0,n-1]在[0,n-1]中查找最小元素&#xff0c;和索引0交换&#xff0c;此时未排序的区间是[1,n-1]在[1,n-1]中查找最小元素&#xff0c;和索引1交换&#xff0c;此时未排序区间是[2,n-1]以此类推&…

基于springboot+vue+Mysql的藏区特产销售平台

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

TC387实现SPI自通讯

TC387实现SPI自通讯 预期效果&#xff1a; TC387上定义两个SPI通讯接口&#xff0c;一个用于发数据一个用于收数据。准确无误的收到一次数据就对核心板led灯的状态进行一次翻转。 由于实验设备有限&#xff0c;只能想办法通过现有设备进行实验。 实现过程&#xff1a; 最开…

linux 设置定时任务---学习

1、设置定时任务 crontab -e 设置格式参考&#xff1a;【Linux】Linux crontab 命令定时任务设置_crontab 设置每天10:30执行-CSDN博客 测试过程&#xff1a; */1 * * * * /root/cronjob.sh 脚本内容: echo "hell0 cronjob" >> /root/test/hello.txt 实现…

为什么你要选择成为一名程序员

为什么你要选择成为一名程序员 成为程序员——编程世界的无尽魅力 成为一名程序员&#xff0c;是一个颇具挑战而又富有激情的选择。每当我沉浸在代码的世界中&#xff0c;那种成就感和满足感都让我深感自己的选择是正确的。 首先&#xff0c;成为一名程序员&#xff0c;是对…

extends继承

目录 什么时候用继承? 继承的格式? 继承的特点 子类可以继承父类的哪些呢&#xff1f; 是否可以继承父类的构造方法呢&#xff1f; 是否可以继承成员变量&#xff1f; 是否可以继承成员方法&#xff1f; 在Java中&#xff0c;extends关键字用于实现继承关系。通过使用…