用了两天这个类,发现很好用。

获取请求网页里面的所有链接,直接使用fetchlinks就可以,获取所有文本信息使用fetchtext(其内部还是使用正则表达式在进行处理),还有其它较多的功能,如模拟提交表单等。

使用方法:

1、先下载Snoopy类,下载地址:http://sourceforge.net/projects/snoopy/

2、先实例化一个对象,然后调用相应的方法即可获取抓取的网页信息

示例:

include 'snoopy/Snoopy.class.php'; $snoopy = new Snoopy(); $sourceURL = "http://xxxxxxxxx";$snoopy->fetchlinks($sourceURL); $a = $snoopy->results;

它并没有提供获取网页中所有图片地址的方法,自己有个需求是要获取一个页面中所有文章列表中图片地址。然后自己就写了一个,主要还是正则那里匹配重要。

//匹配图片的正则表达式 $reTag = "/

/i";

因为需求比较特殊,只需要抓取写死htp://开头的图片(外站的图片可能使得了防盗链,想先抓取到本地)

实现思路:

1、抓取指定网页,并筛选出预期的所有文章地址;

2、循环抓取第一步中的文章地址,然后使用匹配图片的正则表达式进行匹配,获取页面中所有符合规则的图片地址;

3、根据图片后缀和ID(这里只有gif、jpg)保存图片---如果此图片文件存在,先将其删除再保存

fetchlinks($sourceURL); $a = $snoopy->results; $re = "/\d+\.html$/"; //过滤获取指定的文件地址请求 foreach ($a as $tmp) { if (preg_match($re, $tmp)) { getImgURL($tmp); } } function getImgURL($siteName) { $snoopy = new Snoopy(); $snoopy->fetch($siteName); $fileContent = $snoopy->results; //匹配图片的正则表达式 $reTag = "/

/i"; if (preg_match($reTag, $fileContent)) { $ret = preg_match_all($reTag, $fileContent, $matchResult); for ($i = 0, $len = count($matchResult[1]); $i < $len; ++$i) { saveImgURL($matchResult[1][$i], $matchResult[2][$i]); } } } function saveImgURL($name, $suffix) { $url = $name.".".$suffix; echo "请求的图片地址:".$url."

"; $imgSavePath = "E:/xxx/style/images/"; $imgId = preg_replace("/^.+\/(\d+)$/", "\\1", $name); if ($suffix == "gif") { $imgSavePath .= "emotion"; } else { $imgSavePath .= "topic"; } $imgSavePath .= ("/".$imgId.".".$suffix); if (is_file($imgSavePath)) { unlink($imgSavePath); echo "

文件".$imgSavePath."已存在,将被删除"; } $imgFile = file_get_contents($url); $flag = file_put_contents($imgSavePath, $imgFile); if ($flag) { echo "

文件".$imgSavePath."保存成功"; } }?>

在使用php抓取网页:内容、图片、链接的时候,我觉得最重要的还是正则(根据抓取的内容和指定的规则获取想要的数据),思路其实都比较简单,用到的方法也并不多,也就那几个(而且抓取内容还是直接调用别人写好的类中的方法就可以了)

但之前想过的是php似乎并没有实现如下的方法,比如一个文件中有N行(N很大),需要将其中符合规则的行内容进行替换,如第3行是aaa需要转成bbbbb。一般的需要修改文件时的常见做法:

1、一次读取整个文件(或是逐行读取),然后使用临时文件进行保存最终转换后的结果,再替换原始文件

2、逐行读取,使用fseek控制文件指针的位置,然后fwrite写入

方案1在文件较大时,一次读取不可取(逐行读取,然后写入临时文件再替换原始文件效率感觉也不高),方案2则在被替换的字符串长度小于等于目标值时没问题,但超过了则会有问题,它会“越界”,将下一行的数据也打乱了(不能像JavaScript中有“选区”的概念,使用新的内容进行替换)

下面是使用方案2做试验的代码:

先读取一行,此时文件指针其实是指到下一行开头,使用fseek将文件指针回移到上一行起始位置,然后使用fwrite进行替换操作,正因为是替换操作,在不指定长度的情况下,它把影响到下一行的数据,而我想要的是只想针对这一行进行操作,例如删除这一行或是整行只替换为一个1,上面的例子达不到要求,或许是我还没有找到合适的方法… 你有好的方法吗?

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

php snoopy视频教程,php的Snoopy类相关推荐

  1. 视频教程-uni-app实战商城类app和小程序-Webapp

    uni-app实战商城类app和小程序 帝莎学院创始人&CEO,目前主要从事全栈开发.Python.PHP.小程序.App.Web等技术的研究和开发.专注于实战类教程,授课风趣幽默,讲解条理清 ...

  2. snoopy php https_php使用snoopy与curl模拟登陆的实例分享

    说起模拟登录,很多人可能会想起CURL.其实除了CURL,snoopy也是可以实现模拟登陆的.本文就实例分析了snoopy与curl两种实现方法,希望对大家有所帮助. php模拟登陆的实现方法,具体实 ...

  3. php100 2012视频教程 汽车维修 C#高级编程视频教程 服装设计 时尚类视频教程分享 持续更新中~~

    PHP100视频教程2012版(更新至第29讲).    http://dl.vmall.com/c0bcvaryqb 57_黑马程序员_Android核心                       ...

  4. 创建抽象类、_【Java视频教程】day16-抽象类

    抽象类的概念 抽象的产生 需求:创建类描述猫和狗: 猫:颜色:名字:品种: 吃:叫:抓老鼠: 狗:颜色:名字:品种: 吃:叫:看家: 老的实现方式: //创建类描述狗 class Dog {priva ...

  5. [鸟哥linux视频教程整理]03_01_Linux文件管理类命令详解续3

    一.查看文本: cat:连接并显示  tac:反向显示文本内容 -n:显示行号 -E:显示每一行的行结束符 注:对于Linux系统而言,所有的文本文件的每一行的行结束符是$.windows系统的结束符 ...

  6. snoopy(强大的PHP采集类) 实例应用

    为什么80%的码农都做不了架构师?>>>    Snoopy是一个php类,用来模拟浏览器的功能,可以获取网页内容,发送表单. 下载地址: http://sourceforge.ne ...

  7. php snoopy 下载图片,PHP采集类Snoopy抓取图片实例

    这篇文章主要介绍了PHP采集类Snoopy抓取图片实例,Snoopy是一个强大的PHP采集类,可以用来开发一些采集程序和小偷程序,需要的朋友可以参考下. 用了两天php的Snoopy这个类,发现很好用 ...

  8. 使用snoopy logger记录用户命令

    原文地址:http://blog.sina.com.cn/s/blog_704836f40101kyys.html 在没有运维堡垒机之前,很多管理员公用root帐号来管理服务器. 常见的一个情况很多天 ...

  9. pythoncad标注教程_CAD 2014二维三维建模渲染标注基础与提升视频教程

    CAD 2014基础与提升视频教程 课程描述 CAD 2014基础与提升视频教程,偏机械类 学习人群 零基础,室内都可以:CAD制图者,特别是机械制图:机械.建筑.电子行业从业者主图需求:准备转行CA ...

最新文章

  1. jbpm4 org.hibernate.exception.ConstraintViolationException
  2. Javascript 将时间戳显示为“多久前”
  3. LA3403 天平难题
  4. (笔试题)小米Git
  5. matlab gui设计实例_S-Funciton应用实例
  6. matlab中y=x(:,ones(1,3))的含义解读
  7. 单片机实用工具大全,超级赞,工程师必备!
  8. C语言高级编程:数组和指针作为函数形参
  9. Java异常处理教程
  10. 架构的变迁,从分层架构先聊起
  11. 翻译: Octave 入门教程
  12. python处理时间序列非平稳_【Python算法】--非平稳时间序列分析
  13. java.lang.NoClassDefFoundError: Could not initialize class com.cyj.util.Jdbc
  14. 研究生软件测试项目答辩ppt,优秀硕士毕业论文答辩PPT.ppt
  15. 猫游记页游mysql_5款曾经极其火爆的页游,最后一款90后没听过80后才玩过
  16. 拖欠银行贷款的后果有哪些
  17. Predicting Depth, Surface Normals and Semantic Labels with a Common Multi-Scale Convolutional Archit
  18. 视频教程-跟宁哥学Go语言视频课程(10):反射-Go语言
  19. 黑马程序员-反射-constructor-feld类-Method-数组的反射-反射的作用
  20. 这些用 Python 写的牛逼程序/脚本,你玩过吗?

热门文章

  1. Lecture 13 Amortized Analysis
  2. 2.11 queue
  3. Delphi XE2获取汉字拼音首字母
  4. WIN10下ADB工具包安装的教程和总结 --201809
  5. Zabbix3.4安装详细步骤
  6. 【跃迁之路】【451天】程序员高效学习方法论探索系列(实验阶段208-2018.05.02)...
  7. SQL Server 2008 - Cannot set a credential for principal 'sa'.
  8. Qt之QNetworkInterface
  9. 翻译:Asp.net中多彩下拉框的实现
  10. a/b测试_如何进行A / B测试?