php网页抓取图片(几个非常帮的摄影网站-抓取图片的流程及流程)

优采云 发布时间: 2021-09-25 00:20

  php网页抓取图片(几个非常帮的摄影网站-抓取图片的流程及流程)

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

  抓图过程介绍常用的抓图方式有很多,比如:使用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)

  

  downloadImg($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属性,只能得到label的默认显示图片,显然不是我们需要的,所以匹配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人工客服


线