一、创建项目
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 ListcategoryUrl = 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}下载成功"); } }
三、抓取图片
由于编码格式的问题,无法获取到中文标题,所有就采取了页面链接作为目录名称,下面是一张我抓取图片的截图:
最后的战果:
最后奉上代码如下: