php网页抓取图片(PHP采集类Snoopy抓取图片实例(一)(组图))

优采云 发布时间: 2021-12-22 06:02

  php网页抓取图片(PHP采集类Snoopy抓取图片实例(一)(组图))

  PHP采集类似史努比的抓图示例

  PHP的史努比用了两天了,很有用。要获取请求网页中的所有链接,可以直接使用 fetchlinks。获取所有的文本信息,使用fetchtext(内部仍然使用正则表达式进行处理),还有很多其他的功能,比如模拟提交表单。

  指示:

  首先下载史努比类,下载地址:

  先实例化一个对象,然后调用对应的方法获取爬取的网页信息

  包括'史努比/史努比.class.php';

  $史努比 = 新史努比();

  $sourceURL = "";

  $snoopy->fetchlinks($sourceURL);

  $a = $snoopy->results;

  不提供获取网页中所有图片地址的方法。它自己的一个需求是获取页面上文章列表中的所有图片地址。然后我自己写了一个,主要是因为常规比赛很重要。

  //匹配图片的正则表达式

  $reTag = "//i";

  由于特殊需要,只需要抓取htp://开头的图片(外网的图片可能会做防盗链,我想先抓取本地的)

  1. 抓取指定网页,过滤掉所有预期的文章地址;

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

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

  包括'史努比/史努比.class.php';

  $史努比 = 新史努比();

  $sourceURL = "";

  $snoopy->fetchlinks($sourceURL);

  $a = $snoopy->results;

  $re = "/d+.html$/";

  //过滤获取指定文件地址请求

  foreach ($a as $tmp) {

  如果(preg_match($re,$tmp)){

  getImgURL($tmp);

  }

  }

  函数 getImgURL($siteName) {

  $史努比 = 新史努比();

  $snoopy->fetch($siteName);

  $fileContent = $snoopy->results;

  //匹配图片的正则表达式

  $reTag = "//i";

  如果(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]);

  }

  }

  }

  函数 saveImgURL($name, $suffix) {

  $url = $name.".".$suffix;

  echo "请求的图片地址:".$url。"

  ”;

  $imgSavePath = "E:/xxx/style/images/";

  $imgId = preg_replace("/^.+/(d+)$/", "\1", $name);

  if ($suffix == "gif") {

  $imgSavePath .= "情感";

  } 别的 {

  $imgSavePath .= "主题";

  }

  $imgSavePath .= ("/".$imgId.".".$suffix);

  如果(is_file($imgSavePath)){

  取消链接($imgSavePath);

  回声"

  文件“.$imgSavePath”。已经存在,将被删除

  ”;

  }

  $imgFile = file_get_contents($url);

  $flag = file_put_contents($imgSavePath, $imgFile);

  如果($标志){

  回声"

  文件“.$imgSavePath”。已成功保存

  ”;

  }

  }

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

  但是我之前想到的是,PHP似乎没有实现以下方法。比如一个文件有N行(N大),需要替换符合规则的行内容。比如第三行是aaa,需要转成bbbbb。需要修改文件时的常见做法:

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

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

  文件较大时,方案1不建议一次性读取(逐行读取,然后写入临时文件再替换原文件效率不高),方案2是当替换的长度string 小于等于目标值没问题,但是超过限制就会有问题。它会“越界”并破坏下一行的数据(不能像JavaScript中的“选择”概念那样用新的内容代替)。

  这是用于试验场景 2 的代码:

  $mode = "r+";

  $filename = "d:/file.txt";

  $fp = fopen($filename, $mode);

  如果($ fp){

  $i = 1;

  而 (!feof($fp)) {

  $str = fgets($fp);

  回声 $str;

  如果 ($i == 1) {

  $len = strlen($str);

  fseek($fp, -$len, SEEK_CUR);//指针向前移动

  fwrite($fp, "123");

  }

  我++;

  }

  fclose($fp);

  }

  先读一行。这时候文件指针实际上指向了下一行的开始。使用 fseek 将文件指针移回上一行的开头,然后使用 fwrite 执行替换操作。因为是替换操作,如果不指定长度next,会影响下一行的数据,而我想要的是只对这一行进行操作,比如删除这一行或者只用一个替换整行1.上面的例子不符合要求,可能是我没有找到合适的方法...相关阅读:

  C#使用WinRar命令实现压缩和解压操作

  如何使用jquery.form.js上传图片

  PHP+jquery+ajax实现即时聊天功能示例

  JS中artdialog弹窗控件的提交表单思路详解

  Oracle SQL中实现indexOf和lastIndexOf函数的思路和代码

  PHP输出URL快捷方式示例代码

  Android开发学习路线的七个阶段

  PHP使用cookie实现自动登录的方法

  AngularJS 手动表单验证

  通过实例深入学习OGNL表达式在Java的Struts框架中的使用

  Windows 10 U 盘版亚马逊开启预购,8 月 16 日开始发货

  js实现带缓冲效果的类似QQ面板的折叠菜单代码

  AngularJS 基本 ng-if 指令用法

  Java设计模式之备忘录模式(Memento Pattern)介绍

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线