目录
'.$capture_url . "共找到 " . $photo_num . " 张图片
首页 后端开发 php教程 php远程抓取网站图片并保存的代码

php远程抓取网站图片并保存的代码

Jul 25, 2016 am 09:12 AM

例子,php抓取网站数据的代码。

  1. /**
  2. * 一个用于抓取图片的类
  3. *
  4. * @package default
  5. * @author WuJunwei
  6. */
  7. class download_image
  8. {
  9. public $save_path; //抓取图片的保存地址
  10. //抓取图片的大小限制(单位:字节) 只抓比size比这个限制大的图片
  11. public $img_size=0;
  12. //定义一个静态数组,用于记录曾经抓取过的的超链接地址,避免重复抓取
  13. public static $a_url_arr=array();
  14. /**
  15. * @param String $save_path 抓取图片的保存地址
  16. * @param Int $img_size 抓取图片的保存地址
  17. */
  18. public function __construct($save_path,$img_size)
  19. {
  20. $this->save_path=$save_path;
  21. $this->img_size=$img_size;
  22. }
  23. /**
  24. * 递归下载抓取首页及其子页面图片的方法 ( recursive 递归)
  25. *
  26. * @param String $capture_url 用于抓取图片的网址
  27. *
  28. */
  29. public function recursive_download_images($capture_url)
  30. {
  31. if (!in_array($capture_url,self::$a_url_arr)) //没抓取过
  32. {
  33. self::$a_url_arr[]=$capture_url; //计入静态数组
  34. } else //抓取过,直接退出函数
  35. {
  36. return;
  37. }
  38. $this->download_current_page_images($capture_url); //下载当前页面的所有图片
  39. //用@屏蔽掉因为抓取地址无法读取导致的warning错误
  40. $content=@file_get_contents($capture_url);
  41. //匹配a标签href属性中?之前部分的正则
  42. $a_pattern = "|]+href=['\" ]?([^ '\"?]+)['\" >]|U";
  43. preg_match_all($a_pattern, $content, $a_out, PREG_SET_ORDER);
  44. $tmp_arr=array(); //定义一个数组,用于存放当前循环下抓取图片的超链接地址
  45. foreach ($a_out as $k => $v)
  46. {
  47. /**
  48. * 去除超链接中的 空'','#','/'和重复值
  49. * 1: 超链接地址的值 不能等于当前抓取页面的url, 否则会陷入死循环
  50. * 2: 超链接为''或'#','/'也是本页面,这样也会陷入死循环,
  51. * 3: 有时一个超连接地址在一个网页中会重复出现多次,如果不去除,会对一个子页面进行重复下载)
  52. */
  53. if ( $v[1] && !in_array($v[1],self::$a_url_arr) &&!in_array($v[1],array('#','/',$capture_url) ) )
  54. {
  55. $tmp_arr[]=$v[1];
  56. }
  57. }
  58. foreach ($tmp_arr as $k => $v)
  59. {
  60. //超链接路径地址
  61. if ( strpos($v, 'http://')!==false ) //如果url包含http://,可以直接访问
  62. {
  63. $a_url = $v;
  64. }else //否则证明是相对地址, 需要重新拼凑超链接的访问地址
  65. {
  66. $domain_url = substr($capture_url, 0,strpos($capture_url, '/',8)+1);
  67. $a_url=$domain_url.$v;
  68. }
  69. $this->recursive_download_images($a_url);
  70. }
  71. }
  72. /**
  73. * 下载当前网页下的所有图片
  74. *
  75. * @param String $capture_url 用于抓取图片的网页地址
  76. * @return Array 当前网页上所有图片img标签url地址的一个数组
  77. */
  78. public function download_current_page_images($capture_url)
  79. {
  80. $content=@file_get_contents($capture_url); //屏蔽warning错误
  81. //匹配img标签src属性中?之前部分的正则
  82. $img_pattern = "|php远程抓取网站图片并保存的代码 ]+src=['\" ]?([^ '\"?]+)['\" >]|U";
  83. preg_match_all($img_pattern, $content, $img_out, PREG_SET_ORDER);
  84. $photo_num = count($img_out);
  85. //匹配到的图片数量
  86. echo '

    '.$capture_url . "共找到 " . $photo_num . " 张图片

    ";
  87. foreach ($img_out as $k => $v)
  88. {
  89. $this->save_one_img($capture_url,$v[1]);
  90. }
  91. }
  92. /**
  93. * 保存单个图片的方法
  94. *
  95. * @param String $capture_url 用于抓取图片的网页地址
  96. * @param String $img_url 需要保存的图片的url
  97. *
  98. */
  99. public function save_one_img($capture_url,$img_url)
  100. {
  101. //图片路径地址
  102. if ( strpos($img_url, 'http://')!==false )
  103. {
  104. // $img_url = $img_url;
  105. }else
  106. {
  107. $domain_url = substr($capture_url, 0,strpos($capture_url, '/',8)+1);
  108. $img_url=$domain_url.$img_url;
  109. }
  110. $pathinfo = pathinfo($img_url); //获取图片路径信息
  111. $pic_name=$pathinfo['basename']; //获取图片的名字
  112. if (file_exists($this->save_path.$pic_name)) //如果图片存在,证明已经被抓取过,退出函数
  113. {
  114. echo $img_url . '该图片已经抓取过!
    ';
  115. return;
  116. }
  117. //将图片内容读入一个字符串
  118. $img_data = @file_get_contents($img_url); //屏蔽掉因为图片地址无法读取导致的warning错误
  119. if ( strlen($img_data) > $this->img_size ) //下载size比限制大的图片
  120. {
  121. $img_size = file_put_contents($this->save_path . $pic_name, $img_data);
  122. if ($img_size)
  123. {
  124. echo $img_url . '图片保存成功!
    ';
  125. } else
  126. {
  127. echo $img_url . '图片保存失败!
    ';
  128. }
  129. } else
  130. {
  131. echo $img_url . '图片读取失败!
    ';
  132. }
  133. }
  134. } // END
  135. set_time_limit(120); //设置脚本的最大执行时间 根据情况设置
  136. $download_img=new download_image('E:/images/',0); //实例化下载图片对象
  137. $download_img->recursive_download_images('http://bbs.it-home.org/'); //递归抓取图片方法
  138. //$download_img->download_current_page_images($_POST['capture_url']); //只抓取当前页面图片方法
  139. ?>
