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版本号
Oct 09 PHP
php 文件状态缓存带来的问题
Dec 14 PHP
使用PHP实现密保卡功能实现代码&amp;lt;打包下载直接运行&amp;gt;
Oct 09 PHP
用php来改写404错误页让你的页面更友好
Jan 24 PHP
php pki加密技术(openssl)详解
Jul 01 PHP
codeigniter自带数据库类使用方法说明
Mar 25 PHP
php+ajax实时刷新简单实例
Feb 25 PHP
php中 $$str 中 &quot;$$&quot; 的详解
Jul 06 PHP
PHP的Yii框架使用中的一些错误解决方法与建议
Aug 21 PHP
PHP生成条形码大揭秘
Sep 24 PHP
php格式化json函数示例代码
May 12 PHP
使用Rancher在K8S上部署高性能PHP应用程序的教程
Jul 10 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多个文件上传到服务器实例
2014/10/29 PHP
PHP使用feof()函数读文件的方法
2014/11/07 PHP
thinkPHP使用pclzip打包备份mysql数据库的方法
2016/04/30 PHP
thinkPHP框架实现多表查询的方法
2018/06/14 PHP
PHP PDOStatement::getAttribute讲解
2019/02/01 PHP
js检测输入内容全为空格的方法
2014/05/03 Javascript
jQuery检测返回值的数据类型
2015/07/13 Javascript
IE中document.createElement的iframe无法设置属性name的解决方法
2015/09/14 Javascript
jquery.zclip轻量级复制失效问题
2017/01/08 Javascript
AngularJS学习第二篇 AngularJS依赖注入
2017/02/13 Javascript
js实现简单的选项卡效果
2017/02/23 Javascript
Hexo已经看腻了,来手把手教你使用VuePress搭建个人博客
2018/04/26 Javascript
bootstrap select2插件用ajax来获取和显示数据的实例
2018/08/09 Javascript
解决betterScroll在vue中存在图片时,出现拉不动的问题
2018/09/27 Javascript
angularjs通过过滤器返回超链接的方法
2018/10/26 Javascript
Vue动态创建注册component的实例代码
2019/06/14 Javascript
js类的继承定义与用法分析
2019/06/21 Javascript
vue移动端城市三级联动组件使用详解
2019/07/26 Javascript
JS实现关闭小广告特效
2021/01/29 Javascript
关于你不想知道的所有Python3 unicode特性
2014/11/28 Python
Python 实现数据库更新脚本的生成方法
2017/07/09 Python
python实现对任意大小图片均匀切割的示例
2018/12/05 Python
Python语法分析之字符串格式化
2019/06/13 Python
Pycharm简单使用教程(入门小结)
2019/07/04 Python
Python Threading 线程/互斥锁/死锁/GIL锁
2019/07/21 Python
Django中的用户身份验证示例详解
2019/08/07 Python
python求解汉诺塔游戏
2020/07/09 Python
Python装饰器如何实现修复过程解析
2020/09/05 Python
六年级数学教学反思
2014/02/03 职场文书
高中运动会入场词
2014/02/14 职场文书
2014年信用社工作总结
2014/11/25 职场文书
2015高三毕业寄语赠言
2015/02/27 职场文书
2015中秋节晚会开场白
2015/07/30 职场文书
星际争霸:毕姥爷vs解冻03
2022/04/01 星际争霸
muduo TcpServer模块源码分析
2022/04/26 Redis
Java 死锁解决方案
2022/05/11 Java/Android