首页 > 编程 > PHP > 正文

PHP爬虫技术(一)

2020-03-22 19:44:36
字体:
来源:转载
供稿:网友
  • 摘要:本篇文章介绍PHP抓取网页内容技术,利用PHPcURL扩展获取网页内容,还可以抓取网页头部,设置cookie,处理302跳转。

    一、cURL安装

    采用源码安装PHP时,需要在configure时添加配置项,

    cdphp

    ./configure--with-curl

    安装完毕,可以利用php-m命令查看,是否已经支持cURL扩展。

    php-m|grepcurl

    也可以利用phpinfo查看,是否已经支持cURL扩展。

    二、获取网页内容

    cURL支持很多网络协议,如HTTP、HTTPS、FTP等。普通网页采用HTTP协议,一些安全性高的网页采用HTTPS(HTTPS协议采用数据加密技术,通过公钥技术交换密钥,加密传输内容。因此采用HTTPS协议的网页,在整个链路上传输的都是加密后的数据。例如Baidu采用HTTPS协议,你输入的关键字被网络传输协议加密,即使是运营商可以获得全部数据,也无法获得数据的内容。HTTPS协议也有缺点,就是加解密需要耗费计算时间,因此HTTPS网站会慢一些,而大多数网站都是采用HTTP协议)。HTTP协议中,定义了两种方法GET和Z喎?http://www.it165.net/pro/pkqt/" target="_blank" html' target='_blank'>class="keylink">QT1NUoaNQT1NUt723qM2os6PTw9Pase21pczhvbujrMTcubvM4b27zsS8/rXItPPK/b7doaNHRVS3vbeo08PAtLvxyKHN+NKzyv2+3aOs0rK/ydLUzOG9u8nZwb/K/b7doaOxvs7E1vfSqr3pydzA+9PDR0VU0K3S6bvxyKHN+NKzyv2+3aOsvavAtNTZz+rPuL2yveJjVVJMJm5ic3A7UE9TVLy8yvWhozwvcD4KPHA+ztLDx8/Iv7TSu9Cp5K/AwMb3ysfU9cO0uaTX97XEo6y08r+qY2hyb21l5K/AwMb3o6xGMTK9+Mjrv6q3otXfxKPKvaOsvau5pL7fwLjH0Lu7tb1uZXR3b3Jro6zI58/CzbyjrMD708NjaHJvbWW5pL7fv8nS1LLpv7TDv7j2zsS8/rXEtKvK5NDFz6KhozwvcD4KPHA+PGltZyBzcmM9"http://www.it165.net/uploadfile/files/2015/0605/20150605193650340.png" alt="" width="842" height="577" />

    浏览器要加载一个网页,首先下载html文件,再下载js、css、图片等资源文件再进行渲染加载。通常数据抓取只需要抓取html文件,下图是chrome工具显示下载http文件的内容。

    三、PHP实现

    <?php$ch = curl_init();curl_setopt($ch, CURLOPT_URL, "www.qq.com");curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);$html = curl_exec($ch);curl_close($ch);var_dump($html);?>

    基本设置,返回网页内容。

    四、获得HTTP头部设置cookie

    有些网站,会采用cookie技术。当采集程序没带有相关cookie时,很容易被网站认定是“机器人”,拒绝对其服务。通过chrome调试www.sogou.com,发现cookie是包含在网页头信息中的。因此,我们需要两个步骤(1)HTTP头信息中获取cookie(2)发送请求时添加cookie。

    头信息包含设置cookie,

    刷新网页,查看头信息,请求包含cookie信息

    获取cookie

    <?php    $url = "www.sogou.com";    $ch = curl_init();    curl_setopt($ch, CURLOPT_URL, $url);    curl_setopt($ch, CURLOPT_NOBODY, true);    curl_setopt($ch, CURLOPT_HEADERFUNCTION, function ($ch, $str) use(&$setcookie) {      // 第一个参数是curl资源,第二个参数是每一行独立的header!      list ($name, $value) = array_map('trim', explode(':', $str, 2));      $name = strtolower($name);      if('set-cookie'==$name)      {        $setcookie[]=$value;      }      return strlen($str);    });    curl_exec($ch);    curl_close($ch);    $cookie = array();    foreach($setcookie as $c)    {      $tmp = explode(";",$c);      $cookie[] = $tmp[0];    }    $cookiestr = "Cookie:".implode(";", $cookie);    echo $cookiestr;?>

    返回结果

    Cookie:ABTEST=0|1433425917|v17;IPLOC=CN1100;SUID=3295CB6F1220920A00000000557057FD

    设置cookie

    <?php$url = "www.sogou.com";$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);$headers[] = $cookie;curl_setopt($ci, CURLOPT_HTTPHEADER, $headers);$html = curl_exec($ch);curl_close($ch);var_dump($html);?>

    五、抓取302跳转

    在Baidu中搜索关键词,返回的结果链接是一个Baidu加密过的链接,通过二次跳转才是真正的网址。(Baidu为了防止360抓取,把结果都加密了)。

    我们可以抓取头部中的location信息找到真实地址,

    <?php    $url = "https://www.baidu.com/link?url=b34APzBjz-cGLoxsG4-nviHmtVS0tCvEftS6ApCAsojT1a0h9oFFPprwK4JpNYgGaQE29QPUtRdPUeu3lIz2M7GW7dqLMi5ytlHLOVa3v_VY23dOoRiUSyV9zr_cI8Rg&wd=&eqid=c89cf372000002cc0000000255705961&ie=utf-8";    $ch = curl_init();    curl_setopt($ch, CURLOPT_URL, $url);    curl_setopt($ch, CURLOPT_NOBODY, true);    curl_setopt($ch, CURLOPT_HEADERFUNCTION, function ($ch, $str) use(&$location) {      // 第一个参数是curl资源,第二个参数是每一行独立的header!        list ($name, $value) = array_map('trim', explode(':', $str, 2));        $name = strtolower($name);        if('location'==$name)        {          $location = $value;          return 0;        }        return strlen($str);    });    curl_exec($ch);    curl_close($ch);    echo $location;?>

    抓取302跳转还有另外一种方式,利用ob重定向流的方式,并且设置允许curl跳转到新地址。代码如下

    <?php      function getContents($url){       $header = array("Referer: http://www.baidu.com/");       $ch = curl_init();       curl_setopt($ch, CURLOPT_URL, $url);       curl_setopt($ch, CURLOPT_TIMEOUT, 30);       curl_setopt($ch, CURLOPT_HTTPHEADER,$header);       curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);  //能无法 抓取跳转后的页面      ob_start();       curl_exec($ch);       $contents = ob_get_contents();       ob_end_clean();       curl_close($ch);       return $contents;       }       $url = "https://www.baidu.com/link?url=b34APzBjz-cGLoxsG4-nviHmtVS0tCvEftS6ApCAsojT1a0h9oFFPprwK4JpNYgGaQE29QPUtRdPUeu3lIz2M7GW7dqLMi5ytlHLOVa3v_VY23dOoRiUSyV9zr_cI8Rg&amp;wd=&amp;eqid=c89cf372000002cc0000000255705961&amp;ie=utf-8";      $contents = getContents($url);      echo $contents; ?>
    PHP编程

    郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

  • 发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表