代码样例-Socks代理

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

代码样例使用说明

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

Python2

requests

requests请求网页

使用提示

  • http/https网页均可适用
  • 运行环境要求:requests >= 2.10.0
  • socks支持是requests的额外特性,需要安装才能使用: pip install requests[socks]
#!/usr/bin/env python
#-*- coding: utf-8 -*-

#!/usr/bin/env python
#-*- coding: utf-8 -*-

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

import requests
import random

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

# API接口,返回格式为json
api_url = ""
ip_list = requests.get(api_url).json()['data']['proxy_list']
proxy = random.choice(ip_list)

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

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) #获取页面内容

urllib2

urllib2请求网页

使用提示

  • 运行环境要求 python2.6 / 2.7
  • http/https网页均可适用
  • 使用此样例需要安装PySockspip install PySocks
#!/usr/bin/env python
#-*- coding: utf-8 -*-

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

import urllib2
import random
import json
import zlib

import socks
from sockshandler import SocksiPyHandler

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

# API接口
api_url = ""
# API接口返回的IP
ip_list = json.loads(urllib2.urlopen(api_url).read().decode('utf-8'))['data']['proxy_list']
print(ip_list)
proxy = random.choice(ip_list)
proxy_ip, proxy_port = proxy.split(":")
proxy_port = int(proxy_port)

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

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

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  # 获取页面内容

Selenium

Chrome
Chrome(IP白名单 Linux)

使用提示

  • 运行环境要求 python2.x + selenium + chrome + chrome driver + xvfb
  • socks5代理网页均可适用
  • 安装xvfb:pip install xvfbwrapper
  • 开发环境配置参考
# _*_ 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()
Chrome(IP白名单 Windows)

使用提示

# -*- coding: utf-8 -*-   
"""
 selenium + chrome + windows + ip白名单
"""
from selenium import webdriver

# 代理服务器
proxy_ip_port = '42.49.11.109:21080'
proxy = 'socks5://' + proxy_ip_port

# 目标网页
page_url = "https://dev.kuaidaili.com/testproxy"

co = webdriver.ChromeOptions()
co.add_argument('--proxy-server=%s' % proxy) # 设置代理
co.add_argument('--headless')  # 无窗口模式, 可选

# 启动chrome
driver = webdriver.Chrome(chrome_options=co)

# 抓取网页
driver.get(page_url)

# 输出网页内容
print(driver.page_source)

# 退出chrome
driver.quit()
Chrome(用户名密码认证 Windows)

使用提示

# -*- coding: utf-8 -*-   
"""
 selenium + chrome + windows + 用户名密码认证
"""
from selenium import webdriver

proxyauth_plugin_path = create_proxyauth_extension(
    proxy_host="42.49.11.109",  # 代理服务器ip
    proxy_port=21080,           # 代理服务器端口
    proxy_username="yourusername",    # 用户名
    proxy_password="yourpassword",  # 密码
    scheme='socks5',  # socks5协议
)

# 目标网页
page_url = "https://dev.kuaidaili.com/testproxy"

co = webdriver.ChromeOptions()
co.add_argument("--start-maximized")  # 最大化窗口, 不加可能报错
co.add_extension(proxyauth_plugin_path) # 添加扩展

# 启动chrome, 抓取网页
driver = webdriver.Chrome(chrome_options=co)
driver.get("https://dev.kuaidaili.com/testproxy")

# 输出网页内容
print(driver.page_source)

# 自动生成扩展的函数
def create_proxyauth_extension(proxy_host, proxy_port,
                               proxy_username, proxy_password,
                               scheme='http', plugin_path=None):
    import string
    import zipfile

    if plugin_path is None:
        plugin_path = 'vimm_chrome_proxyauth_plugin.zip'

    manifest_json = """
    {
        "version": "1.0.0",
        "manifest_version": 2,
        "name": "Chrome Proxy",
        "permissions": [
            "proxy",
            "tabs",   
            "unlimitedStorage",
            "storage",
            "<all_urls>",
            "webRequest",
            "webRequestBlocking"
        ],
        "background": {
            "scripts": ["background.js"]
        },
        "minimum_chrome_version":"22.0.0"
    }
    """

    background_js = string.Template(
    """
    var config = {
            mode: "fixed_servers",
            rules: {
              singleProxy: {
                scheme: "${scheme}",
                host: "${host}",
                port: parseInt(${port})
              },
              bypassList: ["foobar.com"]
            }
          };

    chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});

    function callbackFn(details) {
        return {
            authCredentials: {
                username: "${username}",
                password: "${password}"
            }
        };
    }

    chrome.webRequest.onAuthRequired.addListener(
                callbackFn,
                {urls: ["<all_urls>"]},
                ['blocking']
    );
    """
    ).substitute(
        host=proxy_host,
        port=proxy_port,
        username=proxy_username,
        password=proxy_password,
        scheme=scheme,
    )
    with zipfile.ZipFile(plugin_path, 'w') as zp:
        zp.writestr("manifest.json", manifest_json)
        zp.writestr("background.js", background_js)

    return plugin_path
