PHP采集利器:Snoopy

2012-08-19 22:48:32|  分类: 默认分类 |字号 订阅

下载地址:http://sourceforge.net/projects/snoopy/

Snoopy是一个php类,用来模拟浏览器的功能,可以获取网页内容,发送表单。Snoopy正确运行需要你的服务器的PHP版本在4以上,并且支持PCRE(Perl Compatible Regular Expressions),基本的LAMP服务都支持。

一、Snoopy的一些特点:

  1.抓取网页的内容 fetch

  2.抓取网页的文本内容 (去除HTML标签) fetchtext

  3.抓取网页的链接,表单 fetchlinks fetchform

  4.支持代理主机

  5.支持基本的用户名/密码验证

  6.支持设置user_agent, referer(来路), cookies和header content(头文件)

  7.支持浏览器重定向,并能控制重定向深度

  8.能把网页中的链接扩展成高质量的url(默认)

  9.提交数据并且获取返回值

  10.支持跟踪HTML框架

  11.支持重定向的时候传递cookies,要求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标签和其他的无关数据,只返回网页中链接(link)。
默认情况下,相对链接将自动补全,转换成完整的URL。

submit($URI,$formvars) 
———————-

  本方法向$URL指定的链接地址发送确认表单。$formvars是一个存储表单参数的数组。

submittext($URI,$formvars) 
————————–

  本方法类似于submit(),唯一不同的就是本方法会去除HTML标签和其他的无关数据,只返回登陆后网页中的文字内容。

submitlinks($URI) 
—————-

  本方法类似于submit(),唯一不同的就是本方法会去除HTML标签和其他的无关数据,只返回网页中链接(link)。 
默认情况下,相对链接将自动补全,转换成完整的URL。

三、类属性: (缺省值在括号里)

$host 连接的主机 
$port 连接的端口 
$proxy_host 使用的代理主机,如果有的话 
$proxy_port 使用的代理主机端口,如果有的话 
$agent 用户代理伪装 (Snoopy v0.1) 
$referer 来路信息,如果有的话 
$cookies cookies, 如果有的话 
$rawheaders 其他的头信息, 如果有的话 
$maxredirs 最大重定向次数, 0=不允许 (5) 
$offsiteok whether or not to allow redirects off-site. (true) 
$expandlinks 是否将链接都补全为完整地址 (true) 
$user 认证用户名, 如果有的话 
$pass 认证用户名, 如果有的话 
$accept http 接受类型 (image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*) 
$error 哪里报错, 如果有的话 
$response_code 从服务器返回的响应代码 
$headers 从服务器返回的头信息 
$maxlength 最长返回数据长度 
$read_timeout 读取操作超时 (requires PHP 4 Beta 4+) 
设置为0为没有超时 
$timed_out 如果一次读取操作超时了,本属性返回 true (requires PHP 4 Beta 4+) 
$maxframes 允许追踪的框架最大数量 
$status 抓取的http的状态 
$temp_dir 网页服务器能够写入的临时文件目录 (/tmp) 
$curl_path cURL binary 的目录, 如果没有cURL binary就设置为 false

四、以下是demo

