代码样例-SOCKS5代理

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

代码样例使用说明

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

特别注意

以下代码样例均为基础样例,运行基础样例并不能保证成功爬取目标网站。目标网站通常具备反爬机制,比如跳转需要输入验证码的页面。

我们建议您在开发过程中基于基础样例进行如下改进:

  1. 添加IP池管理;
  2. 合理控制对目标网站的请求频率,建议对同一网站1个代理IP每秒请求不超过1次;
  3. 发出的http请求尽可能带上完整的header信息。

Python3

requests

requests(推荐)

使用提示

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

proxy_ip = "代理IP地址:端口号"
# 白名单方式(需提前设置白名单)
proxies = {
    "http": "socks5://%(proxy)s/" % {"proxy": proxy_ip},
    "https": "socks5://%(proxy)s/" % {"proxy": proxy_ip}
}
target_url = "http://www.xx.com"

# 使用代理IP发送请求
response = requests.get(target_url, proxies=proxies)

if response.status_code == 200:
    print(response.text)

aiohttp

aiohttp

使用提示

  1. 基于aiohttp的代码样例支持访问http,https网页
  2. aiohttp不是python原生库,需要安装才能使用: pip install aiohttp, pip install aiohttp-socks
  3. aiohttp只支持Python3.5及以上
  4. 如Windows系统使用aiohttp访问https网站抛出异常,在import asyncio后调用 asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())即可解决。
import aiohttp
import aiohttp_socks
import asyncio
"""
使用aiohttp请求代理服务器
请求http和https网页均适用
"""
async def fetch(url, proxy):
    # 设置代理
    connector = aiohttp_socks.ProxyConnector.from_url(proxy)
    async with aiohttp.ClientSession(connector=connector) as session:
        async with session.get(url) as response:
            print("Status: {response.status}")
            print(await response.text())

proxy_url = "socks5://代理IP地址:端口号"

# 目标网页
url_to_fetch = "http://www.xx.com"

asyncio.run(fetch(url_to_fetch, proxy_url))

Python2

requests

requests(推荐)

使用提示

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

proxy_ip = "IP代理地址:端口号"
proxies = {
    "http": "socks5://%(proxy)s/" % {"proxy": proxy_ip},
    "https": "socks5://%(proxy)s/" % {"proxy": proxy_ip}
}

target_url = "http://www.xx.com"

response = requests.get(target_url, proxies=proxies)

if response.status_code == 200:
    print response.text

Python-Selenium

Chrome

Chrome(IP白名单,推荐)

使用提示

  1. 基于白名单方式使用Selenium+Chrome认证代理
  2. 运行环境要求python2/3 + selenium + Chrome + Chromedriver + Windows/Linux/macOS
  3. 下载chromedriver(注意chromedriver版本要和Chrome版本对应)
  4. selenium不是python原生库,需要安装才能使用:pip install selenium (注意:selenium 4.6版本开始,无需手动下载driver)
  5. 请注意替换代码中的部分信息:
    ip:port:代理IP:端口号
    chromedriver_path:您本机chromedriver驱动存放路径,如:"C:\\chromedriver.exe"
from selenium import webdriver
import time

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server=socks5://ip:port')  # 代理IP:端口号
# selenium 4.6及以上
driver = webdriver.Chrome(options=chrome_options)
# executable_path: chromedriver驱动存放路径
# driver = webdriver.Chrome(executable_path="C:\\chromedriver.exe", options=chrome_options)
driver.get("https://www.xx.com/")

# 获取页面内容
print(driver.page_source)

# 延迟3秒后关闭当前窗口,如果是最后一个窗口则退出
time.sleep(3)
driver.close()

PhantomJS

PhantomJS(用户名密码认证)

使用提示

  1. 基于用户名密码使用 Selenium + PhantomJS认证代理(PhantomJS是无界面浏览器)
  2. 运行环境要求python2/3 + selenium + PhantomJS + Windows/Linux/macOS
  3. 点此下载PhantomJS(推荐使用2.1.1版)
  4. executable_path:您本机PhantomJS驱动存放路径,如:"C:\phantomjs-2.1.1-windows\bin\phantomjs.exe"
  5. Selenium新版本不支持phantom.js,推荐安装pip install selenium==2.48.0
from selenium import webdriver
import time

# 先下载phantomjs包文件,再填入phantomjs.exe的路径 (路径不要包含中文)
executable_path = 'C:\\phantomjs.exe'
service_args=[
    '--proxy=ip:port',
    '--proxy-type=socks5'
    #'--proxy-auth=username:password'
]
driver=webdriver.PhantomJS(service_args=service_args, executable_path=executable_path)
driver.get('http://www.xx.com')

print(driver.page_source)
time.sleep(3)
driver.close()

Java

okhttp3

okhttp-3.8.1

使用提示

  1. 此样例同时支持访问http和https网页
  2. 使用用户名密码验证时必须使用java.net.Authenticator.setDefault()方法
  3. 添加依赖:
    okhttp-3.8.1
import okhttp3.*;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.PasswordAuthentication;
import java.net.Proxy;
public class SOCKS5Okhttp {
    public static void main(String args[]) throws IOException {
        // 目标网站
        String targetUrl = "https://www.xx.com";

        // 用户名密码认证(私密代理/独享代理)
        //final String username = "username";
        //final String password = "password";

        String ip = "代理服务器IP";
        int port = 端口号;

        Proxy proxy = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress(ip, port));
        /*
        java.net.Authenticator.setDefault(new java.net.Authenticator(){//通过设置一个全局的Authenticator,实现socks设置Authenticator用户名密码

            private PasswordAuthentication authentication = new PasswordAuthentication(username, password.toCharArray());
            @Override
            protected PasswordAuthentication getPasswordAuthentication()
            {
                return authentication;
            }
        });
         */
        OkHttpClient client = new OkHttpClient.Builder()
                .proxy(proxy)
                .build();

