• .NET如何爬取网站的图片并下载到本地
  • 发布于 2个月前
  • 438 热度
    0 评论
  • 梦清幽
  • 0 粉丝 50 篇博客
  •   

最近看到一个图片网站,上面有很多很漂亮的图片,一张张下载另存为效率太慢了,于是就想用.NET做一个自动爬取网站图片的功能。要实现自动爬取网站图片的功能,主要有以下几个步骤:

1.爬取图片所在的页面url,实现模拟打开页面的功能

2.用正则表达式提取页面的图片url

3.再根据提取的url抓取图片的内容,并保存在本地(要存储在数据库也可以直接把图片二进制流存进数据库)

具体实现:

1.抓取需要自动爬取图片所在的页面,我们就以抓取duidaima.com首页的图片为例子,来看一下如何实现抓取页面的内容。在抓取前,先在命名空间引入如下三个命名空间,在这里主要要用到WebRequest来模拟页面访问的功能

using System.Net;
using System.IO;
using System.Text;
抓取需要批量爬取的图片所在的页面信息,具体代码如下:

            HttpWebRequest req;
            HttpWebResponse res = null;
            try
            {
                System.Uri httpUrl = new System.Uri("https://www.duidaima.com/");
                req = (HttpWebRequest)(WebRequest.Create(httpUrl));
                req.Timeout = 180000; //设置超时值10秒
                req.UserAgent = "XXXXX";
                req.Accept = "XXXXXX";
                req.Method = "GET";
                res = (HttpWebResponse)(req.GetResponse());
                using (Stream stream = res.GetResponseStream())
                {
                    StreamReader reader = new StreamReader(stream, Encoding.UTF8);
                    String responseString = reader.ReadToEnd();
                }
            }
            catch (Exception ex)
            { 
            
            }
上面的代码执行后可以得到如下一段html文本信息:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-language" content="zh-CN"/>
    <meta charset="utf-8"/>
    <meta name="renderer" content="webkit"/>
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
    <title>堆代码-是程序员就上堆代码</title>
    <meta name="keywords" content="堆代码,duidaima,程序员,码农,堆,编程博客,编程教程,编程基础知识,编程网课,在线阅读,在线书籍" />
    <meta name="description"  content="编程遇到问题?请上堆代码!想要学习编程知识?请上堆代码!无处记录日常?还是上堆代码!堆代码,堆的是生活,码的是理想。" />
.....
第二步:把上一步获取到的字符串信息传入下面的提取图片url的方法

       /// <summary> 
        /// 取得HTML中所有图片的 URL。 
        /// </summary> 
        /// <param name="sHtmlText">HTML代码</param> 
        /// <returns>图片的URL列表</returns> 
        public static string[] GetHtmlImageUrlList(string sHtmlText)
        {
            // 定义正则表达式用来匹配 img 标签 
            Regex regImg = new Regex(@"<img\b[^<>]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgUrl>[^\s\t\r\n""'<>]*)[^<>]*?/?[\s\t\r\n]*>", RegexOptions.IgnoreCase);
            // 搜索匹配的字符串 
            MatchCollection matches = regImg.Matches(sHtmlText);
            int i = 0;
            string[] sUrlList = new string[matches.Count];
            // 取得匹配项列表 
            foreach (Match match in matches)
                sUrlList[i++] = match.Groups["imgUrl"].Value;
            return sUrlList;
        }
第三步:循环读取第二步获取到的图片数组信息,把图片数组里的每个图片url传入到下面的这个方法实现图片下载到本地的功能(或者存储到数据库)

public Bitmap GetImgContent(string imgUrl)
        {
            Bitmap img = null;
            HttpWebRequest req;
            HttpWebResponse res = null;
                try
                {
                    System.Uri httpUrl = new System.Uri(imgUrl);
                    req = (HttpWebRequest)(WebRequest.Create(httpUrl));
                    req.Timeout = 180000; //设置超时值10秒
                    req.UserAgent = "XXXXX";
                    req.Accept = "XXXXXX";
                    req.Method = "GET";
                    res = (HttpWebResponse)(req.GetResponse());
                    img = new Bitmap(res.GetResponseStream());//获取图片流
                    img.Save(@"E:/" + DateTime.Now.ToFileTime().ToString() + ".png");//随机名,盘符可以自行选择,如果要存储到数据,直接把上面的图片流存储到数据库就可以了
                }
            catch (Exception ex)
            {
                 string aa= ex.Message;
            }
            finally
            {
                res.Close();
            }
             return img;
    }


用户评论