php抓取页面的几种方法详解


Posted in PHP onJune 17, 2013

在 做一些天气预报或者RSS订阅的程序时,往往需要抓取非本地文件,一般情况下都是利用php模拟浏览器的访问,通过http请求访问url地址, 然后得到html源代码或者xml数据,得到数据我们不能直接输出,往往需要对内容进行提取,然后再进行格式化,以更加友好的方式显现出来。
下面简单说一下php抓取页面的几种方法及原理:
一、 PHP抓取页面的主要方法:
1. file()函数   
2. file_get_contents()函数 
3. fopen()->fread()->fclose()模式 
4.curl方式 
5. fsockopen()函数 socket模式 
6. 使用插件(如:http://sourceforge.net/projects/snoopy/)

二、PHP解析html或xml代码主要方式:
1. file()函数

<?php 
$url='http://t.qq.com'; 
$lines_array=file($url); 
$lines_string=implode('',$lines_array); 
echo htmlspecialchars($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都不能打开远程文件。
<?php 
$url='http://t.qq.com'; 
$lines_string=file_get_contents($url); 
echo htmlspecialchars($lines_string);

3. fopen()->fread()->fclose()模式
<?php 
$url='http://t.qq.com'; 
$handle=fopen($url,"rb"); 
$lines_string=""; 
do{ 
    $data=fread($handle,1024);
     if(strlen($data)==0) {
        break;
    } 
    $lines_string.=$data; 
}while(true); 
fclose($handle); 
echo htmlspecialchars($lines_string);

4. curl方式
使用curl必须空间开启curl。方法:windows下修改php.ini,将extension=php_curl.dll前面的分号去掉,而且需 要拷贝ssleay32.dll和libeay32.dll到C:\WINDOWS\system32下;Linux下要安装curl扩展。
<?php 
$url='http://t.qq.com'; 
$ch=curl_init(); 
$timeout=5; 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
$lines_string=curl_exec($ch); 
curl_close($ch); 
echo htmlspecialchars($lines_string);

5. fsockopen()函数 socket模式
socket模式能否正确执行,也跟服务器的设置有关系,具体可以通过phpinfo查看服务器开启了哪些通信协议,比如我的本地php socket没开启http,只能使用udp测试一下了。
<?php                                                                                                                                                
$fp = fsockopen("udp://127.0.0.1", 13, $errno, $errstr);
if (!$fp) { 
    echo "ERROR: $errno - $errstr<br />\n"
} else { 
    fwrite($fp, "\n")
    echo fread($fp, 26)
    fclose($fp)
} 

6. 插件
网上应该有比较多的插件,snoopy插件是在网上搜到的,有兴趣的可以研究一下。
PHP 相关文章推荐
php通过array_push()函数添加多个变量到数组末尾的方法
Mar 18 PHP
PHP CURL或file_get_contents获取网页标题的代码及两者效率的稳定性问题
Nov 30 PHP
分享php代码将360浏览器导出的favdb的sqlite数据库文件转换为html
Dec 09 PHP
PHP5.5迭代生成器用法实例详解
Mar 16 PHP
PHP数据的提交与过滤基本操作实例详解
Nov 11 PHP
thinkphp3.2中实现phpexcel导出带生成图片示例
Feb 14 PHP
ThinkPHP使用getlist方法实现数据搜索功能示例
May 08 PHP
yii2 上传图片的示例代码
Nov 02 PHP
ThinkPHP框架结合Ajax实现用户名校验功能示例
Jul 03 PHP
php生成短网址/短链接原理和用法实例分析
May 29 PHP
PHP操作Redis常用命令的实例详解
Dec 23 PHP
PHP并发场景的三种解决方案代码实例
Feb 27 PHP
深入PHP magic quotes的详解
Jun 17 #PHP
php错误级别的设置方法
Jun 17 #PHP
PHP大小写问题:函数名和类名不区分,变量名区分
Jun 17 #PHP
修改php.ini以达到屏蔽错误信息并记录日志
Jun 16 #PHP
php fsockopen伪造post与get方法的详解
Jun 14 #PHP
探讨:parse url解析URL,返回其组成部分
Jun 14 #PHP
PHP可变函数的使用详解
Jun 14 #PHP
You might like
php smarty的预保留变量总结
2008/12/04 PHP
php 高性能书写
2010/12/11 PHP
php 解决旧系统 查出所有数据分页的类
2012/08/27 PHP
LotusPhp笔记之:基于ObjectUtil组件的使用分析
2013/05/06 PHP
Youku 视频绝对地址获取的方法详解
2013/06/26 PHP
php 二维数组快速排序算法的实现代码
2017/10/17 PHP
Avengerls vs KG BO3 第一场2.18
2021/03/10 DOTA
JavaScript 函数参数是传值(byVal)还是传址(byRef) 分享
2013/07/02 Javascript
JS中的this变量的使用介绍
2013/10/21 Javascript
浅析JS运动
2015/12/28 Javascript
JavaScript设计模式经典之命令模式
2016/02/24 Javascript
深入浅出ES6新特性之函数默认参数和箭头函数
2016/08/01 Javascript
jquery实现手机端单店铺购物车结算删除功能
2017/02/22 Javascript
addeventlistener监听scroll跟touch(实例讲解)
2017/08/04 Javascript
利用10行js代码实现上下滚动公告效果
2017/12/08 Javascript
微信小程序外卖选购页实现切换分类与数量加减功能案例
2019/01/15 Javascript
Javascript迭代、递推、穷举、递归常用算法实例讲解
2019/02/01 Javascript
用Nodejs实现在终端中炒股的实现
2020/10/18 NodeJs
Vue实现指令式动态追加小球动画组件的步骤
2020/12/18 Vue.js
详解Python中内置的NotImplemented类型的用法
2015/03/31 Python
将Python的Django框架与认证系统整合的方法
2015/07/24 Python
python监控nginx端口和进程状态
2019/09/06 Python
用什么库写 Python 命令行程序(示例代码详解)
2020/02/20 Python
Python参数传递对象的引用原理解析
2020/05/22 Python
Python实现简单的猜单词小游戏
2020/10/28 Python
python中time包实例详解
2021/02/02 Python
中国综合性网上购物商城:当当(网上卖书起家)
2016/11/16 全球购物
Marmot土拨鼠官网:美国专业户外运动品牌
2018/01/11 全球购物
办公室助理岗位职责
2013/12/25 职场文书
幼儿园数学教学反思
2014/02/02 职场文书
小学生母亲节演讲稿
2014/05/07 职场文书
就业意向书
2014/07/29 职场文书
代收款委托书范本
2014/10/01 职场文书
单位租房协议范本
2014/12/03 职场文书
大专护理专业自荐信
2015/03/25 职场文书
公积金具结保证书
2015/05/11 职场文书