简介
某些情况下需要更换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网页的测试