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 相关文章推荐
phpmyadmin中配置文件现在需要绝密的短语密码的解决方法
Feb 11 PHP
PHP+FLASH实现上传文件进度条相关文件 下载
Jul 21 PHP
又一个php 分页类实现代码
Dec 03 PHP
如何突破PHP程序员的技术瓶颈分析
Jul 17 PHP
浅析Mysql 数据回滚错误的解决方法
Aug 05 PHP
php用正则表达式匹配中文实例详解
Nov 06 PHP
Thinkphp关闭缓存的方法
Jun 26 PHP
PHP实现的memcache环形队列类实例
Jul 28 PHP
PHP验证码生成原理和实现
Jan 24 PHP
php简单实现数组分页的方法
Apr 30 PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
Nov 22 PHP
PHP+redis实现的购物车单例类示例
Feb 02 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
WinXP + Apache +PHP5 + MySQL + phpMyAdmin安装全功略
2006/07/09 PHP
解决phpmyadmin 乱码,支持gb2312和utf-8
2006/11/20 PHP
深入理解PHP原理之异常机制
2010/08/21 PHP
解析php中eclipse 用空格替换 tab键
2013/06/24 PHP
使用php判断网页是否gzip压缩
2013/06/25 PHP
PHP实现基于PDO扩展连接PostgreSQL对象关系数据库示例
2018/03/31 PHP
PHP读取文件或采集时解决中文乱码
2021/03/09 PHP
一个js封装的不错的选项卡效果代码
2008/02/15 Javascript
JavaScript显示当然日期和时间即年月日星期和时间
2013/10/29 Javascript
javascript定义变量时带var与不带var的区别分析
2015/01/12 Javascript
基于jQuery实现的QQ表情插件
2015/08/25 Javascript
轻松实现Bootstrap图片轮播
2020/04/20 Javascript
探讨JavaScript语句的执行过程
2016/01/28 Javascript
简单实现nodejs上传功能
2017/01/14 NodeJs
vue实现员工信息录入功能
2020/06/11 Javascript
Electron实现应用打包、自动升级过程解析
2020/07/07 Javascript
Python continue语句用法实例
2014/03/11 Python
从零学Python之入门(四)运算
2014/05/27 Python
python通过tcp发送xml报文的方法
2018/12/28 Python
解决python Markdown模块乱码的问题
2019/02/14 Python
Python中整数的缓存机制讲解
2019/02/16 Python
python3 webp转gif格式的实现示例
2019/12/10 Python
tensorflow实现读取模型中保存的值 tf.train.NewCheckpointReader
2020/02/10 Python
Python爬虫工具requests-html使用解析
2020/04/29 Python
Django如何使用redis作为缓存
2020/05/21 Python
详解Python设计模式之策略模式
2020/06/15 Python
Python 测试框架unittest和pytest的优劣
2020/09/26 Python
爱尔兰灯和灯具网上商店:Lights.ie
2018/03/26 全球购物
Europcar意大利:汽车租赁
2019/07/07 全球购物
公积金单位接收函
2014/01/11 职场文书
应届生求职信范文
2014/05/26 职场文书
护理专业毕业生自荐信
2014/06/15 职场文书
励志演讲稿大全
2014/08/21 职场文书
乡党委干部党的群众路线教育实践活动个人对照检查材料思想汇报
2014/10/01 职场文书
先进班集体事迹材料
2014/12/25 职场文书
如何在Python中创建二叉树
2021/03/30 Python