Php代码  
  1. include "Snoopy.class.php";
  2. $snoopy = new Snoopy;
  3. $snoopy->proxy_host = "www.baidu.com";
  4. $snoopy->proxy_port = "8080";
  5. $snoopy->agent = "(compatible; MSIE 4.01; MSN 2.5; AOL 4.0; Windows 98)";
  6. $snoopy->referer = "http://www.baidu.com/";
  7. $snoopy->cookies["SessionID"] = 238472834723489l;
  8. $snoopy->cookies["favoriteColor"] = "RED";
  9. $snoopy->rawheaders["Pragma"] = "no-cache";
  10. $snoopy->maxredirs = 2;
  11. $snoopy->offsiteok = false;
  12. $snoopy->expandlinks = false;
  13. $snoopy->user = "joe";
  14. $snoopy->pass = "bloe";
  15. if($snoopy->fetchtext("http://www.baidu.com"))
  16. {
  17. echo " <PRE>".htmlspecialchars($snoopy->results)." </PRE>\n"; <BR>
  18. } <BR>
  19. else <BR>
  20. echo "error fetching document: ".$snoopy->error."\n";
  21. snoopy采集phpchina示例
  22. <?php
  23. //采集phpchina
  24. set_time_limit(0);
  25. require_once("Snoopy.class.php");
  26. $snoopy=new Snoopy();
  27. //登陆论坛
  28. $submit_url = "http://www.phpchina.com/bbs/logging.php?action=login";
  29. $submit_vars["loginmode"] = "normal";
  30. $submit_vars["styleid"] = "1";
  31. $submit_vars["cookietime"] = "315360000";
  32. $submit_vars["loginfield"] = "username";
  33. $submit_vars["username"] = "***"; //你的用户名
  34. $submit_vars["password"] = "*****"; //你的密码
  35. $submit_vars["questionid"] = "0";
  36. $submit_vars["answer"] = "";
  37. $submit_vars["loginsubmit"] = "提 交";
  38. $snoopy->submit($submit_url,$submit_vars);
  39. if ($snoopy->results)
  40. {
  41. //获取连接地址
  42. $snoopy->fetchlinks("http://www.phpchina.com/bbs");
  43. $url=array();
  44. $url=$snoopy->results;
  45. //print_r($url);
  46. foreach ($url as $key=>$value)
  47. {
  48. //匹配http://www.phpchina.com/bbs/forumdisplay.php?fid=156&sid=VfcqTR地址即论坛板块地址
  49. if (!preg_match("/^(http:\/\/www\.phpchina\.com\/bbs\/forumdisplay\.php\?fid=)[0-9]*&sid=[a-zA-Z]{6}/i",$value))
  50. {
  51. unset($url[$key]);
  52. }
  53. }
  54. //print_r($url);
  55. //获取到板块数组$url,循环访问,此处获取第一个模块第一页的数据
  56. $i=0;
  57. foreach ($url as $key=>$value)
  58. {
  59. if ($i>=1)
  60. {
  61. //测试限制
  62. break;
  63. }
  64. else
  65. {
  66. //访问该模块,提取帖子的连接地址,正式访问里需要提取帖子分页的数据,然后根据分页数据提取帖子数据
  67. $snoopy=new Snoopy();
  68. $snoopy->fetchlinks($value);
  69. $tie=array();
  70. $tie[$i]=$snoopy->results;
  71. //print_r($tie);
  72. //转换数组
  73. foreach ($tie[$i] as $key=>$value)
  74. {
  75. //匹配http://www.phpchina.com/bbs/viewthread.php?tid=68127&amp; extra=page%3D1&amp;page=1&sid=iBLZfK
  76. if (!preg_match("/^(http:\/\/www\.phpchina\.com\/bbs\/viewthread\.php\?tid=)[0-9]*&amp;extra=page\%3D1&amp;page=[0-9]*&sid=[a-zA-Z]{6}/i",$value))
  77. {
  78. unset($tie[$i][$key]);
  79. }
  80. }
  81. //print_r($tie[$i]);
  82. //归类数组,将同一个帖子不同页面的内容放一个数组里
  83. $left='';//连接左边公用地址
  84. $j=0;
  85. $page=array();
  86. foreach ($tie[$i] as $key=>$value)
  87. {
  88. $left=substr($value,0,52);
  89. $m=0;
  90. foreach ($tie[$i] as $pkey=>$pvalue)
  91. {
  92. //重组数组
  93. if (substr($pvalue,0,52)==$left)
  94. {
  95. $page[$j][$m]=$pvalue;
  96. $m++;
  97. }
  98. }
  99. $j++;
  100. }
  101. //去除重复项开始
  102. //$page=array_unique($page);只能用于一维数组
  103. $paget[0]=$page[0];
  104. $nums=count($page);
  105. for ($n=1;$n <$nums;$n++)
  106. {
  107. $paget[$n]=array_diff($page[$n],$page[$n-1]);
  108. }
  109. //去除多维数组重复值结束
  110. //去除数组空值
  111. unset($page);
  112. $page=array();//重新定义page数组
  113. $page=array_filter($paget);
  114. //print_r($page);
  115. $u=0;
  116. $title=array();
  117. $content=array();
  118. $temp='';
  119. $tt=array();
  120. foreach ($page as $key=>$value)
  121. {
  122. //外围循环,针对一个帖子
  123. if (is_array($value))
  124. {
  125. foreach ($value as $k1=>$v1)
  126. {
  127. //页内循环,针对一个帖子的N页
  128. $snoopy=new Snoopy();
  129. $snoopy->fetch($v1);
  130. $temp=$snoopy->results;
  131. //读取标题
  132. if (!preg_match_all("/ <h2>(.*) <\/h2>/i",$temp,$tt))
  133. {
  134. echo "no title";
  135. exit;
  136. }
  137. else
  138. {
  139. $title[$u]=$tt[1][1];
  140. }
  141. unset($tt);
  142. //读取内容
  143. if (!preg_match_all("/ <div id=\"postmessage_[0-9]{1,8}\" class=\"t_msgfont\">(.*) <\/div>/i",$temp,$tt))
  144. {
  145. print_r($tt);
  146. echo "no content1";
  147. exit;
  148. }
  149. else
  150. {
  151. foreach ($tt[1] as $c=>$c2)
  152. {
  153. $content[$u].=$c2;
  154. }
  155. }
  156. }
  157. }
  158. else
  159. {
  160. //直接取页内容
  161. $snoopy=new Snoopy();
  162. $snoopy->fetch($value);
  163. $temp=$snoopy->results;
  164. //读取标题
  165. if (!preg_match_all("/ <h2>(.*) <\/h2>/i",$temp,$tt))
  166. {
  167. echo "no title";
  168. exit;
  169. }
  170. else
  171. {
  172. $title[$u]=$tt[1][1];
  173. }
  174. unset($tt);
  175. //读取内容
  176. if (!preg_match_all("/ <div id=\"postmessage_[0-9]*\" class=\"t_msgfont\">(.*) <\/div>/i",$temp,$tt))
  177. {
  178. echo "no content2";
  179. exit;
  180. }
  181. else
  182. {
  183. foreach ($tt[1] as $c=>$c2)
  184. {
  185. $content[$u].=$c2;
  186. }
  187. }
  188. }
  189. $u++;
  190. }
  191. print_r($content);
  192. }
  193. $i++;
  194. }
  195. }
  196. else
  197. {
  198. echo "login failed";
  199. exit;
  200. }
  201. ?>