PhantomJS
PhantomJS(IP白名单)

使用提示

  • 运行环境要求: python2.x
  • socks5代理网页均可适用
  • 使用此样例需要安装selenium、PhantomJS
  • PhantomJS可以直接使用pip安装
# -*- 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()
PhantomJS(用户名密码认证)

使用提示

  • 运行环境要求 python2.x
  • socks5代理http/https网页均可适用
  • 使用此样例需要安装selenium、PhantomJS
  • PhantomJS可以直接使用pip安装
# -*- 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()

Python3

requests

requests请求网页

使用提示

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

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

"""使用requests请求socks代理服务器,需要安装pysocks库:pip install pysocks
请求http和https网页均适用
"""

import requests
import random

# 要访问的目标网页
page_url = "https://dev.kdlapi.com/testproxy"
# API接口,提示:代理类型请勾选socks4/socks5,返回格式勾选json
api_url = ""

# API 接口返回的ip, 返回格式为json
ip_list = requests.get(api_url).json()['data']['proxy_list']

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

proxies = {
    'http': 'socks5://%s:%s@%s' % (username, password, random.choice(ip_list)),
    'https': 'socks5://%s:%s@%s' % (username, password, random.choice(ip_list)),
    # 提示:如果希望在代理服务器上进行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)

```

urllib

urllib请求网页

使用提示

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

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

"""使用urllib请求socks5代理服务器

请求http和https网页均适用
"""

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

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

# API接口, 返回格式为json
api_url = ""
# API接口返回的ip
response = urllib.request.urlopen(api_url)
json_dict = json.loads(response.read().decode('utf-8'))
ip_list = json_dict['data']['proxy_list']

# 随机选用一个代理ip
proxy_ip, proxy_port = random.choice(ip_list).split(":")
proxy_port = int(proxy_port)  # 端口是int,不能是str

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

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

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压缩时获取页面内容

```

Java

jdk

IP白名单

使用提示

  • http/https网页均可适用
  • 运行环境要求 jdk >= 1.6
// 请求socks代理服务器(IP白名单)
// http和https网页均适用     

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.URL;
import java.util.zip.GZIPInputStream;


public class JavaSocksWhitelist {

    public static void main(String[] args) throws IOException {

        String proxyIp = "113.74.108.33"; // 代理服务器IP
        int proxyPort = 21083;  // 代理服务器端口

        // 要访问的目标网页
        String pageUrl = "http://dev.kuaidaili.com/testproxy";

        Proxy proxy = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress(proxyIp, proxyPort));
        URL url = new URL(pageUrl);
        HttpURLConnection httpUrlConnection = (HttpURLConnection) url.openConnection(proxy);
        httpUrlConnection.setRequestMethod("GET");
        httpUrlConnection.setConnectTimeout(5*1000);  // 设置超时时间     
        httpUrlConnection.setRequestProperty("Accept-Encoding", "gzip");  // 添加gzip压缩让数据传输更块

        // 发起请求
        httpUrlConnection.connect();

        // 输出状态码
        System.out.println("code: " + httpUrlConnection.getResponseCode());

        // 读取返回内容
        InputStream inputStream = httpUrlConnection.getInputStream();
        String encoding = httpUrlConnection.getContentEncoding();
        // 处理gzip压缩
        if (encoding.equals("gzip")) inputStream = new GZIPInputStream(inputStream);
        String message = getContentFromInputStream(inputStream);

        // 输出返回内容
        System.out.println(message);

        // 关闭输入流和连接
        inputStream.close();
        httpUrlConnection.disconnect();
    }

    // 读取输入流中的内容
    public static String getContentFromInputStream(InputStream inputStream) throws IOException {
        final int bufferSize = 1024;
        final char[] buffer = new char[bufferSize];
        final StringBuilder out = new StringBuilder();
        Reader in = new InputStreamReader(inputStream, "UTF-8");
        for (;;) {
            int rsz = in.read(buffer, 0, buffer.length);
            if (rsz < 0) break;
            out.append(buffer, 0, rsz);
        }
        return out.toString();
    }
}
用户名密码认证

使用提示

  • http/https网页均可适用
  • 运行环境要求 jdk >= 1.6
// 请求socks代理服务器(用户名密码认证)
// http和https网页均适用     

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.Authenticator;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.PasswordAuthentication;
import java.net.Proxy;
import java.net.URL;
import java.util.zip.GZIPInputStream;


