C#采用vony.Html.AIO插件批量爬MM网站图片
一、创建项目
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
上一篇: java中的多线程的实现生产者消费者模式
下一篇: spring 装配bean的三种方式