一、创建项目

  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网站图片的更多相关文章

  1. 【Python】批量爬取网站URL测试Struts2-045漏洞

    1.概述都懒得写了.... 就是批量测试用的,什么工具里扣出来的POC,然后根据自己的理解写了个爬网站首页URL的代码... #!/usr/bin/env python # -*- coding: u ...

  2. Python:爬取网站图片并保存至本地

    Python:爬取网页图片并保存至本地 python3爬取网页中的图片到本地的过程如下: 1.爬取网页 2.获取图片地址 3.爬取图片内容并保存到本地 实例:爬取百度贴吧首页图片. 代码如下: imp ...

  3. Python3批量爬取网页图片

    所谓爬取其实就是获取链接的内容保存到本地.所以爬之前需要先知道要爬的链接是什么. 要爬取的页面是这个:http://findicons.com/pack/2787/beautiful_flat_ico ...

  4. 使用Python批量爬取美女图片

    运行截图 实列代码: from bs4 import BeautifulSoup import requests,re,os headers = { 'User-Agent': 'Mozilla/5. ...

  5. 使用ajax爬取网站图片()

    以下内容转载自:https://www.makcyun.top/web_scraping_withpython4.html 文章关于网站使用Ajaxj技术加载页面数据,进行爬取讲的很详细 大致步骤如下 ...

  6. Day11 (黑客成长日记) 爬取网站图片

    #导入第三方库# coding:utf-8import requests,re #找到需要爬取的网站'http://www.qqjia.com/sucai/sucai1210.htm' #1>获 ...

  7. 使用python来批量抓取网站图片

    今天"无意"看美女无意溜达到一个网站,发现妹子多多,但是可恨一个page只显示一张或两张图片,家里WiFi也难用,于是发挥"程序猿"的本色,写个小脚本,把图片扒 ...

  8. webmagic 二次开发爬虫 爬取网站图片

    webmagic的是一个无须配置.便于二次开发的爬虫框架,它提供简单灵活的API,只需少量代码即可实现一个爬虫. webmagic介绍 编写一个简单的爬虫 webmagic的使用文档:http://w ...

  9. 使用Jsoup爬取网站图片

    package com.test.pic.crawler; import java.io.File; import java.io.FileOutputStream; import java.io.I ...

随机推荐

  1. centos下网络的配置

    1.网络模式要进行使用NAT,要连网的话,要配置好设置:网络要进行一下共享到虚拟机 进入vi /etc/sysconfig/network-scripts/ifcfg-eth0   把里面的onboo ...

  2. 学习Layui 第一天

    Layui 官网说这是款经典模块化前端框架 个人觉得Layui很好用,容易上手. 在学习Layui的之前.先去官网下载必要的文件 将这些文件放入项目当中 然后可以到官网看一下示例. 可以做一个简单的表 ...

  3. python_方法说明

    方法用来描述对象所具有的行为,例如,列表对象的追加元素.插入元素.删除原宿.排序,字符串对象的分隔.连接.排版.替换.烤箱的温度设置.烘烤,等等 在类中定义的方法可以粗略分为四大类:公有方法.私有方法 ...

  4. [译文]Domain Driven Design Reference(三)—— 模型驱动设计的构建模块

    本书是Eric Evans对他自己写的<领域驱动设计-软件核心复杂性应对之道>的一本字典式的参考书,可用于快速查找<领域驱动设计>中的诸多概念及其简明解释. 其它本系列其它文章 ...

  5. cas 4.1.4单点登录实战

    使用工具 maven-3.3.9 cas-4.1.4 Tomcat-7.0.57-win-x64 cas-sample-Java-webapp 一.Hello cas 1.下载Tomcat,解压:修改 ...

  6. Python基本类常用方法

    数学函数 abs(x) 返回数字的绝对值,如abs(-10) 返回 10 ceil(x) 返回数字的上入整数,如math.ceil(4.1) 返回 5 cmp(x, y)如果 x < y 返回 ...

  7. AWS的区域和可用区概念解释

    AWS的每个区域一般由多个可用区(AZ)组成,而一个可用区一般是由多个数据中心组成.AWS引入可用区设计主要是为了提升用户应用程序的高可用性.因为可用区与可用区之间在设计上是相互独立的,也就是说它们会 ...

  8. 使用Map标签指定点击区域时的兼容性问题

    电商m站的首页,有一个需求是配一张大的banner图,然后指定某些区域是热区,点击之后跳转到不同的活动页. 听起来简单明了,实现也比较容易,立刻就想起来有个map标签,简直就是为这个需求量身定做. 简 ...

  9. 微机原理基础(五)—— MSP430

    一.MSP430组成 1.结构简图 2.具体组成框图

  10. java 基础之 反射技术

    1. java代码 在 java 语言中最核心的就是代码的运行, 按照面向对象的思想,在调用java代码时往往需要先创建对象,再调用方法, 而写在方法中的即所谓的java 代码 一段java代码在程序 ...