代码样例-Socks代理

本文档包含编程请求Socks代理服务器的代码样例,供开发者参考。

代码样例使用说明

  1. 代码样例不能直接运行,因为代码中的代理服务器59.38.241.25:23918、用户名myusername、密码mypassword都是虚构的,您替换成自己真实的信息就可以正常运行了。
  2. 代码样例正常运行所需的运行环境和注意事项在样例末尾均有说明,使用前请仔细阅读。
  3. 使用代码样例过程中遇到问题请联系售后客服,我们会为您提供技术支持。

Python2

requests

requests请求网页
#!/usr/bin/env python
#-*- coding: utf-8 -*-

"""使用requests请求socks代理服务器
请求http和https网页均适用
"""

import requests
import base64

#要访问的目标网页
page_url = "http://dev.kdlapi.com/testproxy"

#代理服务器
proxy = "59.38.241.25:23918"

#用户名和密码(私密代理/独享代理)
username = "myusername"
password = "mypassword"

proxies = {
    'http': 'socks5://%s:%s@%s' % (username, password, proxy),
    'https': 'socks5://%s:%s@%s' % (username, password, proxy),
    #提示:如果希望在代理服务器上进行dns解析,把socks5替换成socks5h
}

headers = {
    "Accept-Encoding": "gzip", #使用gzip压缩传输数据让访问更快
}

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

print r.status_code #获取Reponse的返回码

if r.status_code == 200:
    r.enconding = "utf-8" #设置返回内容的编码
    print r.content #获取页面内容

使用提示

  • http/https网页均可适用
  • 运行环境要求:requests >= 2.10.0
  • socks支持是requests的额外特性,需要安装才能使用: pip install requests[socks]

urllib2

urllib2请求网页
#!/usr/bin/env python
#-*- coding: utf-8 -*-

"""使用urllib2请求socks5代理服务器
请求http和https网页均适用
"""

import urllib2
import base64
import zlib

import socks
from sockshandler import SocksiPyHandler

#要访问的目标网页
page_url = "http://dev.kdlapi.com/testproxy"

#代理服务器
proxy_ip = "59.38.241.25"
proxy_port = 23918

rdns = False #是否在代理服务器上进行dns查询

#用户名和密码(私密代理/独享代理)
username = "myusername"
password = "mypassword"

opener = urllib2.build_opener(SocksiPyHandler(socks.SOCKS5, proxy_ip, proxy_port, rdns, username, password))
opener.addheaders = [
    ("Accept-Encoding", "Gzip"), #使用gzip压缩传输数据让访问更快
]
r = opener.open(page_url)

print r.code #获取Reponse的返回码
content = r.read()
content_encoding = r.headers.getheader("Content-Encoding")
if content_encoding and "gzip" in content_encoding:
    print zlib.decompress(content, 16+zlib.MAX_WBITS) #获取页面内容
else:
    print content #获取页面内容

使用提示

  • 运行环境要求 python2.6 / 2.7
  • http/https网页均可适用
  • 使用此样例需要安装PySockspip install PySocks

Selenium

Chrome
Chrome(IP白名单)
# _*_ coding:utf‐8 _*
'''
基于selenium下Chrome的socks5白名单访问代理
ubuntu14.04环境
使用虚拟显示实现无窗口Chrome浏览器
官方目前没有支持账号密码认证代理
'''
from xvfbwrapper import Xvfb
from selenium import webdriver
import time

#要访问的目标网页
page_url = "http://dev.kdlapi.com/testproxy"

#代理服务器ip和端口
proxy = '59.38.241.25:23916'

#复制一份配置文件
desired_capabilities = webdriver.DesiredCapabilities.INTERNETEXPLORER.copy()
#改变配置文件的复制版本.
PROXY = "socks5://" + proxy
desired_capabilities['proxy'] = {
    "httpProxy": PROXY,
    "ftpProxy": PROXY,
    "sslProxy": PROXY,
    "noProxy": None,
    "proxyType": "MANUAL",
    "class": "org.openqa.selenium.Proxy",
    "autodetect": False
}

# 使用新实例驱动
options = webdriver.ChromeOptions()

#无窗口启动配置好的Chrome
xvfb = Xvfb()
xvfb.start()
driver = webdriver.Chrome(chrome_options=options,desired_capabilities=desired_capabilities)

#尝试访问登陆页面,登录页面有你的代理IP
driver.get(page_url)

#打出网页title和网页源代码
print driver.title
print driver.page_source

#退出
driver.quit()
xvfb.stop()

使用提示

  • 运行环境要求 python2.x + selenium + chrome + chrome driver + xvfb
  • socks5代理网页均可适用
  • 安装xvfb:pip install xvfbwrapper
  • 开发环境配置参考
PhantomJS
PhantomJS(IP白名单)
# -*- coding: utf-8 -*-
'''
使用selenium下的无窗口浏览器phantomjs的socks5白名单免登录示例
因为是无窗口浏览器,所以截了一张图片放在本程序当前目录下
打印出访问网址的title和网页源码
'''
from selenium import webdriver

