欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

网页抓图

程序员文章站 2022-06-16 07:55:30
...
  1. header('Content-Type:text/html;charset=utf-8');
  2. /**
  3. * 一个用于抓去图片的类
  4. * @author tangpan
  5. */
  6. class download_image {
  7. public $_save_path = NULL; //图片保存路劲
  8. public $_limit_size = NULL; //图片限制大小
  9. public static $_img_url_old = array(); //存储已抓取过的图片链接地址
  10. public static $_a_page_url = array(); //存储抓取过的页面
  11. public function __construct( $_save_path, $_limit_size) {
  12. $this->_save_path = $_save_path;
  13. $this->_limit_size = $_limit_size;
  14. }
  15. public function get_all_page_image( $site_url ) {
  16. if ( $site_url == '' ) {
  17. return false;
  18. }
  19. if ( ! in_array( $site_url, self::$_a_page_url ) ) { //判断当前页面是否抓取过
  20. self::$_a_page_url[] = $site_url; //将超链接存入静态数组中
  21. } else {
  22. return; //若抓取过则跳出
  23. }
  24. $this->download_the_page_image( $site_url );
  25. $content = @file_get_contents($site_url);
  26. $a_page_url = "|]+href=['\" ]?([^ '\"?]+)['\" >]|U";
  27. $all_url = array();
  28. preg_match_all( $a_page_url, $content, $all_url, PREG_SET_ORDER );
  29. if ( $all_url != NULL ) {
  30. foreach( $all_url as $key => $val ) {
  31. /**
  32. * 静态化超链接,防止进入死循环
  33. * 出去当前页面链接表示方式('','#','/')
  34. */
  35. if ( trim($val[1]) != '' && ! in_array( $val[1], self::$_a_page_url ) && ! in_array( $val[1], array('#','/',$site_url) ) ) {
  36. self::$_a_page_url[] = $val[1]; //将符合要求的超链接写入静态数组中
  37. }
  38. }
  39. }
  40. if ( self::$_a_page_url != NULL ) {
  41. foreach( self::$_a_page_url as $keys => $vals ) {
  42. if ( strpos( $vals, 'http://' ) === false ) { //超链接不包含http://时,不能直接访问
  43. // 当图片链接地址为相对地址是重新拼凑地址
  44. $a_domain_url = substr( $site_url, 0, strpos( $site_url, '/',8 ) + 1 );
  45. $a_img_url = $a_domain_url.$vals;
  46. }
  47. //递归调用,访问每一个超链接页面
  48. $this->get_all_page_image( $a_img_url );
  49. }
  50. }
  51. }
  52. /**
  53. * 下载当前页面下的所有图片链接
  54. * @param $site_url
  55. */
  56. public function download_the_page_image( $site_url ) {
  57. // 获取当前链接地址页面的所有内容
  58. $img_pattern = NULL;
  59. $content = @file_get_contents( $site_url );
  60. $img_pattern = "|网页抓图]+src=['\" ]?([^ '\"?]+)['\" >]|U";
  61. //全局匹配所有的网页抓图中的图片链接
  62. $img_out = array();
  63. preg_match_all( $img_pattern, $content, $img_out, PREG_SET_ORDER );
  64. echo '

    '. $site_url . '共找到' . count($img_out) . '张图片

    ';
  65. //print_r($img_out[1]);
  66. foreach( $img_out as $key => $val ) {
  67. //echo htmlspecialchars($val[1]).'
    ';
  68. $this->save_one_image( $site_url, $val[1]);
  69. }
  70. }
  71. public function save_one_image( $site_url, $img_url ) {
  72. if ( strpos( $img_url, 'http://' ) === false ) {
  73. // 当图片链接地址为相对地址是重新拼凑地址
  74. $domain_url = substr( $site_url, 0, strpos( $site_url, '/',8 ) + 1 );
  75. $img_url = $domain_url.$img_url;
  76. }
  77. $pic_name = basename( $img_url ); //获取图片名称
  78. if ( in_array( $img_url, self::$_img_url_old ) ) {
  79. echo $img_url .'该图片已经抓取过!
    ';
  80. return;
  81. }
  82. //获取图片内容,并写入一个字符串
  83. $img_data = @file_get_contents( $img_url );
  84. if ( strlen($img_data) _limit_size ) { //图片大小在限制范围内
  85. $img_boo = @file_put_contents( $this->_save_path.md5(microtime()).$pic_name, $img_data );
  86. if ( $img_boo ) {
  87. echo $img_url .'图片保存成功!
    ';
  88. self::$_img_url_old[] = $img_url;
  89. } else {
  90. echo $img_url .'图片保存失败!
    ';
  91. }
  92. } else {
  93. echo $img_url .'图片大小在限制范围之外!
    ';
  94. }
  95. }
  96. }
  97. set_time_limit(0);
  98. $download_images = new download_image('surces_Img/',1024*1024*100);
  99. $download_images->get_all_page_image('http://www.22mm.cc/');
  100. ?>
复制代码
相关标签: 网页抓图