复制代码


本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

在Laravel中使用Flash会话数据 在Laravel中使用Flash会话数据 Mar 12, 2025 pm 05:08 PM

Laravel使用其直观的闪存方法简化了处理临时会话数据。这非常适合在您的应用程序中显示简短的消息,警报或通知。 默认情况下,数据仅针对后续请求: $请求 -

构建具有Laravel后端的React应用程序:第2部分,React 构建具有Laravel后端的React应用程序:第2部分,React Mar 04, 2025 am 09:33 AM

这是有关用Laravel后端构建React应用程序的系列的第二个也是最后一部分。在该系列的第一部分中,我们使用Laravel为基本的产品上市应用程序创建了一个RESTFUL API。在本教程中,我们将成为开发人员

php中的卷曲:如何在REST API中使用PHP卷曲扩展 php中的卷曲:如何在REST API中使用PHP卷曲扩展 Mar 14, 2025 am 11:42 AM

PHP客户端URL(curl)扩展是开发人员的强大工具,可以与远程服务器和REST API无缝交互。通过利用Libcurl(备受尊敬的多协议文件传输库),PHP curl促进了有效的执行

简化的HTTP响应在Laravel测试中模拟了 简化的HTTP响应在Laravel测试中模拟了 Mar 12, 2025 pm 05:09 PM

Laravel 提供简洁的 HTTP 响应模拟语法,简化了 HTTP 交互测试。这种方法显着减少了代码冗余,同时使您的测试模拟更直观。 基本实现提供了多种响应类型快捷方式: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

在Codecanyon上的12个最佳PHP聊天脚本 在Codecanyon上的12个最佳PHP聊天脚本 Mar 13, 2025 pm 12:08 PM

您是否想为客户最紧迫的问题提供实时的即时解决方案? 实时聊天使您可以与客户进行实时对话,并立即解决他们的问题。它允许您为您的自定义提供更快的服务

Laravel中的通知 Laravel中的通知 Mar 04, 2025 am 09:22 AM

在本文中,我们将在Laravel Web框架中探索通知系统。 Laravel中的通知系统使您可以通过不同渠道向用户发送通知。今天,我们将讨论您如何发送通知OV

解释PHP中晚期静态结合的概念。 解释PHP中晚期静态结合的概念。 Mar 21, 2025 pm 01:33 PM

文章讨论了PHP 5.3中引入的PHP中的晚期静态结合(LSB),从而允许静态方法的运行时分辨率调用以获得更灵活的继承。 LSB的实用应用和潜在的触摸

PHP记录:PHP日志分析的最佳实践 PHP记录:PHP日志分析的最佳实践 Mar 10, 2025 pm 02:32 PM

PHP日志记录对于监视和调试Web应用程序以及捕获关键事件,错误和运行时行为至关重要。它为系统性能提供了宝贵的见解,有助于识别问题并支持更快的故障排除

See all articles