public class JavaSocksAuth {

    public static void main(String[] args) throws IOException {

        String proxyIp = "113.74.108.33"; // 代理服务器IP
        int proxyPort = 21083;  // 代理服务器端口
        String username = "yourusername";  // 用户名
        String password = "yourpassword"; // 密码

        // 要访问的目标网页
        String pageUrl = "http://dev.kuaidaili.com/testproxy";

        Proxy proxy = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress(proxyIp, proxyPort));
        URL url = new URL(pageUrl);
        HttpURLConnection httpUrlConnection = (HttpURLConnection) url.openConnection(proxy);
        httpUrlConnection.setRequestMethod("GET");
        httpUrlConnection.setConnectTimeout(5*1000);  // 设置超时时间     
        httpUrlConnection.setRequestProperty("Accept-Encoding", "gzip");  // 添加gzip压缩让数据传输更块

        // 设置代理认证
        Authenticator authenticator = new Authenticator() {
            public PasswordAuthentication getPasswordAuthentication() {
                return (new PasswordAuthentication(username,
                        password.toCharArray()));
            }
        };
        Authenticator.setDefault(authenticator);

        // 发起请求
        httpUrlConnection.connect();

        // 输出状态码
        System.out.println("code: " + httpUrlConnection.getResponseCode());

        // 读取返回内容
        InputStream inputStream = httpUrlConnection.getInputStream();
        String encoding = httpUrlConnection.getContentEncoding();
        // 处理gzip压缩
        if (encoding.equals("gzip")) inputStream = new GZIPInputStream(inputStream);
        String message = getContentFromInputStream(inputStream);

        // 输出返回内容
        System.out.println(message);

        // 关闭输入流和连接
        inputStream.close();
        httpUrlConnection.disconnect();
    }

    // 读取输入流中的内容
    public static String getContentFromInputStream(InputStream inputStream) throws IOException {
        final int bufferSize = 1024;
        final char[] buffer = new char[bufferSize];
        final StringBuilder out = new StringBuilder();
        Reader in = new InputStreamReader(inputStream, "UTF-8");
        for (;;) {
            int rsz = in.read(buffer, 0, buffer.length);
            if (rsz < 0) break;
            out.append(buffer, 0, rsz);
        }
        return out.toString();
    }
}

GoLang

标准库

用户名密码认证

使用提示

  • http/https网页均可适用
  • 请先安装官方net包: go get golang.org/x/net'
// 请求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))
    }
}
IP白名单认证

使用提示

  • http/https网页均可适用
  • 请先安装官方net包: go get golang.org/x/net'
// 请求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))
    }
}

CSharp

HttpToSocks5

HttpToSocks5Proxy

使用提示

  • http/https网页均可适用
  • 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());
            }
        }
    }
}

Node.js

request-promise

request-promise(IP白名单)

使用提示

  • http/https网页均可适用
  • 请先安装request-promisesocks-proxy-agent: npm install request-promise socks-proxy-agent
// 引入第三方 `socks-proxy-agent` 模块
const SocksProxyAgent = require('socks-proxy-agent');
// 引入第三方 `request-promise`
const rp = require('request-promise');

// 代理服务器ip和端口
const proxy_ip = '113.74.108.33';
const proxy_port = 21080;

// 设置代理
let proxy = `socks5://${proxy_ip}:${proxy_port}`
let agent = new SocksProxyAgent(proxy);

// 要访问的目标网页
let url = 'http://dev.kuaidaili.com/testproxy';

let options = {
    uri: url,
    agent: agent,
    resolveWithFullResponse: true,
    gzip: true,  //使用gzip压缩让数据传输更快
    headers: {
        'User-Agent': 'Request-Promise',
        "Proxy-Authorization": auth
    }
};

rp(options).then((res)=> {
    // 输出状态码
    console.log(res.statusCode);
    // 输出返回内容 (已自动进行gzip解压缩)
    console.log(res.body)
}).catch((err) => {
    // 错误处理
    console.log("error")
});
request-promise(用户名密码认证)

使用提示

  • http/https网页均可适用
  • 请先安装request-promisesocks-proxy-agent: npm install request-promise socks-proxy-agent
// 引入第三方 `socks-proxy-agent` 模块
const SocksProxyAgent = require('socks-proxy-agent');
// 引入第三方 `request-promise`
const rp = require('request-promise');

// 用户名密码, 若已添加白名单则不需要添加
const username = 'yourusername';
const password = 'yourpassword';

// 代理服务器ip和端口
const proxy_ip = '113.74.108.33';
const proxy_port = 21080;

