摘要:本篇文章介绍PHP抓取网页内容技术,利用PHP cURL扩展获取网页内容,还能够抓取网页头部,设置cookie,处理302跳转。php
1、cURL安装css
采用源码安装PHP时,须要在configure时添加配置项,html
cd phpchrome
./configure --with-curl浏览器
安装完毕,能够利用php -m命令查看,是否已经支持cURL扩展。安全
php -m | grep curlcookie
也能够利用phpinfo查看,是否已经支持cURL扩展。网络
2、获取网页内容curl
cURL支持不少网络协议,如HTTP、HTTPS、FTP等。普通网页采用HTTP协议,一些安全性高的网页采用HTTPS(HTTPS协议采用数据加密技术,经过公钥技术交换密钥,加密传输内容。所以采用HTTPS协议的网页,在整个链路上传输的都是加密后的数据。例如Baidu采用HTTPS协议,你输入的关键字被网络传输协议加密,即便是运营商能够得到所有数据,也没法得到数据的内容。HTTPS协议也有缺点,就是加解密须要耗费计算时间,所以HTTPS网站会慢一些,而大多数网站都是采用HTTP协议)。HTTP协议中,定义了两种方法GET和POST。POST方法一般用于表单提交,可以提交文件等大数据。GET方法用来获取网页数据,也能够提交少许数据。本文主要介绍利用GET协议获取网页数据,未来再详细讲解cURL POST技术。工具
咱们先看一些浏览器是怎么工做的,打开chrome浏览器,F12进入开发者模式,将工具栏切换到network,以下图,利用chrome工具能够查看每一个文件的传输信息。
浏览器要加载一个网页,首先下载html文件,再下载js、css、图片等资源文件再进行渲染加载。一般数据抓取只须要抓取html文件,下图是chrome工具显示下载http文件的内容。
3、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); ?>
基本设置,返回网页内容。
4、得到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); ?>
5、抓取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&wd=&eqid=c89cf372000002cc0000000255705961&ie=utf-8"; $contents = getContents($url); echo $contents; ?>