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
C#采用vony.Html.AIO插件批量爬MM网站图片的更多相关文章
- 【Python】批量爬取网站URL测试Struts2-045漏洞
1.概述都懒得写了.... 就是批量测试用的,什么工具里扣出来的POC,然后根据自己的理解写了个爬网站首页URL的代码... #!/usr/bin/env python # -*- coding: u ...
- Python:爬取网站图片并保存至本地
Python:爬取网页图片并保存至本地 python3爬取网页中的图片到本地的过程如下: 1.爬取网页 2.获取图片地址 3.爬取图片内容并保存到本地 实例:爬取百度贴吧首页图片. 代码如下: imp ...
- Python3批量爬取网页图片
所谓爬取其实就是获取链接的内容保存到本地.所以爬之前需要先知道要爬的链接是什么. 要爬取的页面是这个:http://findicons.com/pack/2787/beautiful_flat_ico ...
- 使用Python批量爬取美女图片
运行截图 实列代码: from bs4 import BeautifulSoup import requests,re,os headers = { 'User-Agent': 'Mozilla/5. ...
- 使用ajax爬取网站图片()
以下内容转载自:https://www.makcyun.top/web_scraping_withpython4.html 文章关于网站使用Ajaxj技术加载页面数据,进行爬取讲的很详细 大致步骤如下 ...
- Day11 (黑客成长日记) 爬取网站图片
#导入第三方库# coding:utf-8import requests,re #找到需要爬取的网站'http://www.qqjia.com/sucai/sucai1210.htm' #1>获 ...
- 使用python来批量抓取网站图片
今天"无意"看美女无意溜达到一个网站,发现妹子多多,但是可恨一个page只显示一张或两张图片,家里WiFi也难用,于是发挥"程序猿"的本色,写个小脚本,把图片扒 ...
- webmagic 二次开发爬虫 爬取网站图片
webmagic的是一个无须配置.便于二次开发的爬虫框架,它提供简单灵活的API,只需少量代码即可实现一个爬虫. webmagic介绍 编写一个简单的爬虫 webmagic的使用文档:http://w ...
- 使用Jsoup爬取网站图片
package com.test.pic.crawler; import java.io.File; import java.io.FileOutputStream; import java.io.I ...
随机推荐
- 用redis的scan命令代替keys命令,以及在spring-data-redis中遇到的问题
摘要 本文主要是介绍使用redis scan命令遇到的一些问题总结,scan命令本身没有什么问题,主要是spring-data-redis的问题. 需求 需要遍历redis中key,找到符合某些pat ...
- MVP架构在xamarin android中的简单使用
好几个月没写文章了,使用xamarin android也快接近两年,还有一个月职业生涯就到两个年了,从刚出来啥也不会了,到现在回头看这个项目,真jb操蛋(真辛苦了实施的人了,无数次吐槽怎么这么丑),怪 ...
- REST风格框架实战:从MVC到前后端分离(附完整Demo)
既然MVC模式这么好,难道它就没有不足的地方吗?我认为MVC至少有以下三点不足:(1)每次请求必须经过“控制器->模型->视图”这个流程,用户才能看到最终的展现的界面,这个过程似乎有些复杂 ...
- 你不知道的JavaScript--Item3 隐式强制转换
JavaScript的数据类型分为六种,分别为null,undefined,boolean,string,number,object. object是引用类型,其它的五种是基本类型或者是原始类型.我们 ...
- 10.app后端选择什么开发语言
在qq上,经常看到有创业团队的创始人一直都招不到技术人员,除了项目的因素外,很大的原因就是所需要掌握的开发语言偏门.通过阅读本文,详细了解选择开发语言的核心原则,使各位心里对开发语言的选择更加有数. ...
- lsb_release -a 查询Linux系统版本
LSB是Linux Standard Base的缩写,lsb_release命令用来显示LSB和特定版本的相关信息.如果使用该命令时不带参数,则默认加上-v参数.-v, --version显示版本信息 ...
- HashMap浅入理解
HashMap不能保证元素的顺序,HashMap能够将键设为null,也可以将值设为null,与之对应的是Hashtable,(注意大小写:不是HashTable),Hashtable不能将键和值设为 ...
- Hibernate用注解生成表
User.java实体来 package com.tao.pojo; import javax.persistence.Column; //用注解的方式生成表 import javax.persist ...
- CAD中用户选择实体
在CAD的很多操作中都会有需要用户选择实体的时候,这里将我最近项目中用到的方法分享一下,程序原意是希望用户选择一个单行文本或者多行文本,并返回所选文本的内容,直接上代码: CString CPaint ...
- 使用istream迭代器来输入输出数据
在C++中,很多人都会选择使用cin来进行数据的输入,使用cout来进行数据的输出,现在在C++11中我们可以使用iostream迭代器来进行这些操作,这会减少代码量,达到的效果和前面两种相同.以下是 ...