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

C#采用vony.Html.AIO插件批量爬MM网站图片

程序员文章站 2022-05-29 13:05:38
一、创建项目 1.创建一个.netframework的控制台项目命名为Crawler 2.安装nuget包搜索名称Ivony.Html.AIO,使用该类库什么方便类似jqury的选择器可以根据类名或者元素类型来匹配元素,无需要写正则表达式。 3.创建一个图片类Image 一、抓取页面图片 1.拿到所 ......

一、创建项目

  1.创建一个.netframework的控制台项目命名为crawler

C#采用vony.Html.AIO插件批量爬MM网站图片

2.安装nuget包搜索名称ivony.html.aio,使用该类库什么方便类似jqury的选择器可以根据类名或者元素类型来匹配元素,无需要写正则表达式。

C#采用vony.Html.AIO插件批量爬MM网站图片

3.创建一个图片类image

C#采用vony.Html.AIO插件批量爬MM网站图片

一、抓取页面图片

1.拿到所有图片页面的地址

本次爬取的网站为https://www.mntup.com/,打开页面进入二级目录https://www.mntup.com/siwa.html,并查页面看源代码,如下图:

C#采用vony.Html.AIO插件批量爬MM网站图片

图片页都在class=“dana”的div下面,我们要拿去div中超链接的href,如下格式:

<div class="dana"><a href=/rosimm/liantiyimeizi_4f4d781d.html title=[rosi写真]no.2637_红色吊带高叉连体衣妹子床上狗爬式秀浑圆翘臀撩人诱惑写真38p target=_blank>
[rosi写真]no.2637_红色吊带高叉连体衣妹子床上狗爬式秀浑圆翘臀撩人诱惑写真38p <b> <font color=ff0000>2019-02-26</b></font>
</a></div>

首先考虑要拿到所有图片页面的超链接,c#代码下:

//需要定义一个list用来存放所有的页面链接 
static list<string> categoryurl = new list<string>();

//加载url到文档
  ihtmldocument source = new jumonyparser().loaddocument("https://www.mntup.com/xiuren.html", system.text.encoding.getencoding("utf-8"));
     
            //获取所有class=dana的的a标签
            var divlinks = source.find(".dana a");
            foreach (var alink in divlinks)
            {
                var categoryname = alink.attribute("href").value(); //获取a中的链接
                categoryurl.add(categoryname);
            }

  

 2.打开图片页,发现是带有分页的,那就要获取所有的分页的链接了。分页的地址都在页面当中,所以我们直接匹配就好。

由于每个图片页都有分页地址,所以直接匹配分页地址,c#代码如下:

   
foreach (var url in categoryurl)
            {
               //获取图片也的的文档
                ihtmldocument html = new jumonyparser().loaddocument($"{address}{url}", system.text.encoding.getencoding("utf-8"));

                //获取每个分页面并下载
                var pagelink = html.find(".page a");
                foreach (var alingk in pagelink)
                {
                    string href = alingk.attribute("href").value();
                    console.writeline($"获取分页地址{href}");

                }
            }

 3.所有分页都获取到了,接下来就是要获取页面中的每张图片了,打开页面查看源代码:

C#采用vony.Html.AIO插件批量爬MM网站图片

观察发现,所有的图片都在class=img的div下面,那就可以从每个分页中直接下载所有的图片了,代码如下:

  
//获取每一个分页的文档模型
 ihtmldocument htm2 = new jumonyparser().loaddocument($"{address}{href}", system.text.encoding.getencoding("utf-8"));

                    //获取class=img的div下的img标签
                    var alink = htm2.find(".img img");

                    foreach (var link in alink)
                    {
                        var imgsrc = link.attribute("src").value();
                        console.writeline("获取到图片路径" + imgsrc);
                        console.writeline($"开始下载图片{imgsrc}>>>>>>>");
                        downloadimg(new image { address = address + imgsrc, title = url });
                        
                    }
                }

 图片下载方法如下,为防止下载的时候阻塞主进程,下载采用异步:

 

        /// <summary>
        /// 异不下载图片
        /// </summary>
        /// <param name="image"></param>
        async static void downloadimg(image image)
        {
            using (webclient client = new webclient())
            {
                try
                {
                    int start = image.address.lastindexof("/") + 1;
    
                    string filename = image.address.substring(start, image.address.length - start);
                  //图片目录采用页面地址作为文件名
                    string directory = "c:/images/" + image.title.replace("/", "-").replace("html", "") + "/";                
                    if (!directory.exists(directory))
                    {
                        directory.createdirectory(directory);
                    }
                    await client.downloadfiletaskasync(new uri(image.address), directory + filename);
                }
                catch (exception)
                {
                    console.writeline($"{image.address}下载失败");
                    file.appendtext(@"c:/log.txt");
                }
                console.writeline($"{image.address}下载成功");
            }

        }    

  

三、抓取图片

由于编码格式的问题,无法获取到中文标题,所有就采取了页面链接作为目录名称,下面是一张我抓取图片的截图:

 

C#采用vony.Html.AIO插件批量爬MM网站图片

最后的战果:

C#采用vony.Html.AIO插件批量爬MM网站图片

最后奉上代码如下:https://github.com/peijianmin/mycrawler.git