博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#采用vony.Html.AIO插件批量爬MM网站图片
阅读量:5254 次
发布时间:2019-06-14

本文共 3651 字,大约阅读时间需要 12 分钟。

一、创建项目

  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
categoryUrl = new List
();//加载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 });                                            }                }

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

 

///         /// 异不下载图片        ///         ///         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://www.cnblogs.com/taxue/p/10504874.html

你可能感兴趣的文章
WAMP学习日记之:Apache发布php网站
查看>>
多文件上传 插件推荐
查看>>
Redis-用思维导图二天搞定Redis用法。
查看>>
[noip模拟赛2017.7.15]
查看>>
ind2vec和vec2ind函数
查看>>
poj1511 Invitation Cards (前向星?)
查看>>
javamail发邮件无主题内容为源文件 乱码
查看>>
LoaderManager使用详解(四)---实例:AppListLoader
查看>>
阅读笔记02
查看>>
java安全编码标准
查看>>
Codeforces Beta Round #7
查看>>
ubuntu windows 双系统修改默认启动项
查看>>
微信场景二维码 做转化步骤跟踪 初步实现思路
查看>>
如何向android的framework里添加新API
查看>>
大道至简伪代码
查看>>
【原】PNG的使用技巧
查看>>
SQLite简介及SQLite在.NET中的应用
查看>>
2017 CCPC Qinhuangdao Site
查看>>
BZOJ3648 : 寝室管理
查看>>
hdu1814Peaceful Commission(2-SAT)
查看>>