zoukankan      html  css  js  c++  java
  • curl抓取页面时遇到重定向的解决方法

    用php的curl抓取网页遇到了问题,为阐述方便,将代码简化如下:

    <?php
    function curlGet($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_HEADER, true);
    return curl_exec($ch);
    }
    
    $url = 'http://144go.com';
    echo curlGet($url), "\n";

    代码的目的很简单,抓取页面:http://www.144go.com
    执行上述代码,得到的结果:

    HTTP/1.1 301 Moved Permanently
    Content-Length: 144
    Content-Type: text/html
    Location: http://www.144go.com/
    Server: Microsoft-IIS/6.0
    X-Powered-By: ASP.NET
    Date: Mon, 03 Sep 2012 04:25:22 GMT
     
    <head><title>Document Moved</title></head>
    <body><h1>Object Moved</h1>This document may be found <a HREF="http://www.144go.com/">here</a></body>


    由结果中的
    Location: http://www.144go.com/
    可知http://144go.com被重定向到了http://www.144go.com/
    怎么办呢,要用正则分析出Location部分的链接,重复执行执行curlGet吗?行到是行,就是有点麻烦。

    其实只要加一条语就可以了:

    <?php
    function curlGet($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_HEADER, true);
      //函数中加入下面这条语句
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
    return curl_exec($ch);
    }

    再次执行代码,可以抓取到想要的页面。
    CURLOPT_FOLLOWLOCATION指明:
    让curl递归的抓取http头中Location中指明的url。
    当抓取次数超过CURLOPT_MAXREDIRS时,递归将终止。
    在抓取中任何跳转带来的问题,都可通过设置此参数解决。


    有关重定向的问题,可参考HTTP返回码中301与302的区别
    ---------------------

    原文链接:https://blog.csdn.net/qmhball/article/details/7937534

  • 相关阅读:
    【[国家集训队]最长双回文串】
    【[国家集训队]Crash的数字表格 / JZPTAB】
    【YY的GCD】
    【于神之怒加强版】
    【[SDOI2015]约数个数和】
    【[TJOI2010]电影迷】
    【[SDOI2011]拦截导弹】
    【[SDOI2014]数表】
    linux系统编程之管道(三)
    linux系统编程之管道(二)
  • 原文地址:https://www.cnblogs.com/lxwphp/p/15453168.html
Copyright © 2011-2022 走看看