PHP 爬取网页的主要方法


Posted in PHP onJuly 13, 2018

主要流程就是获取整个网页,然后正则匹配(关键的)。

PHP抓取页面的主要方法,有几种方法是网上前辈的经验,现在还没有用到的,先存下来以后试试。

1.file()函数

2.file_get_contents()函数

3.fopen()->fread()->fclose()模式

4.curl方式 (本人主要用这个)

5.fsockopen()函数 socket模式

6.插件(如:http://sourceforge.net/projects/snoopy/)

7.file()函数

<?php
//定义url
$url='[http://t.qq.com](http://t.qq.com/)';//fiel函数读取内容数组
$lines_array=file($url);//拆分数组为字符串
$lines_string=implode('',$lines_array);//输出内容
echo $lines_string; 

2.使用file_get_contents方法实现,比较简单。

使用file_get_contents和fopen必须空间开启allow_url_fopen。方法:编辑php.ini,设置 allow_url_fopen = On,allow_url_fopen关闭时fopen和file_get_contents都不能打开远程文件。

$url="[http://news.sina.com.cn/c/nd/2016-10-23/doc-ifxwztru6951143.shtml](http://news.sina.com.cn/c/nd/2016-10-23/doc-ifxwztru6951143.shtml)";
$html=file_get_contents($url);
//如果出现中文乱码使用下面代码`
//$getcontent = iconv("gb2312", "utf-8",$html);
echo"<textarea style='width:800px;height:600px;'>".$html."</textarea>";

3.fopen()->fread()->fclose()模式 ,目前还没用过,看到了就先记下了

<?php
//定义url
$url='[http://t.qq.com](http://t.qq.com/)';//fopen以二进制方式打开 
$handle=fopen($url,"rb");//变量初始化
$lines_string="";//循环读取数据
do{
$data=fread($handle,1024);  
if(strlen($data)==0) {`
break; 
} 
$lines_string.=$data;
}while(true);//关闭fopen句柄,释放资源
fclose($handle);//输出内容
echo $lines_string;

4.使用curl实现(本人一般使用这个)。

使用curl必须空间开启curl。方法:windows下修改php.ini,将extension=php_curl.dll前面的分号去掉,而且需 要拷贝ssleay32.dll和libeay32.dll到C:\WINDOWS\system32下;Linux下要安装curl扩展。

<?php
header("Content-Type: text/html;charset=utf-8");
date_default_timezone_set('PRC');
$url = "https://***********ycare";//要爬取的网址
$res = curl_get_contents($url);//curl封装方法
preg_match_all('/<script>(.*?)<\/script>/',$res,$arr_all);//这个网页中数据通过js包过来,所以直接抓js就可以
preg_match_all('/"id"\:"(.*?)",/',$arr_all[1][1],$arr1);//从js块中匹配要的数据
$list = array_unique($arr1[1]);//(可省)保证不重复
//以下则是同理,循环则可
for($i=0;$i<=6;$i=$i+2){
  $detail_url = 'ht*****em/'.$list[$i];
  $detail_res = curl_get_contents($detail_url);
  preg_match_all('/<script>(.*?)<\/script>/',$detail_res,$arr_detail);
  preg_match('/"desc"\:"(.*?)",/',$arr_detail[1][1],$arr_content);
  ***
    ***
    ***
  $ret=curl_post('http://**********cms.php',$result);//此脚本未放在服务器上,原因大家懂就好哈。
}
function curl_get_contents($url,$cookie='',$referer='',$timeout=300,$ishead=0) {
  $curl = curl_init();
  curl_setopt($curl, CURLOPT_RETURNTRANSFER,1);
  curl_setopt($curl, CURLOPT_FOLLOWLOCATION,1);
  curl_setopt($curl, CURLOPT_URL,$url);
  curl_setopt($curl, CURLOPT_TIMEOUT,$timeout);
  curl_setopt($curl, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36');
  if($cookie)
  {
    curl_setopt( $curl, CURLOPT_COOKIE,$cookie);
  }
  if($referer)
  {
    curl_setopt ($curl,CURLOPT_REFERER,$referer);
  }
  $ssl = substr($url, 0, 8) == "https://" ? TRUE : FALSE;
  if ($ssl)
  {
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
  }
  $res = curl_exec($curl);
  return $res;
  curl_close($curl);
}
//curl post数据到服务器
function curl_post($url,$data){
  $ch = curl_init();
  curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
  //curl_setopt($ch,CURLOPT_FOLLOWLOCATION, 1);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36');
  curl_setopt($ch,CURLOPT_URL,$url);
  curl_setopt($ch,CURLOPT_POST,true);
  curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
  $output = curl_exec($ch);
  curl_close($ch);
  return $output; 
}
?>

5.fsockopen()函数 socket模式(没用过,以后可以试试)

socket模式能否正确执行,也跟服务器的设置有关系,具体可以通过phpinfo查看服务器开启了哪些通信协议

<?php
$fp = fsockopen("t.qq.com", 80, $errno, $errstr, 30);
if (!$fp) {
  echo "$errstr ($errno)<br />\n";
} else {
  $out = "GET / HTTP/1.1\r\n";
  $out .= "Host: t.qq.com\r\n";
  $out .= "Connection: Close\r\n\r\n";
  fwrite($fp, $out);
  while (!feof($fp)) {
    echo fgets($fp, 128);
  }
  fclose($fp);
}

6.snoopy插件,最新版本是Snoopy-1.2.4.zip Last Update: 2013-05-30,推荐大家使用

使用网上非常流行的snoopy来进行采集,这是一个非常强大的采集插件,并且它的使用非常方便,你也可以在里面设置agent来模拟浏览器信息。

说明:设置agent是在 Snoopy.class.php 文件的第45行,请在该文件中搜索 “var 公式输入有误_SERVER['HTTP_USER_AGENT']; 可以得到浏览器信息,将echo出来的内容复制到agent里面就可以了。

<?php
//引入snoopy的类文件
require('Snoopy.class.php');
//初始化snoopy类
$snoopy=new Snoopy;
$url="[http://t.qq.com](http://t.qq.com/)";
//开始采集内容`
$snoopy->fetch($url);
//保存采集内容到$lines_string
$lines_string=$snoopy->results;
//输出内容,嘿嘿,大家也可以保存在自己的服务器上
echo $lines_string;

总结

以上所述是小编给大家介绍的PHP 爬取网页的主要方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
excellent!――ASCII Art(由目标图象生成ascii)
Feb 20 PHP
php minixml详解
Jul 19 PHP
PHP调用Twitter的RSS的实现代码
Mar 10 PHP
php中出现空白页的原因及解决方法汇总
Jul 08 PHP
php类中的各种拦截器用法分析
Nov 03 PHP
thinkphp3.0输出重复两次的解决方法
Dec 19 PHP
PHP使用ffmpeg给视频增加字幕显示的方法
Mar 12 PHP
护卫神php套件 php版本升级方法(php5.5.24)
May 10 PHP
php socket通信(tcp/udp)实例分析
Feb 14 PHP
PHP Ajax实现无刷新附件上传
Aug 17 PHP
Yii全局函数用法示例
Jan 22 PHP
PHP图片水印类的封装
Jul 06 PHP
php实现微信发红包功能
Jul 13 #PHP
Yii2框架redis基本应用示例
Jul 13 #PHP
Yii2框架实现登陆添加验证码功能示例
Jul 12 #PHP
Yii框架日志记录Logging操作示例
Jul 12 #PHP
php unlink()函数使用教程
Jul 12 #PHP
总结PHP代码规范、流程规范、git规范
Jun 18 #PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
Jun 16 #PHP
You might like
微信支付开发教程(一)微信支付URL配置
2014/05/28 PHP
php目录拷贝实现方法
2015/07/10 PHP
js自带函数备忘 数组
2006/12/29 Javascript
JavaScript 动态将数字金额转化为中文大写金额
2009/05/14 Javascript
JavaScript版TAB选项卡效果实例
2013/08/16 Javascript
JavaScript如何从listbox里同时删除多个项目
2013/10/12 Javascript
JavaScript实现快速排序的方法
2015/07/31 Javascript
详解js私有作用域中创建特权方法
2016/01/25 Javascript
javaScript数组迭代方法详解
2016/04/14 Javascript
jQuery1.9+中删除了live以后的替代方法
2016/06/17 Javascript
jQuery动态生成Bootstrap表格
2016/11/01 Javascript
Form表单按回车自动提交表单的实现方法
2016/11/18 Javascript
JavaScript获取中英文混合字符串长度的方法示例
2017/02/04 Javascript
vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理
2017/03/06 Javascript
详解Vue用axios发送post请求自动set cookie
2017/05/10 Javascript
JavaSctit 利用FileReader和滤镜上传图片预览功能
2017/09/05 Javascript
Vue结合SignalR实现前后端实时消息同步
2017/09/19 Javascript
微信小程序使用progress组件实现显示进度功能【附源码下载】
2017/12/12 Javascript
vue如何在自定义组件中使用v-model
2018/05/14 Javascript
vue项目引入字体.ttf的方法
2018/09/28 Javascript
微信小程序map组件结合高德地图API实现wx.chooseLocation功能示例
2019/01/23 Javascript
浅析vue中的MVVM实现原理
2019/03/04 Javascript
jQuery实现轮播图源码
2019/10/23 jQuery
微信小程序实现电子签名功能
2020/07/29 Javascript
Vue基本指令实例图文讲解
2021/02/25 Vue.js
python中list循环语句用法实例
2014/11/10 Python
ubuntu系统下使用pm2设置nodejs开机自启动的方法
2018/05/12 NodeJs
python开启摄像头以及深度学习实现目标检测方法
2018/08/03 Python
python与c语言的语法有哪些不一样的
2020/09/13 Python
CSS3 Flex 弹性布局实例代码详解
2018/11/01 HTML / CSS
工商管理应届生求职信
2013/10/07 职场文书
期中考试反思800字
2014/05/01 职场文书
副校长竞聘演讲稿
2014/09/01 职场文书
五星红旗迎风飘扬观后感
2015/06/17 职场文书
学雷锋广播稿大全
2015/08/19 职场文书
react中props 的使用及进行限制的方法
2021/04/28 Javascript