使用代理IP

简介

某些情况下需要更换IP才能访问指定的应用,例如爬取网页时,如果你没有使用代理IP,那么你的IP一旦被对方服务器封禁,那么你就无法再爬取对方的资源了。

使用代理IP

我这里使用的是快代理的服务。购买了一天的独享IP来测试。

例如118.24.219.151:16816就是购买的代理IP

查看本机IP

浏览器访问如下地址:

https://api.ip.sb/ip

curl ip.sb

也可以使用快代理提供的网址:

https://dev.kdlapi.com/testproxy

测试代理可用性

HTTP代理

#带上用户名密码
curl -v "https://dev.kdlapi.com/testproxy" -x username:password@118.24.219.151:16816

#直接添加Proxy-Authorization
curl -v -H "Proxy-Authorization: Basic bXl1c2VybmFtZTpteXBhc3N3b3Jk" "https://dev.kdlapi.com/testproxy" -x 118.24.219.151:16816

bXl1c2VybmFtZTpteXBhc3N3b3Jk是用户名和密码通过:拼接后进行base64编码而成。
例如您的用户名是username,密码是password,用如下PHP脚本即可生成base64验证串:

echo base64_encode('username:password');

SOCKS代理

#带上用户名密码
curl -v "https://dev.kdlapi.com/testproxy" --socks5 username:password@118.24.219.151:16816

也可以使用谷歌浏览器的“SwitchyOmega”插件来测试:

PHP使用代理

<?php
$url = 'https://dev.kdlapi.com/testproxy';
$header[] = 'Proxy-Authorization: Basic bXl1c2VybmFtZTpteXBhc3N3b3Jk';
$data = curlGet($url,$header,'118.24.219.151',16816);
var_dump($data);die;


function curlGet($url = '', $header=[],$proxy='',$proxyPort='')
{
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    if($header){
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    }
    curl_setopt($ch, CURLOPT_PROXY, $proxy);
    curl_setopt($ch, CURLOPT_PROXYPORT, $proxyPort);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    $data = curl_exec($ch);
    if($data === false)
    {
        echo 'Curl error: ' . curl_error($ch);die;
    }
    curl_close($ch);
    return $data;
}

隧道代理

用户无须更换IP,隧道代理会将用户发送的请求转发到不同的代理IP。
使用隧道代理,开发者无需维护IP池,极大简化了编程的复杂度。
可以设置每次请求更换代理。

PHP使用隧道代理

代码中的xxx.xxxx.com就是代理的IP,10086就是代理的端口。

$url = 'https://api.ip.sb/ip';
$header[] = 'Proxy-Authorization: Basic bXl1c2VybmFtZTpteXBhc3N3b3Jk';
$data = curlGet($url,$header,'xxx.xxxx.com',10086);
var_dump($data);die;
function curlGet($url = '', $header=[],$proxy='',$proxyPort='')
{
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    if($header){
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    }
    curl_setopt($ch, CURLOPT_PROXY, $proxy);
    curl_setopt($ch, CURLOPT_PROXYPORT, $proxyPort);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    $data = curl_exec($ch);
    if($data === false)
    {
        echo 'Curl error: ' . curl_error($ch);die;
    }
    curl_close($ch);
    return $data;
}

PHP的Guzzle库使用代理

$client = new Client([
            'timeout'  => 1,
            'verify'=>false,
            'proxy' => '代理IP:代理端口'
]);

注意事项

访问https网站请设置IP白名单

curl(版本>7.30)在发起CONNECT请求时并不会在header里带上Proxy-Authorization,即便做了-H “Proxy-Authorization: Basic …或-x username:password@122.96.59.105:23068,这会导致代理服务器找不到Proxy-Authorization来验证身份,于是返回407错误
查看curl版本:curl --version
请在设置IP白名单后再做对https网页的测试

发表评论

邮箱地址不会被公开。 必填项已用*标注