php抓取网页所有图片(php获取请求网页里面的所有链接())

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

  php抓取网页所有图片(php获取请求网页里面的所有链接())

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

  指示:

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

  例子:

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

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

  $sourceURL = "";

  $snoopy->fetchlinks($sourceURL);

  $a = $snoopy->results;

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

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

  $reTag = "/

  

  /一世”;

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

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

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

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

  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 = "/

  

  /一世”;

  如果(preg_match($reTag,$fileContent)){

  $ret = preg_match_all($reTag, $fileContent, $matchResult);

  for ($i = 0, $len = count($matchResult[1]); $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。需要修改文件时的常见做法:

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

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

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

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

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

  PHP的史努比用了两天了,很有用。获取请求页面中的所有链接,可以直接使用fetchlinks,获取所有文本信息,使用fetchtext(其内部...

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线