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 杂谈《重构-改善既有代码的设计》之四 简化条件表达式
Apr 09 PHP
说说PHP的autoLoad自动加载机制
Sep 27 PHP
PHP中的str_repeat函数在JavaScript中的实现
Sep 16 PHP
从零开始学YII2框架(三)扩展插件yii2-gird
Aug 20 PHP
PHP之autoload运行机制实例分析
Aug 28 PHP
php获得客户端浏览器名称及版本的方法(基于ECShop函数)
Dec 23 PHP
php编程每天必学之表单验证
Mar 01 PHP
THINKPHP在添加数据的时候获取主键id的值方法
Apr 03 PHP
PHP memcache在微信公众平台的应用方法示例
Sep 13 PHP
利用php + Laravel如何实现部署自动化详解
Oct 11 PHP
如何在Laravel5.8中正确地应用Repository设计模式
Nov 26 PHP
php设计模式之工厂方法模式分析【星际争霸游戏案例】
Jan 23 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
简单示例AJAX结合PHP代码实现登录效果代码
2008/07/25 PHP
PHP学习笔记之二
2011/01/17 PHP
Trying to clone an uncloneable object of class Imagic的解决方法
2012/01/11 PHP
PHP cdata 处理(详细介绍)
2013/07/05 PHP
使用gd库实现php服务端图片裁剪和生成缩略图功能分享
2013/12/25 PHP
PHP实现多图片上传类实例
2014/07/26 PHP
codeigniter实现get分页的方法
2015/07/10 PHP
PHP策略模式定义与用法示例
2017/07/27 PHP
javascript 数组的方法集合
2008/06/05 Javascript
Dreamweaver jQuery智能提示插件,支持版本提示,支持1.6api
2011/07/31 Javascript
Javascript学习笔记-详解in运算符
2011/09/13 Javascript
cookie 最近浏览记录(中文escape转码)具体实现
2013/06/08 Javascript
js检查页面上有无重复id的实现代码
2013/07/17 Javascript
extjs每个组件要设置唯一的ID否则会出错
2014/06/15 Javascript
动态加载jQuery的两种方法实例分析
2015/07/17 Javascript
深入理解jquery跨域请求方法
2016/05/18 Javascript
微信小程序 监听手势滑动切换页面实例详解
2017/06/15 Javascript
Vue内容分发slot(全面解析)
2017/08/19 Javascript
Vue 样式绑定的实现方法
2019/01/15 Javascript
js实现一个简易计算器
2020/03/30 Javascript
Vue+Vuex实现自动登录的知识点详解
2020/03/04 Javascript
Python中获取对象信息的方法
2015/04/27 Python
django框架如何集成celery进行开发
2017/05/24 Python
python看某个模块的版本方法
2018/10/16 Python
python实现简易动态时钟
2018/11/19 Python
深入解析Python小白学习【操作列表】
2019/03/23 Python
详解python读取和输出到txt
2019/03/29 Python
Django配置Bootstrap, js实现过程详解
2020/10/13 Python
Python3利用openpyxl读写Excel文件的方法实例
2021/02/03 Python
html5 音乐播放器 audio 标签使用概述
2013/07/15 HTML / CSS
详解使用postMessage解决iframe跨域通信问题
2019/11/01 HTML / CSS
销售个人求职信范文
2014/04/28 职场文书
党员政治学习材料
2014/05/14 职场文书
授权委托书(完整版)
2014/09/10 职场文书
Spring Bean是如何初始化的详解
2022/03/22 Java/Android
Android RecyclerView实现九宫格效果
2022/06/28 Java/Android