snoopy php网页抓取工具(php采集利器——模拟浏览器类snoopy应用by笨二十一)

优采云 发布时间: 2022-03-17 15:34

  snoopy php网页抓取工具(php采集利器——模拟浏览器类snoopy应用by笨二十一)

  php采集Weapon--模拟浏览器式snoopy应用 笨二十一凌晨1点20分在PHP下发布,Web技术研究php页面资料采集,无意中发现Snoopy是一个类,snoopy是用php编写的一个php类,用来模拟浏览器功能。它可以模拟访问,向需要登录的Web服务器提交表单,并提供过滤信息的功能,让您可以根据需要获取所需的信息。 Snoopy官方网站:/projects/snoopy/Snoopy是一个模拟浏览器功能的php类,可以获取网页内容和发送表单。要让 Snoopy 正常运行,您的服务器的 PHP 版本必须至少为 4,并且它支持 PCRE(Perl Compatible Regular Expressions)以及基本的 LAMP 服务。下载snoopy Snoopy的一些特点: 1 抓取网页内容 fetch2 抓取网页文本内容(去掉HTML标签) fetchtext3 抓取网页链接,表单 fetchlinks fetchform4 支持代理主机 5 支持基本用户名/密码身份验证 6 支持设置 user_agent 、referer(来)、cookies 和 header 内容(头文件) 7 支持浏览器重定向和控制重定向深度 8 可以将网页中的链接扩展为高质量的url(默认) 9 提交数据并返回10的值支持跟踪HTML框架11。支持重定向时,传递cookie需要php4或更高版本。因为是PHP类,所以在服务器不支持curl的时候是最好的选择。类方法:fetch($URI)————这是用于抓取网页内容的方法。

  $URI参数是被抓取网页的URL地址。获取的结果存储在 $this->results 中。如果你正在抓取一个帧,Snoopy 会将每个帧跟踪到一个数组中,然后是 $this->results。 fetchtext($URI)————该方法与fetch()类似,唯一不同的是该方法会去除HTML标签等无关数据,只返回网页中的文本内容。 fetchform($URI)————该方法与fetch()类似,唯一不同的是该方法会去除HTML标签等无关数据,只返回网页中的表单内容(form)。 fetchlinks($URI)————这个方法和fetch()类似,唯一不同的是这个方法会去掉HTML标签等不相关的数据,只返回网页中的链接。默认情况下,相对链接将自动完成为完整的 URL。 submit($URI, $formvars)------------ 该方法向 $URL 指定的链接地址发送确认表单。 $formvars 是一个存储表单参数的数组。 submittext($URI,$formvars)———————————这个方法和submit()类似,唯一的区别是这个方法会去掉HTML标签等不相关的数据,只返回里面的文本内容登录后的网页。

  submitlinks($URI)————这个方法和submit()类似,唯一的区别是这个方法会去掉HTML标签等不相关的数据,只返回网页中的链接。默认情况下,相对链接将自动完成为完整的 URL。类属性:(括号内为默认值) $host 要连接的主机 $port 要连接的端口 $proxy_host 要使用的代理主机,如果有的话 $proxy_port 要使用的代理主机端口,如果有的话 $agent 用户agent 伪装 Snoopy v0.1)$referer 信息,如果有 $cookies cookie,如果有 $rawheaders 其他头信息,如果有 $maxredirs 最大重定向次数,0=不允许(5)@ >$offsiteok 是否允许异地重定向。(true)$expandlinks 是否完整链接到完整地址(true)$user 认证用户名,如果有 $pass 认证用户名,如果有$accept http 接受类型( image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*)$error 报错的地方,如果有 $response_code 从服务器返回 响应码 $headers 从服务器返回的头信息 $ maxlength 最长返回数据长度 $read_timeout 读取操作超时(需要 PHP 4 Beta 4+)设置为 0 表示无超时 $time d_out 如果读取操作超时,此属性返回 true(需要 PHP 4 Beta 4+) $maxframes 允许跟踪的最大帧数 $status http 爬取的状态 $temp_dir 目录,用于 Web 服务器可以写入的临时文件 ( /tmp) $curl_path cURL二进制目录,如果没有cURL二进制设置为false 下面是demoinclude "Snoopy.class.php";$snoopy = new Snoopy; $snoopy->proxy_host = "";$snoopy->proxy_port = "8080"; $snoopy->agent = "(兼容;MSIE 4.01;MSN 2.5;AOL 4.0;Windows 98)";$snoopy->referer = " /"; $snoopy->cookies[ "Se ssionID"] = 238472834723489l;$snoopy->cookies["favoriteColor"] = "RED"; $snoopy->rawheaders["Pragma"] = "no-cache"; $ snoopy->maxredirs = 2;$snoopy->offsiteok = false;$snoopy->expandlinks = false;$snoopy->user = "joe";$snoopy->pass = "bloe";if($snoopy->fetchtext ("")){echo " ".htmlspecialchars ($snoopy->results)."n";}elseecho "错误获取文档:".$snoopy->error."n";snoopy采集example< ?php//采集phpchinaset_time_limit(0);require_once("Snoopy.class.php");$snoopy=new Snoopy();//登录论坛$submit_url = "/bbs/logging.php ?action=login";$submit_vars["loginmode"] = "正常";$submit_vars["styleid"] = "1";$submit_vars["cookietime"] = "315360000";$submit_vars["loginfield"] = "username";$submit_vars["username"] = "***"; //你的用户名 $submit_vars["password"] = "*****"; //你的密码 $submit_vars["questionid"] = "0";$submit_vars[" 答案r"] = "";$submit_vars["loginsubmit"] = "Submit";$snoopy->submit($submit_url,$submit_vars);if ($snoopy->results){//获取连接地址$snoopy- > fetchlinks("/bbs");$url=array();$url=$snoopy->resu lts;//print_r($url);foreach($url as $key=>$value){//match /bbs/forumdisplay.php?fid=156&sid=VfcqTR地址为论坛地址 if (!preg_match("/ ^(/bbs/forumdisplay.php?fid=)[0-9]*&sid=[a-zA- Z]{6}/i",$value)){unset($url[$key]);} }//print_r($url);//获取盘子数组$url,循环访问,得到这里是第一个模块第一页的数据 $i=0;foreach ($url as $key=>$value) {if ($i>=1){//Test limit break;}else{ //访问该模块,提取post的连接地址,在正式访问时,需要提取post分页的数据,然后根据分页数据提取post数据 $snoopy=new Snoopy();$ snoopy->fetchlinks($value);$tie=array();$tie[$i]=$snoopy->results;//print_r($tie);//转换数组foreach($tie[$i] as $key=>$value){//垫ch/bbs/viewthread.php?tid=68127&extra=page%3D1&page=1&sid=iBLZfKif (!preg_match("/^(/bbs/viewthread.php?tid=)[0-9]*&extra=page%3D1&page=[ 0-9]*&sid=[a-zA-Z]{6}/i",$value)){unset($tie [$i][$key]);}}//print_r($tie[$ i]);//分类数组,将同一篇文章不同页面的内容放入一个数组 $left='';//连接左边的公共地址 $j=0;$page=array();foreach($ tie[$i] as $key=>$value){$left=substr($value,0,52); $m=0;foreach ($tie[$i] as $pkey=>$pvalue){//重组数组 if (substr($pvalue,0,52)==$left){$page [ $j][$m]=$pvalue;$m++;}}$j++;}//去除重复开始//$page=array_unique($page);只能用于一维数组 $paget[0 ]=$page[0];$nums=count($page);for ($n=1;$n< $nums;$n++){$paget[$n]=array_diff($page[$n], $page[$n-1]);}//去掉多维数组重复值的末尾//去掉数组的空值 unset($page); $page=array();//重新定义页面数组 $page=array_filter($paget);//print_r($page);$u=0;$title=array();$content=array();$ temp='';$tt=array ();foreach ($page as $key=>$value){//外循环,用于一个帖子 if (is_array($value)){foreach ($value as $k1= >$v1){ //页内循环,对于帖子的N页 $snoopy=new Snoopy();$snoopy->fetch($v1);$temp=$snoopy-> results;//读取标题 if (!preg_match_all("/(.*)< /h2>/i",$temp,$tt)){echo "无标题";exit;}else{$title[$u ]=$tt[1][ 1];}unset($tt);//读取内容 if (!preg_match_all("/ ( .*)< /div>/i",$temp,$tt)){ print_r($tt);echo "no content1";exit;}else{foreach ($tt[1] as $c=>$c 2){$content[$u].=$c2;}} }}else{//直接获取页面内容 $snoopy=new Snoopy();$snoopy->fetch($value);$temp =$snoopy->results;//读取标题 if (!preg_match_all("/( .*)< /h2>/i",$temp,$tt)){echo "no title";exit;}else{ $title[$u]=$tt[1][1];}unset($tt);//读取内容 if (!preg_match_all("/ (.*)< /div>/i",$te mp ,$tt)){echo "no content2";exit;}else{foreach ($tt[1] as $c=>$c2){$content[$u].=$c2;} } }$u++;}print_r($content);}$i++;}}else{echo "login failed";exit;}?> PHP采集 类:史努比一直在尝试做一个 PHP采集@ > 计划,但一直没有进展。在网上找了半天,找到了这个类。好像挺有名的~~ Snoopy是一个php类,用来模仿网页浏览器的功能。它可以完成网页内容的获取和传输。表单任务。

  官方网站 /???以下是它的一些特点: 1、易抓取网页内容2、易抓取网页文字(去掉HTML代码)3、易网页链接抓取4、支持代理主机5、支持基本用户/密码认证方式6、支持自定义用户代理、referer、cookies和header内容7、支持浏览器重定向和控制深度重定向8、可以将网页中的链接展开成高质量的url(默认)9、方便提交数据并获取返回值10、支持跟踪HTML框架(v0. 92增加) 11、支持重定向时传递cookie 例如抓取链接 ------------------------------ ------------ -----首先我们需要获取登录需要发送哪些字段,目标地址是什么。这里我们使用 snoopy 的 fetchform 来实现这一点。当然也可以直接查看/happy/...的源码来实现,不过这样更方便。到这里,我们已经获取了目标和提交的数据,接下来就是实现模拟登录了。代码如下:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线