当前位置: 移动技术网 > IT编程>开发语言>.net > C#采用vony.Html.AIO插件批量爬MM网站图片

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

2019年03月11日  | 移动技术网IT编程  | 我要评论

一、创建项目

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

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

3.创建一个图片类image

一、抓取页面图片

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

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

图片页都在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.所有分页都获取到了,接下来就是要获取页面中的每张图片了,打开页面查看源代码:

观察发现,所有的图片都在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}下载成功");
            }

        }    

  

三、抓取图片

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

 

最后的战果:

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

 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网