【问题标题】:cURL doesn't work with pagination for a specific websitecURL 不适用于特定网站的分页
【发布时间】:2013-10-02 01:54:27
【问题描述】:

我试图从网站上删除一些内容,但我遇到了一个可能微不足道的问题,但我找不到解决方案。对于第一页,它可以工作,但是当我浏览(使用 curl)以下页面时,我仍然会得到第 1 页的内容,这很奇怪。我猜该网站有一些报废保护措施,但我找不到识别它们的方法……

<?php 
$i = 1;
$links = array();

while($i < 3) 
{ 
    $ch = curl_init();
    $url = 'http://www.gites-de-france.com/location-vacances-chambre-hotes.html?page=$i&chambre=o&xhtml=O&acc=CHAMBRE,CHAMBRE&order_by=prix&order_by_tri=asc&';
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_REFERER, "http://www.google.fr/");
    curl_setopt($ch, CURLOPT_USERAGENT, "MozillaXYZ/1.0");
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 100);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 

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

    $doc = phpQuery::newDocument($html);

    foreach($doc['.vignette a'] as $a){
        $url = '';
        $links[] .= pq($a)->attr('href');
    }
$i++;
}
    print_r($links);
?>

【问题讨论】:

    标签: php curl web-scraping screen-scraping phpquery


    【解决方案1】:

    您需要执行以下操作:

    /**
    *
    *
    * int $start start page number
    * int $limit maximum number of results
    * int $pgIncrmnt number of results per page
    *
    *
    */
    $buffer = NULL;
    $limit = 100;
    
    for ($j = $startPageNum; $j <= $limitMaxResult; $j = $j + $pgIncrmnt) {
        $chr = curl_init();
        curl_setopt($chr, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.6 (KHTML, like Gecko) Chrome/16.0.897.0 Safari/535.6');
        curl_setopt($chr, CURLOPT_HEADER, FALSE);
        curl_setopt($chr, CURLOPT_URL, 'http://www.windowsphone.com/');
        curl_setopt($chr, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($chr, CURLOPT_FRESH_CONNECT, TRUE);
        curl_setopt($chr, CURLOPT_FORBID_REUSE, TRUE);
        curl_setopt($chr, CURLOPT_FOLLOWLOCATION, TRUE);
    
        $buffer .= curl_exec($chr);
        curl_close($chr);
    }
    

    【讨论】:

    • 感谢您的意见,我尝试像 pastebin.com/cY2vbJyV 那样执行您的提议,我错过了什么吗?
    • 我可以在第 22 行看到问题 $html = curl_exec($ch);您应该在此处使用连接运算符以在 var $html 中获得完整的输出。 $html .= curl_exec($ch);如果有帮助,您可以将答案分数提高 1 ;-)
    • 感谢您的更正,但没有解决问题;)您不认为他们使用会话 cookie 来验证 url 中页面参数的使用吗?
    【解决方案2】:

    所以这里是解决方案,本网站使用cookies来传递一个会话号,所以你必须使用下面的代码

    curl_setopt($ch, CURLOPT_COOKIEJAR, '/tmp/cookie.txt');
    curl_setopt($ch, CURLOPT_COOKIEFILE, '/tmp/cookie.txt');
    

    现在可以了!

    【讨论】:

      【解决方案3】:

      这对我有用。

      $i = 1;
      $links = array();
      $baseUrl = "http://www.gites-de-france.com/location-vacances-chambre-hotes.html";
      $param = array(
          'chambre' => 'o',
          'xhtml' => 'O',
          'acc' => 'CHAMBRE,CHAMBRE',
          'order_by' => 'prix',
          'order_by_tri' => 'asc'
      );
      
      while($i < 3) { 
          $ch = curl_init();
      
          $param['page'] = $i;
          $url = "{$baseUrl}?" . http_build_query($param);
      
          curl_setopt($ch, CURLOPT_URL, $url);
          curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
          curl_setopt($ch, CURLOPT_REFERER, "http://www.google.fr/");
          curl_setopt($ch, CURLOPT_USERAGENT, "MozillaXYZ/1.0");
          curl_setopt($ch, CURLOPT_HEADER, 0);
          curl_setopt($ch, CURLOPT_TIMEOUT, 100);
          curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
          curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
          curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
      
          $html = curl_exec($ch);
          curl_close($ch);
      
          $doc = phpQuery::newDocument($html);
      
          foreach($doc['.vignette a'] as $a){
              $url = '';
              $links[] .= pq($a)->attr('href');
          }
          $i++;
      }
      print_r($links);
      

      注意:我在运行脚本之前手动创建了cookie.txt 文件。

      【讨论】:

        猜你喜欢
        • 2022-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多