在 做一些天气预报或者 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() 函数
代码如下:
- $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 都不能打开远程文件
代码如下:
- $url='http://t.qq.com';
- $lines_string=file_get_contents($url);
- echo htmlspecialchars($lines_string);
3. fopen()->fread()->fclose() 模式
代码如下:
- $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 扩展
代码如下:
- $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 测试一下了
代码如下:
- $fp = fsockopen("udp://127.0.0.1", 13, $errno, $errstr);
- if (!$fp) {
- echo "ERROR: $errno - $errstr\n"
- } else {
- fwrite($fp, "\n")
- echo fread($fp, 26)
- fclose($fp)
- }
6. 插件
网上应该有比较多的插件, snoopy 插件是在网上搜到的, 有兴趣的可以研究一下
来源: https://www.php1.cn/detail/php-aa80378771.html