// 设置代理
let proxy = `socks5://${username}:${password}@${proxy_ip}:${proxy_port}`
let agent = new SocksProxyAgent(proxy);

// 要访问的目标网页
let url = 'http://dev.kuaidaili.com/testproxy';

let options = {
    uri: url,
    agent: agent,
    resolveWithFullResponse: true,
    gzip: true, //使用gzip压缩让数据传输更快
    headers: {
        'User-Agent': 'Request-Promise'
    }
};

rp(options).then((res)=> {
    // 输出状态码
    console.log(res.statusCode);
    // 输出返回内容 (已自动进行gzip解压缩)
    console.log(res.body)

}).catch((err) => {
    console.log("error")
});

Puppeteer

Puppeteer(IP白名单)

使用提示

  • http/https网页均可适用
  • 运行环境要求: node7.6.0或以上 + puppeteer
  • 请先安装puppeteer: npm i puppeteer
  • puppeteer模块的socks代理暂不支持用户名密码的方式验证身份
// 引入puppeteer模块
const puppeteer = require('puppeteer');

// 要访问的目标网页
const url = 'http://dev.kuaidaili.com/testproxy';

// 添加headers
const headers = {
    'Accept-Encoding': 'gzip'
};

// 代理服务器ip和端口
let proxy_ip = '223.198.230.41'
let proxy_port = 19732

(async ()=> {
    // 新建一个浏览器实例
    const browser = await puppeteer.launch({
        headless: false,  // 是否不显示窗口, 默认为true, 设为false便于调试
        args: [
            `--proxy-server=socks5://${proxy_ip}:${proxy_port}`,
            '--no-sandbox',
            '--disable-setuid-sandbox'
        ]
    });

    // 打开一个新页面
    const page = await browser.newPage();
    // 设置headers
    await page.setExtraHTTPHeaders(headers);

    // 访问目标网页
    await page.goto(url);

})();

Ruby

socksify

socksify(IP白名单)

使用提示

  • http/https网页均可适用, IP白名单认证
  • 请先安装socksify: gem install socksify
require 'socksify/http' # 引入socksify/http模块

# 要访问的目标网页, 以快代理testproxy页面为例
page_url = "https://dev.kuaidaili.com/testproxy"
uri = URI(page_url)

# 代理服务器ip和端口
proxy_ip = '42.49.11.109'
proxy_port = 21080

# 新建socks代理实例
proxy = Net::HTTP.SOCKSProxy(proxy_ip, proxy_port)

# 创建新的请求对象 
req = Net::HTTP::Get.new(uri)
# 设置User-Agent
req['User-Agent'] = 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50'
req['Accept-Encoding'] = 'gzip'  # 使用gzip压缩传输数据让访问更快


# 使用代理发起请求, 若访问的是http网页, 请将use_ssl设为false
res = proxy.start(uri.hostname, uri.port, :use_ssl => true) do |http|
    http.request(req)
end

# 输出状态码
puts "status code: #{res.code}"

# 输出响应体
if  res.code.to_i != 200 then
    puts "page content: #{res.body}"
else
    gz = Zlib::GzipReader.new(StringIO.new(res.body.to_s))
    puts "page content: #{gz.read}" 
end
socksify(用户名密码认证)

使用提示

  • http/https网页均可适用, 用户名密码认证
  • 请先安装socksify: gem install socksify
# -*- coding: utf-8 -*-

require 'net/http'  # 引入内置net/http模块
require 'zlib'
require 'stringio'

# 代理服务器ip和端口
proxy_ip = '42.49.11.109'
proxy_port = 16816

# 用户名密码
username = 'yourusername'
password = 'yourpassword'


# 要访问的目标网页, 以快代理testproxy页面为例
page_url = "https://dev.kuaidaili.com/testproxy"
uri = URI(page_url)

# 新建代理实例
proxy = Net::HTTP::Proxy(proxy_ip, proxy_port, username, password)

# 创建新的请求对象 
req = Net::HTTP::Get.new(uri)
# 设置代理用户名密码认证
req.basic_auth(username, password)
# 设置User-Agent
req['User-Agent'] = 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50'
req['Accept-Encoding'] = 'gzip'  # 使用gzip压缩传输数据让访问更快


# 使用代理发起请求, 若访问的是http网页, 请将use_ssl设为false
res = proxy.start(uri.hostname, uri.port, :use_ssl => true) do |http|
    http.request(req)
end

# 输出状态码
puts "status code: #{res.code}"

# 输出响应体
if  res.code.to_i != 200 then
    puts "page content: #{res.body}"
else
    gz = Zlib::GzipReader.new(StringIO.new(res.body.to_s))
    puts "page content: #{gz.read}" 
end