【问题标题】:PHP set browser agent with fsockopen/cURLPHP 使用 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 的标头以及任何浏览器字符串,以便设置用户代理。
  • 如果您将其作为答案,我可以接受。

标签: php curl fsockopen web-crawler


【解决方案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 );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    • 2023-03-15
    • 2013-02-07
    • 2015-04-18
    • 2023-04-10
    • 2011-06-05
    • 2011-06-23
    相关资源
    最近更新 更多