PHP采集利器:Snoopy相关推荐

  1. 容器日志采集利器Log-Pilot

    容器时代越来越多的传统应用将会逐渐容器化,而日志又是应用的一个关键环节,那么在应用容器化过程中,如何方便快捷高效地来自动发现和采集应用的日志,如何与日志存储系统协同来高效存储和搜索应用日志.本文将主要 ...

  2. 一文搞懂指标采集利器 Telegraf

    作者| 姜闻名 来源|尔达 Erda 公众号 ​ 导读:为了让大家更好的了解 MSP 中 APM 系统的设计实现,我们决定编写一个<详聊微服务观测>系列文章,深入 APM 系统的产品.架构 ...

  3. php 网站内容采集器 Snoopy

    Snoopy 转载于:https://www.cnblogs.com/buxiangxin/p/7245580.html

  4. golang 日志分析_容器日志采集利器:Filebeat深度剖析与实践

    在云原生时代和容器化浪潮中,容器的日志采集是一个看起来不起眼却又无法忽视的重要议题.对于容器日志采集我们常用的工具有filebeat和fluentd,两者对比各有优劣,相比基于ruby的fluentd ...

  5. 异步网页采集利器CasperJs

    在采集网页中,我们会经常遇到采集一些异步加载页面的网页,我们通常用的httpwebrequest类就采集不到了,这个时候我们通常会采用webbrowser来辅助采集,但是.net下自带的webbrow ...

  6. 采集程序 -【开源项目】

    更新:通过一些朋友的回复,了解到,可能文章太长了,有朋友只是简略浏览,所以还没有明白程序工作流程. 简单介绍,这个程序是给程序员用的,使用这个软件,必须是会写正则的朋友,或者是有朋友帮忙写正则. 这个 ...

  7. 83款 网络爬虫开源软件

    网络爬虫介绍及其比较 http://www.docin.com/p-321349858.html 1.http://www.oschina.net/project/tag/64/spider?lang ...

  8. 彻夜怒肝!Docker 常见疑难杂症解决方案已撸完,快要裂开了。。。

    点击下方"民工哥技术之路",选择"设为星标" 回复"1024"获取独家整理的学习资料! 这里主要是为了记录在使用 Docker 的时候遇到的 ...

  9. 爬虫_83款 网络爬虫开源软件

    1.http://www.oschina.net/project/tag/64/spider?lang=0&os=0&sort=view& 搜索引擎 Nutch Nutch 是 ...

最新文章

  1. 谷歌开源EfficientDet:实现新SOTA,又快又准的目标检测器
  2. Gym-100889B Backward and Forward
  3. 贵港天气预报软件测试,贵港天气预报15天
  4. nginx 获取真实ip
  5. mysql kill hup_kill -HUP pid
  6. LeetCode 2140. 解决智力问题(动态规划)
  7. 什么是面向对象_什么是面向对象?新手程序员必掌握的技能
  8. 农行软开是总行编制吗_2021农行总行校招笔试来啦,你知道农行笔试都考些什么吗?...
  9. nginx 反向代理到目录
  10. LINUX Cacti 安装SOP FOR CentOS6.5
  11. R plot图片背景设置为透明_万能转换:R图转成Word、PPT、Excel、HTML、Latex、矢量图等...
  12. .Net MVC个人笔记
  13. 强化学习实战-使用Q-learning算法解决悬崖问题
  14. python趋势外推法
  15. JZOJ3395. 【NOIP2013模拟】Freda的传呼机
  16. 人工智能学习笔记——KL散度
  17. 2018年校招深睿医疗面试
  18. javascript:用js实现tirm函数
  19. 鼠标侧键设置工具X-Mouse安装教程
  20. Oracle 11g 学习笔记-14(数据库性能优化)

热门文章

  1. Nodejs学习笔记(一)——基础之全局对象、包和npm
  2. mysql linux 数据库文件位置_mysql在linux下修改mysql数据库文件位置
  3. eclipse java不能编译_eclipse里.java可以编译但不能运行??
  4. failed to introspect Class[org.springframework.cloud.context.properties.ConfigurationPropertiesBea]
  5. 基于SignalR的站点有连接数限制问题及解决方案
  6. webpack----loader
  7. 超级终端设置-基本配置(华为)
  8. GDB 调试 Mysql 实战(一)源码编译安装
  9. Array.prototype.slice.call()方法详解
  10. ubuntu 16.04 LTS 开发环境的安装及常用软件