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 相关文章推荐
模仿OSO的论坛(三)
Oct 09 PHP
PHP批量生成缩略图的代码
Jul 19 PHP
php数组函数序列 之shuffle()和array_rand() 随机函数使用介绍
Oct 29 PHP
PHP中如何定义和使用常量
Feb 28 PHP
探讨php define()函数及defined()函数使用详解
Jun 09 PHP
PHP的foreach中使用引用时需要注意的一个问题和解决方法
May 29 PHP
PHP生成图片验证码、点击切换实例
Jun 25 PHP
深入讲解PHP Session及如何保持其不过期的方法
Aug 18 PHP
PHP实现清除MySQL死连接的方法
Jul 23 PHP
PHP实现的各类hash算法长度及性能测试实例
Aug 27 PHP
laravel-admin自动生成模块,及相关基础配置方法
Oct 08 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
Nov 14 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 论坛采集程序 模拟登陆,抓取页面 实现代码
2009/07/09 PHP
PHP中数组的分组排序实例
2014/06/01 PHP
使用ob系列函数实现PHP网站页面静态化
2014/08/13 PHP
php获取远程文件内容的函数
2015/11/02 PHP
php中对象引用和复制实例分析
2019/08/14 PHP
laravel csrf排除路由,禁止,关闭指定路由的例子
2019/10/21 PHP
JavaScript Event事件学习第一章 Event介绍
2010/02/07 Javascript
利用jq让你的div居中的好方法分享
2013/11/21 Javascript
node.js中的path.join方法使用说明
2014/12/08 Javascript
js判断是否按下了Shift键的方法
2015/01/27 Javascript
jquery判断至少有一个checkbox被选中的方法
2015/06/05 Javascript
jQuery的事件委托实例分析
2015/07/15 Javascript
基于Turn.js 实现翻书效果实例解析
2016/06/20 Javascript
jQuery中的AjaxSubmit使用讲解
2016/09/25 Javascript
如何用input标签和jquery实现多图片的上传和回显功能
2018/05/16 jQuery
javascript异步编程的六种方式总结
2019/05/17 Javascript
vue elementUI table 自定义表头和行合并的实例代码
2019/05/22 Javascript
python创建和使用字典实例详解
2013/11/01 Python
python数据结构之链表详解
2017/09/12 Python
python中利用zfill方法自动给数字前面补0
2018/04/10 Python
PyQt5实现拖放功能
2018/04/25 Python
Python人工智能之路 jieba gensim 最好别分家之最简单的相似度实现
2019/08/13 Python
numpy库reshape用法详解
2020/04/19 Python
使用pth文件添加Python环境变量方式
2020/05/26 Python
python3中calendar返回某一时间点实例讲解
2020/11/18 Python
原生canvas制作画图小工具的踩坑和爬坑
2020/06/09 HTML / CSS
Bose法国官网:购买耳机、扬声器、家庭影院、专业音响
2017/12/21 全球购物
CHARLES & KEITH澳大利亚官网:新加坡时尚品牌
2019/01/22 全球购物
Columbia Sportswear法国官网:全球户外品牌
2020/09/25 全球购物
长安大学毕业生自我鉴定
2014/01/17 职场文书
项目投资建议书
2014/05/16 职场文书
2015年大学元旦晚会活动策划书
2014/12/09 职场文书
如何写观后感
2015/06/19 职场文书
2016应届毕业生实习评语
2015/12/01 职场文书
golang switch语句的灵活写法介绍
2021/05/06 Golang
基于Redis位图实现用户签到功能
2021/05/08 Redis