PHP 使用 fsockopen/cURL 设置浏览器代理

Posted

技术标签:

【中文标题】PHP 使用 fsockopen/cURL 设置浏览器代理【英文标题】:PHP set browser agent with fsockopen/cURL 【发布时间】:2012-11-01 04:11:44 【问题描述】:

我编写了一个爬虫,它显然被某些网站阻止了。我想做的是获取带有虚假用户代理 ID 的页面(类似于Mozilla/5.0 (Windows NT 6.1; WOW64; rv:7.0.1) Gecko/20100101 Firefox/7.0.12011-10-16 20:23:00)。请注意,fsockopen() 不支持该功能,因此我尝试以不同的方式进行操作。

这是我的代码:

$sock = fsockopen($host, 80, $errno, $errstr, 30);

然后在下面,这是我用指针做的事情:

    $request  = "HEAD "  . $path . " HTTP/1.1\r\n"; 
    $request .= 'Host: ' . $host . "\r\n"; 
    $request .= "Connection: Close\r\n\r\n"; 
    fwrite($sock, $request);

再次,我如何设置一个假的浏览器代理?我可以在$request 字符串中设置它吗?

【问题讨论】:

您需要发送一个名为 User-Agent 的标头以及任何浏览器字符串,以便设置用户代理。 如果您将其作为答案,我可以接受。 【参考方案1】:

如果您使用 php cURL(正如您在标签中建议的那样),您应该可以这样做:

curl_setopt($ch, CURLOPT_HTTPHEADER, array('User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:7.0.1) Gecko/20100101 Firefox/7.0.12011-10-16 20:23:00'));      

【讨论】:

我需要更多的时间让服务器接受我来自 php 刮板的代码。【参考方案2】:

使用 fsockopen,您可以像添加其他 Headers 选项一样添加用户代理:

$sock = fsockopen($host, 80, $errno, $errstr, 30);

$request  = "HEAD "  . $path . " HTTP/1.1\r\n"; 
$request .= 'Host: ' . $host . "\r\n"; 
$request .= "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:7.0.1) Gecko/20100101 Firefox/7.0.12011-10-16 20:23:00\r\n";
$request .= "Connection: Close\r\n\r\n"; 


fwrite($sock, $request);

用 PHP5.3 测试

【讨论】:

这应该是公认的答案。与 cURL 一样棒,这是解释如何使用 fsockopen() 执行此操作的唯一答案,就像 OP 特别要求的那样。 (它也帮助了我,因为有时你不能使用 cURL 的原因......)【参考方案3】:

这对我有用

$cookie = tempnam ("/tmp", "CURLCOOKIE");
$ch = curl_init();
curl_setopt( $ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1" );
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_COOKIEJAR, $cookie );
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
curl_setopt( $ch, CURLOPT_ENCODING, "" );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_AUTOREFERER, true );
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );    # required for https urls
curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, $timeout );
curl_setopt( $ch, CURLOPT_TIMEOUT, $timeout );
curl_setopt( $ch, CURLOPT_MAXREDIRS, 10 );
$content = curl_exec( $ch );
echo $content;
$response = curl_getinfo( $ch );
curl_close ( $ch );

【讨论】:

以上是关于PHP 使用 fsockopen/cURL 设置浏览器代理的主要内容,如果未能解决你的问题,请参考以下文章

php 上传缩放图片

谷歌浏览器插件设置域名cookie的方法

php实现等比例不失真缩放上传图片

php实现等比例不失真缩放上传图片的方法

PHP 计算两个日期间隔天数

无法在 android 浏览器中使用 php 下载文件