PHP 和旋转代理

Posted

技术标签:

【中文标题】PHP 和旋转代理【英文标题】:PHP and rotating proxies 【发布时间】:2011-06-20 19:03:30 【问题描述】:

你们中有人尝试过使用轮换代理吗?这实施起来有多容易?它运作良好吗?请您的经验

PS:我看到像"how to make php script use a list of proxies" 这样的问题有很多缺点。你能在输入-1之前解释一下吗?

【问题讨论】:

我记得曾尝试为客户做这样的事情。最大的问题是获得稳定的代理列表以供使用。最初我们是从一个网站上删除列表,但问题是他们可以改变一些东西,脚本就停止工作了。 请访问this link获取适当的解决方案。 您可以使用付费解决方案,例如gimmeproxy.com 【参考方案1】:

----- 2017 年 3 月 4 日更新 --------


我去过那里,发现最好的解决方案是:

如果您没有专用服务器或至少没有 vps 并且有一点耐心,请不要费心阅读本文的其余部分...

1 - 从源代码安装 Squid 3.2(查看以下注释) 2 - 将 20 个左右的 ip 列表添加到 squid.conf(每月花费大约 25 美元) 3 - 使用新功能ACLrandom 轮换传出IP。

这样,您不需要在 php 脚本上轮换 ip 列表,而是连接到相同的 ip(例如:192.168.1.1:3129)但 可见的传出 ip (tcp_outgoing_address) 将根据随机设置轮换每个请求。

您需要使用 '-enable-http-violations' 编译 squid 3.2 以使其成为精英匿名代理。

分步安装:

yum -y groupinstall 'Development Tools'
yum -y install openssl-devel
wget http://www.squid-cache.org/Versions/v3/3.2/squid-3.2.13.tar.gz
tar -xvf squid-3.2.13.tar.gz
cd squid-3.2.13
./configure -prefix=/squid32 '--enable-removal-policies=heap,lru' '--enable-ssl' '--with-openssl' '--enable-linux-netfilter' '--with-pthreads' '--enable-ntlm-auth-helpers=SMB,fakeauth' '--enable-external-acl-helpers=ip_user,ldap_group,unix_group,wbinfo_group' '--enable-auth-basic' '--enable-auth-digest' '--enable-auth-negotiate' '--enable-auth-ntlm' '--with-winbind-auth-challenge' '--enable-useragent-log' '--enable-referer-log' '--disable-dependency-tracking' '--enable-cachemgr-hostname=localhost' '--enable-underscores' '--enable-build-info' '--enable-cache-digests' '--enable-ident-lookups' '--enable-follow-x-forwarded-for' '--enable-wccpv2' '--enable-fd-config' '--with-maxfd=16384' '-enable-http-violations'
make
make install

squid.conf 示例(在本例中位于 /squid32/etc/squid.conf):

#this will be the ip and port where squid will run
http_port 5.5.5.5:33333 # change this ip and port ...

#Extra parameters on squid.conf to make **an elite proxy**

request_header_access Allow allow all 
request_header_access Authorization allow all 
request_header_access WWW-Authenticate allow all 
request_header_access Proxy-Authorization allow all 
request_header_access Proxy-Authenticate allow all 
request_header_access Cache-Control allow all 
request_header_access Content-Encoding allow all 
request_header_access Content-Length allow all 
request_header_access Content-Type allow all 
request_header_access Date allow all 
request_header_access Expires allow all 
request_header_access Host allow all 
request_header_access If-Modified-Since allow all 
request_header_access Last-Modified allow all 
request_header_access Location allow all 
request_header_access Pragma allow all 
request_header_access Accept allow all 
request_header_access Accept-Charset allow all 
request_header_access Accept-Encoding allow all 
request_header_access Accept-Language allow all 
request_header_access Content-Language allow all 
request_header_access Mime-Version allow all 
request_header_access Retry-After allow all 
request_header_access Title allow all 
request_header_access Connection allow all 
request_header_access Proxy-Connection allow all 
request_header_access User-Agent allow all 
request_header_access Cookie allow all 
request_header_access All deny all 