        Request request = new Request.Builder()
                .url(targetUrl)
                .addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3100.0 Safari/537.36")
                .build();

        Response response = client.newCall(request).execute();
        System.out.println(response.body().string());

    }
}

jdk

IP白名单

使用提示

  1. http/https网页均可适用
  2. 运行环境要求 jdk >= 1.6
import org.apache.commons.io.IOUtils;
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.nio.charset.StandardCharsets;
import java.util.zip.GZIPInputStream;
public class Sock5 {
// 请求socks代理服务器
// http和https网页均适用

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

            //白名单认证
            String proxyIp = "IP代理地址";
            int proxyPort = 端口号;

            // 用户名密码认证(私密代理/独享代理)
            //String username = "username";  // 用户名
            //String password = "password"; // 密码

            // 要访问的目标网页
            String pageUrl = "http://www.xx.com";

            //确保使用用户名密码鉴权正常运行
            //System.setProperty("jdk.http.auth.tunneling.disabledSchemes", "");

            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 result = IOUtils.toString(inputStream, StandardCharsets.UTF_8);

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

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

GoLang

标准库

IP白名单认证

使用提示

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

import (
    "compress/gzip"
    "fmt"
    "io"
    "io/ioutil"
    "net/http"
    "os"
    "golang.org/x/net/proxy"
)
// 请求socks代理服务器(用户名密码认证)
// http和https网页均适用

func main() {
    // 用户名密码认证
    // username := "username"
    // password := "password"

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

    proxy_str := "服务器地址:端口号"

    // 目标网页
    page_url := "http://www.xx.com"

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

    // 白名单设置代理
    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) // 获取状态码

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

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

CSharp

HttpToSocks5

HttpToSocks5Proxy

使用提示

  1. http/https网页均可适用
  2. HttpToSocks5Proxy是第三方库,请先安装后再运行。
using System.IO.Compression;
using System.Text;
using MihaZupan;

namespace Sample
{
    internal class Program
    {

        static void Main(string[] args)
        {
            //SOCKS代理
            SocksTest();
            Console.ReadKey();
        }
        static void SocksTest()
        {
            // 目标网页
            string page_url = "http://www.xx.com";

            // 代理服务器
            string proxy_ip = "服务器地址";
            int proxy_port = 端口号;

            // 设置代理 (已添加白名单)
            var proxy = new HttpToSocks5Proxy(new[] {
                new ProxyInfo(proxy_ip, proxy_port),
            });

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

            HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, page_url);
            var httpsGet = httpClient.SendAsync(httpRequestMessage);

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

            string reader = new StreamReader(result.Content.ReadAsStreamAsync().Result).ReadToEnd();
            
            Console.WriteLine(reader);

        }
    }
}

Node.js

request-promise

request-promise(IP白名单)

使用提示

  1. http/https网页均可适用
  2. 请先安装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 = 'IP地址';
const proxy_port = 端口号;

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

// 要访问的目标网页
let url = 'http://www.baidu.com';

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白名单)

使用提示

  1. http/https网页均可适用
  2. 运行环境要求: node7.6.0或以上 + puppeteer
  3. 请先安装puppeteer: npm i puppeteer
  4. puppeteer模块的socks代理暂不支持用户名密码的方式验证身份

                            

Ruby

socksify

socksify(IP白名单)

使用提示

  1. http/https网页均可适用, IP白名单认证
  2. 请先安装socksify: gem install socksify

                            

net/http

net/http(用户名密码认证)

使用提示

  1. http/https网页均可适用, 用户名密码认证

                            

php

curl

curl

使用提示

  1. 此样例同时支持访问http和https网页
  2. curl不是php原生库,需要安装才能使用:
    Ubuntu/Debian系统:apt-get install php5-curl
    CentOS系统:yum install php-curl

  3. Windows系统:https://curl.se/windows/dl-8.4.0_1/
function sendRequest($url)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
    curl_setopt($ch, CURLOPT_PROXY, 'socks5://ip:port');

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    curl_close($ch);
    return $response;
}

// 要访问的目标页面
$url = "www.xx.com";
$response = sendRequest($url);
echo 'Response: ' . $response;

易语言

易语言使用代理

使用提示

  1. 易语言原生不直接支持HTTP代理,通常需要借助第三方库或调用系统命令(如 curl)来实现。请将 代理IP 和 代理端口 替换为您在携趣网络账户中获取的实际代理信息。
.子程序 _启动子程序, 整数型
.局部变量 请求地址, 文本型
.局部变量 代理IP, 文本型
.局部变量 代理端口, 文本型
.局部变量 响应内容, 文本型

' 设置S5代理IP和端口(请替换为您的实际代理信息)
代理IP = “您的S5代理IP”
代理端口 = “您的S5代理端口”

' 要访问的网址
请求地址 = “http://www.xx.com”

' 使用易语言调用系统命令(如curl)来实现S5代理
' 注意:此方法依赖于系统环境支持curl命令
' 如果您有更具体的易语言网络库,请参考文档中的样例

' 示例:使用系统命令调用curl(需确保易语言环境支持)
' curl -x socks5://代理IP:代理端口 http://www.baidu.com