#要访问的目标网页
page_url = "http://dev.kdlapi.com/testproxy"

#代理服务器ip和端口
proxy = '59.38.241.25:23918'

#代理参数设置
service_args = [
    '--proxy=%s' % proxy,
    '--proxy-type=socks5',
    #'--proxy-auth=%s:%s' %(username,password)

]

#启动PhantomJS
driver = webdriver.PhantomJS(service_args = service_args)

#打出网页title和网页源代码
print driver.title
print driver.page_source

#退出PhantomJS
driver.quit()

使用提示

  • 运行环境要求: python2.x
  • socks5代理网页均可适用
  • 使用此样例需要安装selenium、PhantomJS
  • PhantomJS可以直接使用pip安装
PhantomJS(用户名密码认证)
# -*- coding: utf-8 -*-
'''
使用selenium下的无窗口浏览器phantomjs的socks5认证代理示例
可以打印了访问网址的title和源代码
'''
from selenium import webdriver

#要访问的目标网页
page_url = "http://dev.kdlapi.com/testproxy"

#代理服务器ip和端口
ip = '59.38.241.25:23918'

#用户名和密码(私密代理/独享代理)
username = 'myusername'
password = 'mypassword'

#代理参数设置
service_args = [
    '--proxy=%s' % ip,
    '--proxy-type=socks5',
    '--proxy-auth=%s:%s' %(username,password)
]

#启动PhantomJS
driver = webdriver.PhantomJS(service_args = service_args)

#访问网址
driver.get(page_url)

#打出网页title和网页源代码
print driver.title
print driver.page_source

#退出PhantomJS
driver.quit()

使用提示

  • 运行环境要求 python2.x
  • socks5代理http/https网页均可适用
  • 使用此样例需要安装selenium、PhantomJS
  • PhantomJS可以直接使用pip安装

Python3

requests

requests请求网页
"""使用requests请求socks代理服务器
请求http和https网页均适用
"""

import requests

# 要访问的目标网页
page_url = "http://dev.kdlapi.com/testproxy"

# 代理服务器 提示:生成api链接时代理类型请勾选socks4/socks5
proxy = "59.38.241.25:23916"

# 用户名和密码(私密代理/独享代理)
username = "myusername"
password = "mypassword"

proxies = {
    'http': 'socks5://%s:%s@%s' % (username, password, proxy),
    'https': 'socks5://%s:%s@%s' % (username, password, proxy),
    # 提示:如果希望在代理服务器上进行dns解析,把socks5替换成socks5h
}

headers = {
    "Accept-Encoding": "gzip",  # 使用gzip压缩传输数据让访问更快
}


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

print(r.status_code)  # 获取Response的返回码

if r.status_code == 200:
    print(r.text)  # 获取页面内容

使用提示

  • http/https网页均可适用
  • 运行环境要求:requests >= 2.10.0
  • socks支持是requests的额外特性,需要安装才能使用: pip install requests[socks]

urllib

urllib请求网页
"""使用urllib请求socks5代理服务器
请求http和https网页均适用
"""

import urllib.request
import socks
import zlib
from sockshandler import SocksiPyHandler

# 要访问的目标网页
page_url = "https://dev.kdlapi.com/testproxy"

# 代理服务器
proxy_ip = "59.38.241.25"
proxy_port = 23916

rdns = False  # 是否在代理服务器上进行dns查询

# 用户名和密码(私密代理/独享代理)
username = "myusername"
password = "mypassword"

opener = urllib.request.build_opener(SocksiPyHandler(socks.SOCKS5, proxy_ip, proxy_port, rdns, username, password))
opener.addheaders = [
    ("Accept-Encoding", "Gzip"), #使用gzip压缩传输数据让访问更快
]
r = opener.open(page_url)

print(r.code)  # 获取Reponse的返回码
content = r.read()

content_encoding = r.headers.get_all("Content-Encoding")
if content_encoding and "gzip" in content_encoding:
    print(zlib.decompress(content, 16 + zlib.MAX_WBITS).decode('utf8'))  # 有gzip压缩时获取页面内容
else:
    print(content.decode('utf-8'))  # 无gzip压缩时获取页面内容

使用提示

  • http/https网页均可适用
  • 请先安装socks: pip install pysocks'

GoLang

标准库

用户名密码认证
// 请求socks代理服务器(用户名密码认证)
// http和https网页均适用

package main

import (
    "compress/gzip"
    "fmt"
    "golang.org/x/net/proxy"
    "io"
    "io/ioutil"
    "net/http"
    "os"
)