via off
forwarded_for off
follow_x_forwarded_for deny all

acl vinte1 random 1/5 
acl vinte2 random 1/5
acl vinte3 random 1/5
acl vinte4 random 1/5
acl vinte5 random 1/5

tcp_outgoing_address 1.1.1.1 vinte1 # fake ip's , replace with yours
tcp_outgoing_address 1.1.1.2 vinte2
tcp_outgoing_address 1.1.1.3 vinte3
tcp_outgoing_address 1.1.1.4 vinte4
tcp_outgoing_address 1.1.1.5 vinte5

tcp_outgoing_address 1.1.1.6 # this will be the default tcp outgoing address

使用 squid 代理的 PHP CURL 请求示例:

$proxy = "1.1.1.1:33333";
$useragent="Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1";
$url = "https://api.ipify.org/";

$ch = curl_init();
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT,15);
curl_setopt($ch, CURLOPT_HTTP_VERSION,'CURL_HTTP_VERSION_1_1' );
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
curl_setopt($ch, CURLOPT_PROXY, $proxy);
curl_setopt($ch, CURLOPT_PROXYUSERPWD,'USER:PASS');
curl_setopt($ch, CURLOPT_USERAGENT,$useragent);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
$result=curl_exec ($ch);
curl_close ($ch);
echo $result

有用的链接:Squid 3.2 来源:http://www.squid-cache.org/Versions/v3/3.2/squid-3.2.13.tar.gzRotating_three_IPs:http://wiki.squid-cache.org/ConfigExamples/Strange/RotatingIPs#Example:_Rotating_three_IPs_based_on_time_of_dayAclRandom:http://wiki.squid-cache.org/Features/AclRandom在 CentOS 5.3 上安装 Squid 3.2 - http://www.guldmyr.com/blog/installing-squid-3-2-on-centos-5-3/为 Squid 添加密码:How to set up a squid Proxy with basic username and password authentication? p>

我发现这是轮换代理最可靠和最安全的方式,因为您不依赖第三方代理提供商,而且您的信息(密码、数据等)会更安全。 一开始可能听起来有点难以设置,但它会在你花费的每一秒内得到回报,GL :)

【讨论】:

在我看来,安装和配置 squid 对于一个简单的旋转代理脚本来说似乎有点过头了。 感谢您的评论@pguardiario,您还有其他解决方案吗?如果是这样,我想听听(老实说)。【参考方案2】:

PHP Curl 支持很多代理命令。

CURLOPT_PROXYAUTH CURLOPT_PROXYPORT CURLOPT_PROXYTYPE CURLOPT_PROXY CURLOPT_PROXY_SERVICE_NAME CURLOPT_PROXYUSERPWD CURLOPT_PROXYHEADER CURLOPT_HTTPPROXYTUNNEL

查看更多信息:http://php.net/manual/en/function.curl-setopt.php

下面的简单示例。

$proxy      =   array();
$proxy[]    =   '1.2.3.4';
$proxy[]    =   '5.6.7.8';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_PROXY, $proxy[array_rand($proxy)]);

curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);


$result =   curl_exec($ch);
curl_close($ch);

【讨论】:

我举了一个使用 PHP CURL 的旋转代理的例子,我收到了反对票?

以上是关于PHP 和旋转代理的主要内容,如果未能解决你的问题,请参考以下文章

代理模式和php实现

代理模式和php实现

nginx反向代理tomcat8和php7(四)

php设计模式 -- 代理模式

关于 海思Hi3516横竖屏Qt使用QGraphicsScene代理窗口强制旋转导致弹窗旋转与阴影不显示的 解决方案

关于 海思Hi3516横竖屏Qt使用QGraphicsScene代理窗口强制旋转导致弹窗旋转与阴影不显示的 解决方案