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 相关文章推荐
使用eAccelerator加密PHP程序
Oct 03 PHP
php Xdebug 调试扩展的安装与使用.
Mar 13 PHP
PHP 日志缩略名的创建函数代码
May 26 PHP
基于php socket(fsockopen)的应用实例分析
Jun 02 PHP
PHP 如何利用phpexcel导入数据库
Aug 24 PHP
PHP empty函数报错解决办法
Mar 06 PHP
PHP date函数常用时间处理方法
May 11 PHP
thinkphp多层MVC用法分析
Dec 30 PHP
PHP图片裁剪与缩放示例(无损裁剪图片)
Feb 08 PHP
JS+PHP实现用户输入数字后显示最大的值及所在位置
Jun 19 PHP
PHP类与对象后期静态绑定操作实例详解
Dec 20 PHP
thinkphp5框架路由原理与用法详解
Feb 11 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 google或baidu分页代码
2009/11/26 PHP
PHP中数组定义的几种方法
2013/09/01 PHP
Laravel 5框架学习之路由、控制器和视图简介
2015/04/07 PHP
Yii2 GridView实现列表页直接修改数据的方法
2016/05/16 PHP
PHP进阶学习之反射基本概念与用法分析
2019/06/18 PHP
按钮JS复制文本框和表格的代码
2011/04/01 Javascript
js取两个数组的交集|差集|并集|补集|去重示例代码
2013/08/07 Javascript
jquery自定义函数的多种方法
2014/01/09 Javascript
node.js操作mongoDB数据库示例分享
2014/11/26 Javascript
关于Javascript加载执行优化的研究报告
2014/12/16 Javascript
超详细的JS弹出窗口代码大全
2020/04/18 Javascript
Vue2.0表单校验组件vee-validate的使用详解
2017/05/02 Javascript
vue开发调试神器vue-devtools使用详解
2017/07/13 Javascript
javascript数组拍平方法总结
2018/01/20 Javascript
ElementUI多个子组件表单的校验管理实现
2019/11/07 Javascript
微信小程序按顺序同步执行的两种方式
2019/12/20 Javascript
小程序按钮避免多次调用接口和点击方案实现(不用showLoading)
2020/04/15 Javascript
js简单实现自动生成表格功能示例
2020/06/02 Javascript
在vue项目中利用popstate处理页面返回的操作介绍
2020/08/06 Javascript
ubuntu中配置pyqt4环境教程
2017/12/27 Python
Python3使用pandas模块读写excel操作示例
2018/07/03 Python
python KNN算法实现鸢尾花数据集分类
2019/10/24 Python
wxpython绘制圆角窗体
2019/11/18 Python
python可视化text()函数使用详解
2020/02/11 Python
在Ubuntu 20.04中安装Pycharm 2020.1的图文教程
2020/04/30 Python
Python函数递归调用实现原理实例解析
2020/08/11 Python
英国邮购活的植物主要供应商:Gardening Direct
2019/01/28 全球购物
Overload和Override的区别
2012/09/02 面试题
Java的类可以定义为Protected或者Private得吗
2015/09/25 面试题
大学生村官演讲稿
2014/04/25 职场文书
热爱祖国的演讲稿
2014/05/04 职场文书
升国旗演讲稿
2014/09/05 职场文书
对党的十八届四中全会的期盼
2014/10/17 职场文书
儿园租房协议书范本
2014/12/02 职场文书
小人国观后感
2015/06/11 职场文书
MySQL 分区表中分区键为什么必须是主键的一部分
2022/03/17 MySQL