php中get_meta_tags()、CURL与user-agent用法分析
本文实例分析了php中get_meta_tags()、CURL与user-agent用法。分享给大家供大家参考。具体分析如下:
get_meta_tags()函数用于抓取网页中<metaname="A"content="1"><metaname="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:/ProgramFiles/CommonFiles/NetSarang;C:/ProgramFiles/NVIDIACorporation/PhysX/Common;C:/ProgramFiles/CommonFiles/MicrosoftShared/WindowsLive;C:/ProgramFiles/Intel/iCLSClient/;C:/Windows/system32;C:/Windows;C:/Windows/System32/Wbem;C:/Windows/System32/WindowsPowerShell/v1.0/;C:/ProgramFiles/Intel/Intel(R)ManagementEngineComponents/DAL;C:/ProgramFiles/Intel/Intel(R)ManagementEngineComponents/IPT;C:/ProgramFiles/Intel/OpenCLSDK/2.0/bin/x86;C:/ProgramFiles/CommonFiles/ThunderNetwork/KanKan/Codecs;C:/ProgramFiles/QuickTimeAlternative/QTSystem;C:/ProgramFiles/WindowsLive/Shared;C:/ProgramFiles/QuickTimeAlternative/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程序设计有所帮助。