程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

如何在python中编写代理池服务器(当请求到来时,选择一个代理来获取url内容)?

发布于2019-09-04 10:34     阅读(920)     评论(0)     点赞(24)     收藏(1)


我不知道这样的代理服务器的名称是什么,欢迎您修改我的问题标题。

当我在谷歌搜索代理服务器时,很多实现像maproxya-python-proxy-in-than-than-100-lines-of-code那些代理服务器似乎只是要求远程服务器获取某个URL地址。

我想构建一个代理服务器,它包含一个代理池(一个http / https代理列表),只有一个IP地址和一个端口来服务传入的请求。当请求到来时,它会从池中选择一个代理并执行此请求,并返回结果。

例如,我有一个IP'192.168.1.66'的VPS。我在此VPS启动代理服务器,IP为“127.0.0.1”,端口为“8080”。

然后,我可以使用此代理,如下所示。

import requests
url = 'http://www.google.com'
headers = {
    ...
}
proxies = {
    'http': 'http://192.168.1.66:8080'
}

r = requests.get(url, headers=headers, proxies=proxies)

我看到了一些不足之处:

from twisted.web import proxy, http
from twisted.internet import reactor
from twisted.python import log
import sys
log.startLogging(sys.stdout)

class ProxyFactory(http.HTTPFactory):
    protocol = proxy.Proxy

reactor.listenTCP(8080, ProxyFactory())
reactor.run()

它工作正常,但它很简单,我不知道它是如何工作的,以及如何改进此代码以使用代理池。

一个示例流程:

来自hidu / proxy-manager,由golang编写。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  
+ client (want visit http://www.baidu.com/)              +  
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  
                        |  
                        |  via proxy 127.0.0.1:8090  
                        |  
                        V  
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  
+                       +         proxy pool             +  
+ proxy manager listen  ++++++++++++++++++++++++++++++++++  
+ on (127.0.0.1:8090)   +  http_proxy1,http_proxy2,      +  
+                       +  socks5_proxy1,socks5_proxy2   +  
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  
                        |  
                        |  choose one proxy visit 
                        |  www.baidu.com  
                        |  
                        V  
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  
+        site:www.baidu.com                              +  
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  

解决方案


您的代理池概念并不难实现。如果我理解正确,你想要跟随。

  1. 您的PROXY SERVER收听请求在192.168.1.66:8080
  2. CLIENT请求访问http://www.google.com
  3. 您的PROXY SERVER将客户端的请求发送给另一个PROXY SERVER,该服务器位于另一个代理服务器 - 代理池列表中。
  4. 您的PROXY SERVER从另一个PROXY SERVER获得响应,并回复客户端

所以,我用FlaskRequests编写了简单的代理服务器

from flask import Flask, Response
import random

app = Flask(__name__)

@app.route('/p/<path:url>')
def proxy(url):
    """ Request to this like /p/www.google.com
    """
    url = 'http://{}'.format(url)
    r = get_response(url)

    return Response(stream_with_context(r.iter_content()), 
                    content_type=r.headers['content-type'])

def get_proxy():
    # This is your "Proxy Pool"
    proxies = [
        'http://proxy-server-1.com',
        'http://proxy-server-2.com',
        'http://proxy-server-3.com',
    ]

    return random.choice(proxies)

def get_response(target_url):
    proxy = get_proxy();
    url = "{}/p/{}".format(proxy, target_url)
    # Above line will generate like http://proxy-server-1.com/p/www.google.com

    return requests.get(url, stream=True)

if __name__ == '__main__':
    app.run()

然后,您可以从这里开始改进您的代理服务器。

通用Proxy Pool,或者Proxy Manager可以检查其代理的可用性,速度和更多统计信息,并选择最佳代理来发送请求。当然,这个示例只处理简单的请求,并且您可以添加功能句柄请求args,方法,协议。

希望这有用!



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/88625/b84f253c86cffe04889f/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

24 0
收藏该文
已收藏

评论内容:(最多支持255个字符)