【问题标题】:How to VPN/Proxy connect in Python?如何在 Python 中进行 VPN/代理连接?
【发布时间】:2016-05-10 17:45:01
【问题描述】:

我正在尝试抓取网站上的一些页面,但要查看这些页面,我需要连接到 VPN。我的设置如下:

我想在通过 VPN 连接的 pythonanywhere 上运行一个脚本,以使流量看起来来自澳大利亚。

到目前为止我找到的最接近的答案是:

JSoup over VPN/proxy

【问题讨论】:

    标签: python vpn pythonanywhere pia


    【解决方案1】:

    我看到https://www.privateinternetaccess.com/ 可以选择使用 SOCKS5 代理。 如果您使用 requests 模块进行抓取,您可以像这样使用 SOCKS5:

    pip install -U requests[socks]
    

    在脚本中:

    import requests
    proxies = {'http': 'socks5://user:pass@host:port',
               'https': 'socks5://user:pass@host:port'}
    
    resp = requests.get('http://example.com', proxies=proxies )
    

    【讨论】:

    • 您将如何将其连接到 VPNExpress 等 VPN 服务?
    • 如果 VPNExpress 需要设置隧道,几乎总是在操作系统级别完成
    【解决方案2】:

    你应该明确你想要什么。代理不同于 VPN。

    在 Python 中更容易创建代理。

    代码如下:

    import socket
    import select
    import time
    import sys
    
    # Changing the buffer_size and delay, you can improve the speed and bandwidth.
    # But when buffer get to high or delay go too down, you can broke things
    buffer_size = 4096
    delay = 0.0001
    forward_to = ('smtp.zaz.ufsk.br', 25)
    
    class Forward:
        def __init__(self):
            self.forward = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
        def start(self, host, port):
            try:
                self.forward.connect((host, port))
                return self.forward
            except Exception, e:
                print e
                return False
    
    class TheServer:
        input_list = []
        channel = {}
    
        def __init__(self, host, port):
            self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            self.server.bind((host, port))
            self.server.listen(200)
    
        def main_loop(self):
            self.input_list.append(self.server)
            while 1:
                time.sleep(delay)
                ss = select.select
                inputready, outputready, exceptready = ss(self.input_list, [], [])
                for self.s in inputready:
                    if self.s == self.server:
                        self.on_accept()
                        break
    
                    self.data = self.s.recv(buffer_size)
                    if len(self.data) == 0:
                        self.on_close()
                        break
                    else:
                        self.on_recv()
    
        def on_accept(self):
            forward = Forward().start(forward_to[0], forward_to[1])
            clientsock, clientaddr = self.server.accept()
            if forward:
                print clientaddr, "has connected"
                self.input_list.append(clientsock)
                self.input_list.append(forward)
                self.channel[clientsock] = forward
                self.channel[forward] = clientsock
            else:
                print "Can't establish connection with remote server.",
                print "Closing connection with client side", clientaddr
                clientsock.close()
    
        def on_close(self):
            print self.s.getpeername(), "has disconnected"
            #remove objects from input_list
            self.input_list.remove(self.s)
            self.input_list.remove(self.channel[self.s])
            out = self.channel[self.s]
            # close the connection with client
            self.channel[out].close()  # equivalent to do self.s.close()
            # close the connection with remote server
            self.channel[self.s].close()
            # delete both objects from channel dict
            del self.channel[out]
            del self.channel[self.s]
    
        def on_recv(self):
            data = self.data
            # here we can parse and/or modify the data before send forward
            print data
            self.channel[self.s].send(data)
    
    if __name__ == '__main__':
            server = TheServer('', 9090)
            try:
                server.main_loop()
            except KeyboardInterrupt:
                print "Ctrl C - Stopping server"
                sys.exit(1)
    

    希望你觉得它有用 ;-)

    【讨论】:

      猜你喜欢
      • 2017-04-04
      • 2015-07-10
      • 2022-11-09
      • 1970-01-01
      • 1970-01-01
      • 2015-03-08
      • 2016-08-10
      • 2022-12-03
      • 1970-01-01
      相关资源
      最近更新 更多