php中get_meta_tags()、CURL与user-agent用法分析


Posted in PHP onDecember 16, 2014

本文实例分析了php中get_meta_tags()、CURL与user-agent用法。分享给大家供大家参考。具体分析如下:

get_meta_tags()函数用于抓取网页中<meta name="A" content="1"><meta name="B" content="2">形式的标签,并装入一维数组,name为元素下标,content为元素值,上例中的标签可以获得数组:array('A'=>'1', 'b'=>'2'),其他<meta>标签不处理,并且此函数只处理到</head>标签时截止,之后的<meta>也不再继续处理,不过<head>之前的<meta>还是会处理.

user-agent是浏览器在向服务器请求网页时,提交的不可见的头信息的一部分,头信息是一个数组,包含多个信息,比如本地缓存目录,cookies等,其中user-agent是浏览器类型申明,比如IE、Chrome、FF等.

今天在抓取一个网页的<meta>标签的时候,总是得到空值,但是直接查看网页源代码又是正常的,于是怀疑是否服务器设置了根据头信息来判断输出,先尝试使用get_meta_tags()来抓取一个本地的文件,然后这个本地文件将获取的头信息写入文件,结果如下,其中替换成了/,方便查看,代码如下:

array ( 

  'HTTP_HOST' => '192.168.30.205', 

  'PATH' => 'C:/Program Files/Common Files/NetSarang;C:/Program Files/NVIDIA Corporation/PhysX/Common;C:/Program Files/Common Files/Microsoft Shared/Windows Live;C:/Program Files/Intel/iCLS Client/;C:/Windows/system32;C:/Windows;C:/Windows/System32/Wbem;C:/Windows/System32/WindowsPowerShell/v1.0/;C:/Program Files/Intel/Intel(R) Management Engine Components/DAL;C:/Program Files/Intel/Intel(R) Management Engine Components/IPT;C:/Program Files/Intel/OpenCL SDK/2.0/bin/x86;C:/Program Files/Common Files/Thunder Network/KanKan/Codecs;C:/Program Files/QuickTime Alternative/QTSystem;C:/Program Files/Windows Live/Shared;C:/Program Files/QuickTime Alternative/QTSystem/; %JAVA_HOME%/bin;%JAVA_HOME%/jre/bin;', 

  'SystemRoot' => 'C:/Windows', 

  'COMSPEC' => 'C:/Windows/system32/cmd.exe', 

  'PATHEXT' => '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC', 

  'WINDIR' => 'C:/Windows', 

  'SERVER_SIGNATURE' => '', 

  'SERVER_SOFTWARE' => 'Apache/2.2.11 (Win32) PHP/5.2.8', 

  'SERVER_NAME' => '192.168.30.205', 

  'SERVER_ADDR' => '192.168.30.205', 

  'SERVER_PORT' => '80', 

  'REMOTE_ADDR' => '192.168.30.205', 

  'DOCUMENT_ROOT' => 'E:/wamp/www', 

  'SERVER_ADMIN' => 'admin@admin.com', 

  'SCRIPT_FILENAME' => 'E:/wamp/www/user-agent.php', 

  'REMOTE_PORT' => '59479', 

  'GATEWAY_INTERFACE' => 'CGI/1.1', 

  'SERVER_PROTOCOL' => 'HTTP/1.0', 

  'REQUEST_METHOD' => 'GET', 

  'QUERY_STRING' => '', 

  'REQUEST_URI' => '/user-agent.php', 

  'SCRIPT_NAME' => '/user-agent.php', 

  'PHP_SELF' => '/user-agent.php', 

  'REQUEST_TIME' => 1400747529, 

)

果然在数组中没有HTTP_USER_AGENT这个元素,apache在向另外一台服务器发送请求的时候是没有UA的,之后查了一下资料,get_meta_tags()函数没有伪造UA的能力,所以只能使用其他办法解决了.

后来使用CURL来获取,就获取到了网页,不过使用上稍微麻烦一点,首先伪造UA,获取之后在使用正则表达式分析<meta>.

伪造办法,代码如下:

// 初始化一个 cURL 

$curl = curl_init(); 

 

// 设置你需要抓取的URL 

curl_setopt($curl, CURLOPT_URL, 'http://localhost/user-agent.php'); 

 

// 设置是否将文件头输出到浏览器,0不输出 

curl_setopt($curl, CURLOPT_HEADER, 0); 

 

// 设置UA,这里是将浏览器的UA转发到服务器,也可以手动指定值 

curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); 

 

// 设置cURL 参数,要求结果返回到字符串中还是输出到屏幕上。0输出屏幕并返回操作结果的BOOL值,1返回字符串 

curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 

// 运行cURL,请求网页 

$data = curl_exec($curl); 

 

// 关闭URL请求 

curl_close($curl); 

 

// 处理获得的数据 

var_dump($data);

希望本文所述对大家的PHP程序设计有所帮助。

PHP 相关文章推荐
开发大型 PHP 项目的方法
Jan 02 PHP
PHP采集相关教程之一 CURL函数库
Feb 15 PHP
php学习笔记 PHP面向对象的程序设计
Jun 13 PHP
php入门学习知识点二 PHP简单的分页过程与原理
Jul 14 PHP
PHP链接MySQL的常用扩展函数
Oct 23 PHP
隐性调用php程序的方法
Jun 13 PHP
帝国CMS留言板回复后发送EMAIL通知客户
Jul 06 PHP
thinkphp微信开发(消息加密解密)
Dec 02 PHP
PHP采用超长(超大)数字运算防止数字以科学计数法显示的方法
Apr 01 PHP
PHP7+Nginx的配置与安装教程详解
May 10 PHP
Windows 下安装 swoole 图文教程(php)
Jun 05 PHP
thinkPHP5实现数据库添加内容的方法
Oct 25 PHP
PHP使用array_multisort对多个数组或多维数组进行排序
Dec 16 #PHP
php使用ereg验证文件上传的方法
Dec 16 #PHP
PHP使用pcntl_fork实现多进程下载图片的方法
Dec 16 #PHP
php中最简单的字符串匹配算法
Dec 16 #PHP
PHP实现将科学计数法转换为原始数字字符串的方法
Dec 16 #PHP
php输出金字塔的2种实现方法
Dec 16 #PHP
smarty缓存用法分析
Dec 16 #PHP
You might like
PHP 简单日历实现代码
2009/10/28 PHP
php实现的ping端口函数实例
2014/11/12 PHP
php递归json类实例
2014/12/02 PHP
php实现分页显示
2015/11/03 PHP
php 无限级分类 获取顶级分类ID
2016/03/13 PHP
PHP手机号中间四位用星号*代替显示的实例
2017/06/02 PHP
PHP的RSA加密解密方法以及开发接口使用
2018/02/11 PHP
tp5.1 实现setInc字段自动加1
2019/10/18 PHP
JavaScript中setFullYear()方法的使用详解
2015/06/11 Javascript
AngularJS基础 ng-href 指令用法
2016/08/01 Javascript
基于JavaScript实现随机颜色输入框
2016/12/10 Javascript
Three.js加载外部模型的教程详解
2017/11/10 Javascript
vue.js开发实现全局调用的MessageBox组件实例代码
2017/11/22 Javascript
ztree加载完成后显示勾选节点的实现代码
2018/10/22 Javascript
vue-router启用history模式下的开发及非根目录部署方法
2018/12/23 Javascript
vue过滤器用法实例分析
2019/03/15 Javascript
vue实现直播间点赞飘心效果的示例代码
2019/09/20 Javascript
详解JavaScript中的this指向问题
2021/02/05 Javascript
python通过get,post方式发送http请求和接收http响应的方法
2015/05/26 Python
python使用win32com库播放mp3文件的方法
2015/05/30 Python
python实现list元素按关键字相加减的方法示例
2017/06/09 Python
python2 与 python3 实现共存的方法
2018/07/12 Python
python使用ddt过程中遇到的问题及解决方案【推荐】
2018/10/29 Python
如何用C代码给Python写扩展库(Cython)
2019/05/17 Python
PyQt5显示GIF图片的方法
2019/06/17 Python
解决Keyerror ''acc'' KeyError: ''val_acc''问题
2020/06/18 Python
HTML5新特性之用SVG绘制微信logo
2016/02/03 HTML / CSS
小学毕业感言50字
2014/02/16 职场文书
求职信名称怎么写
2014/05/26 职场文书
节约用水的口号
2014/06/20 职场文书
2014年打非治违工作总结
2014/11/13 职场文书
投资公司董事长岗位职责
2015/04/16 职场文书
数学复习课教学反思
2016/02/18 职场文书
小学一年级语文教学反思
2016/03/03 职场文书
Python机器学习之KNN近邻算法
2021/05/14 Python
springboot 全局异常处理和统一响应对象的处理方式
2022/06/28 Java/Android