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 相关文章推荐
Ajax+PHP 边学边练 之二 实例
Nov 24 PHP
探讨各种PHP字符串函数的总结分析
Jun 05 PHP
PHP APC的安装与使用详解
Jun 13 PHP
PHP is_subclass_of函数的一个BUG和解决方法
Jun 01 PHP
PHP 返回13位时间戳的实现代码
May 13 PHP
浅谈mysql_query()函数的返回值问题
Sep 05 PHP
php mysql_real_escape_string addslashes及mysql绑定参数防SQL注入攻击
Dec 23 PHP
PHP+原生态ajax实现的省市联动功能详解
Aug 15 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
Feb 06 PHP
php图片裁剪函数
Oct 31 PHP
php面向对象程序设计中self与static的区别分析
May 21 PHP
phpstudy隐藏index.php的方法
Sep 21 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数组函数序列之end() - 移动数组内部指针到最后一个元素,并返回该元素的值
2011/10/31 PHP
浅析PHP中的字符串编码转换(自动识别原编码)
2013/07/02 PHP
PHP+Ajax检测用户名或邮件注册时是否已经存在实例教程
2014/08/23 PHP
laravel admin实现分类树/模型树的示例代码
2020/06/10 PHP
xml和web特殊字符
2009/04/28 Javascript
JavaScript获取flash对象与网上的有所不同
2014/04/21 Javascript
jquery动态分页效果堪比时光网
2014/09/25 Javascript
javascript手风琴下拉菜单实现代码
2015/11/12 Javascript
js实现滚动条滚动到页面底部继续加载
2015/12/19 Javascript
jQuery实现获取元素索引值index的方法
2016/09/18 Javascript
javascript实现复选框全选或反选
2017/02/04 Javascript
js实现无缝滚动图
2017/02/22 Javascript
jQuery模拟窗口抖动效果
2017/03/15 Javascript
深入浅析Node.js单线程模型
2017/07/10 Javascript
基于 Vue 的树形选择组件的示例代码
2017/08/18 Javascript
React Native中Navigator的使用方法示例
2017/10/13 Javascript
使用Vue写一个datepicker的示例
2018/01/27 Javascript
Vue3.0结合bootstrap创建多页面应用
2019/05/28 Javascript
JS实现图片切换特效
2019/12/23 Javascript
springboot+vue+对接支付宝接口+二维码扫描支付功能(沙箱环境)
2020/10/15 Javascript
Python开发的单词频率统计工具wordsworth使用方法
2014/06/25 Python
9种python web 程序的部署方式小结
2014/06/30 Python
Python爬虫模拟登录带验证码网站
2016/01/22 Python
python爬虫实战之爬取京东商城实例教程
2017/04/24 Python
深入理解Python单元测试unittest的使用示例
2017/11/18 Python
Django admin实现图书管理系统菜鸟级教程完整实例
2017/12/12 Python
通过Python 获取Android设备信息的轻量级框架
2017/12/18 Python
python数据结构之线性表的顺序存储结构
2018/09/28 Python
浅谈python之高阶函数和匿名函数
2019/03/21 Python
Python 循环终止语句的三种方法小结
2019/06/24 Python
python 密码学示例——理解哈希(Hash)算法
2020/09/21 Python
环法自行车赛官方商店:Le Tour de France
2017/08/27 全球购物
为什么使用接口?
2014/08/13 面试题
医学类个人求职信范文
2014/02/05 职场文书
教育教学读书笔记
2015/07/02 职场文书
html form表单基础入门案例讲解
2021/07/21 HTML / CSS