func main() {
    // 用户名密码(私密代理/独享代理)
    username := "myusername"
    password := "mypassword"

    auth := proxy.Auth{
        User:     username,
        Password: password,
    }

    proxy_str := "59.38.241.25:23916"

    // 目标网页
    page_url := "http://dev.kdlapi.com/testproxy"

    // 设置代理
    dialer, err := proxy.SOCKS5("tcp", proxy_str, &auth, proxy.Direct)
    if err != nil {
        fmt.Println(err.Error())
        os.Exit(1)
    }

    // 请求目标网页
    client := &http.Client{Transport: &http.Transport{Dial: dialer.Dial}}
    req, _ := http.NewRequest("GET", page_url, nil)
    req.Header.Add("Accept-Encoding", "gzip") //使用gzip压缩传输数据让访问更快
    res, err := client.Do(req)

    if err != nil {
        // 请求发生异常
        fmt.Println(err.Error())
    } else {
        defer res.Body.Close() //保证最后关闭Body

        fmt.Println("status code:", res.StatusCode) // 获取状态码

        // 有gzip压缩时,需要解压缩读取返回内容
        if res.Header.Get("Content-Encoding") == "gzip" {
            reader, _ := gzip.NewReader(res.Body) // gzip解压缩
            defer reader.Close()
            io.Copy(os.Stdout, reader)
            os.Exit(0) // 正常退出
        }

        // 无gzip压缩, 读取返回内容
        body, _ := ioutil.ReadAll(res.Body)
        fmt.Println(string(body))
    }
}

使用提示

  • http/https网页均可适用
  • 请先安装官方net包: go get golang.org/x/net'
IP白名单认证
// 请求socks代理服务器(已设置IP白名单)
// http和https网页均适用

package main

import (
    "compress/gzip"
    "fmt"
    "golang.org/x/net/proxy"
    "io"
    "io/ioutil"
    "net/http"
    "os"
)

func main() {
    // 代理服务器
    proxy_str := "59.38.241.25:23916"

    // 目标网页
    page_url := "http://dev.kdlapi.com/testproxy"

    // 设置代理
    dialer, err := proxy.SOCKS5("tcp", proxy_str, nil, proxy.Direct)
    if err != nil {
        fmt.Println(err.Error())
        os.Exit(1)
    }

    // 请求目标网页
    client := &http.Client{Transport: &http.Transport{Dial: dialer.Dial}}
    req, _ := http.NewRequest("GET", page_url, nil)
    req.Header.Add("Accept-Encoding", "gzip") //使用gzip压缩传输数据让访问更快
    res, err := client.Do(req)

    if err != nil {
        // 请求发生异常
        fmt.Println(err.Error())
    } else {
        defer res.Body.Close() //保证最后关闭Body

        fmt.Println("status code:", res.StatusCode) // 获取状态码

        // 有gzip压缩时,需要解压缩读取返回内容
        if res.Header.Get("Content-Encoding") == "gzip" {
            reader, _ := gzip.NewReader(res.Body) // gzip解压缩
            defer reader.Close()
            io.Copy(os.Stdout, reader)
            os.Exit(0) // 正常退出
        }

        // 无gzip压缩, 读取返回内容
        body, _ := ioutil.ReadAll(res.Body)
        fmt.Println(string(body))
    }
}

使用提示

  • http/https网页均可适用
  • 请先安装官方net包: go get golang.org/x/net'

CSharp

HttpToSocks5

HttpToSocks5Proxy
using System;
using System.Net.Http;
using System.IO;
using System.IO.Compression;
using MihaZupan;

namespace httptosocks
{
    class Program
    {
        static void Main(string[] args)
        {
            // 目标网页
            string page_url = "http://dev.kdlapi.com/testproxy";

            // 代理服务器
            string proxy_ip = "59.38.241.25";
            int proxy_port = 23916;

            // 用户名密码 <私密代理/独享代理>
            string username = "myusername";
            string password = "mypassword";

            // 设置代理 <开放代理或私密/独享代理&已添加白名单>
            // var proxy = new HttpToSocks5Proxy(new[] {
            //     new ProxyInfo(proxy_ip, proxy_port),
            // });

            // 设置Socks5代理 <私密/独享代理&未添加白名单>
            var proxy = new HttpToSocks5Proxy(new[] {
                new ProxyInfo(proxy_ip, proxy_port, username, password),
            });

            // 请求目标网页
            var handler = new HttpClientHandler { Proxy = proxy };
            HttpClient httpClient = new HttpClient(handler, true);

            HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, page_url);
            httpRequestMessage.Headers.Add("Accept-Encoding", "Gzip");  // 使用gzip压缩传输数据让访问更快
            var httpsGet = httpClient.SendAsync(httpRequestMessage);

            var result = httpsGet.Result;
            Console.WriteLine((int)result.StatusCode);  // 获取状态码

            // 解压缩读取返回内容
            using (StreamReader reader = new StreamReader(new GZipStream(result.Content.ReadAsStreamAsync().Result, CompressionMode.Decompress))) {
                Console.WriteLine(reader.ReadToEnd());
            }
        }
    }
}

使用提示

  • http/https网页均可适用
  • HttpToSocks5Proxy是第三方库,请先安装后再运行。