浅谈网络代理 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 random

page_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"

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

寻找免费代理

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

FOFA寻找公开代理

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

import requests

from fofa_hack import fofa
from tookit import fofaUseragent

import requests,sys,mmh3,codecs

def 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:
                pass
            except requests.exceptions.ReadTimeout:
                pass
            except 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'


# 配置 ProxyFetcher

PROXY_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 False
    except 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 False
    except Exception as e:
        return False

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

参考连接

  • 22
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值