php 抓取网页生成图片(几个(从代码角度)的信息;这里换成data-original属性)

优采云 发布时间: 2021-12-31 09:24

  php 抓取网页生成图片(几个(从代码角度)的信息;这里换成data-original属性)

  今天在浏览简书的时候,发现了几位非常有帮助的摄影师网站。上面的图片很美,萌生了把它们都屏蔽到当地的念头。并且之前也有过爬虫相关的项目,所以总结了一下自己的心得体会,供大家参考。

  拍摄图片的过程介绍

  抓取图片的方法有很多种,比如:使用curl方法、fiel_get_content方法、readfile方法、fopen方法。. . . . . 可谓五花八门!但它们的原理大致相似:

  1 获取图片所在页面的url地址;

  2 获取目标页面的内容后,添加

  标签相关信息匹配有规律;

  3 获取img的src属性信息后,获取图片的内容;

  4 在本地创建一个文件,将步骤3中得到的内容写入文件;

  经过以上4步,你喜欢的图片就保存在了本地。让我们更详细地看一下它(从代码的角度)。这里我只尝试了两种方法(curl 和 file_get_content)。

  二、使用file_get_content方法抓取图片(get方法)

  1 首先定义两个函数(getResources() 和downloadImg())获取页面内容和下载图片到本地函数!代码如下:

  

  获取资源($url)

  

  下载Img($imgPath)

  2 主要程序如下:

  //定义本地目录(存放图片)

  定义(“IMG_PATH”,“/home/www/test/img/”);

  //获取页面内容

  $url = "目标路径";

  //这个函数把获取到的内容放到一个字符串中

  $str = getResources($url);

  //匹配img标签中src属性的信息;这里用data-original属性代替,因为页面使用了延迟加载机制

  preg_match_all("|

  ]+data-original=['\" ]?([^'\"?]+)['\" >]|U",$str,$array,PREG_SET_ORDER);

  //因为上一步我们选择了PREG_SET_ORDER排序,所以$value[1]就是我们要下载图片的路径

  $k = 0;

  foreach ($array 作为 $key => $value)

  {

  $res = downloadImg($value[1]);

  if($res) $k++;

  }

  echo "成功捕获的图片数量为:$k";

  在程序结束时,这里需要注意以下几点:

  1) preg_match_all() 函数的第四个参数是可选的。它们是:PREG_PATTERN_ORDER(默认),

  PREG_SET_ORDER、PREG_OFFSET_CAPTURE,这三种方法在我看来是三种不同的排序,只会影响你的匹配结果的表现。如果不传入第四个参数,则默认为 PREG_PATTERN_ORDER,此时使用 PREG_SET_ORDER 排序。对此,php手册中有非常详细的介绍,建议你在这一步查看手册,加深印象。

  2) 在我们匹配的正则表达式中

  标签中data-original属性中的值,我们来说说这个规律,首先要匹配的是

  标签信息,然后使用子匹配来匹配数据原创属性中的值。值得注意的是,这里有很多摄影课(图片课)。网站 为了更好的展示效果,大部分都会使用延迟加载设置。如果还是按照之前的方式匹配src属性,只能得到

  标签默认显示图片,显然这不是我们需要的,所以匹配data-original属性(存储真实图片路径);

  3) 如果请求的页面过大,程序运行时间过长,请在程序开头添加如下代码:

  set_time_limit(120); //修改程序执行时间为120s(自己看)

  二、使用curl方式抓取图片(post方式)

  上面我们使用file_get_content()函数的get方法来捕获,这里我们改成curl的post方法。(每种方法有两种方式)

  1 定义一个函数,使用curl方法抓图

  

  curlResources($url)

  2 在主程序中,将 $str = getResources($url) 改为 $str = curlResources($url)。

  三种和两种方法的执行效率对比

  1 file_get_contents 每次请求都会重新做DNS查询,DNS信息不会被缓存。但是 CURL 会自动缓存 DNS 信息。请求同域名下的网页或图片,只需要进行一次DNS查询。这大大减少了 DNS 查询的数量。所以CURL的性能要比file_get_contents好很多。

  2 file_get_contents 请求HTTP时,使用http_fopen_wrapper,不keeplive(保持链接状态)。但是卷曲可以。这样,当多次请求多个链接时,curl 的效率会更高。

  3 与file_get_content相比,curl方法请求更加多样化,可以请求FTP协议、SSL协议...等资源。

  总结

  1 php手册的重要性,有时候你不妨看看手册,不管查了多少资料,都有对一些功能的详细介绍。在开始之前,我不记得 preg_match_all() 会有第四个参数。.

  2 严格对待代码结构,不能马虎。结构合理,清晰明了,复用率高。

  3 真正的知识来自实践,你可以用更多的双手记住它。最好多读一遍(请允许我使用这个词)以亲切,这样你就可以记住这个过程的原理。

  4 展开,抓取页面包括其子页面中的图片,原理是一样的,无非就是在标签的href中找到url进行遍历,然后分别抓取图片...我不会在这里重复它们。.

  以上是我在拍照过程中的体会。我希望它能对大家有所帮助。如有不对之处,欢迎批评指正!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线