DotnetSpider爬虫图文日记--小说下载(C#,dotnetcore)

项目简介:

需求:爬取网页所有的“玄幻”类型小说。

系统:Windows10

工具:Visual Studio Code

环境:.NET Core 2.1

爬虫库:DotnetSpider

开始之前:

下载书的部分,用到了Python,因为我不知道如何在C#中操作。谢谢!

一:创建项目

在指定目录,创建 DotnetCore Console 程序,并使用 VSCode(Visual Studio Code 后面都使用简称) 打开此项目。

# 右下角,提示选择 YES。

添加 DotnetSpider 的库。点击:视图--终端,或者按 CTRL+(TAB上面那个键),输入:dotnet add package DotnetSpider.Core --version 2.6.0-beta5。安装完成后,会提示,还原项目,点击。



二:编辑 Program.cs

using System;

using System.Collections.Generic;

using System.IO;

using System.Text.RegularExpressions;

using DotnetSpider.Core;

using DotnetSpider.Core.Downloader;

using DotnetSpider.Core.Pipeline;

using DotnetSpider.Core.Processor;

using DotnetSpider.Core.Scheduler;

using DotnetSpider.Core.Selector;

namespace SpiderFiction

{

    class Program

    {

        static void Main(string[] args)

        {

            CostomPageProcessorAndPipeline();

            Console.WriteLine("下载完毕!!!按任意键退出!!!");

            Console.Read();

        }

        private static void CostomPageProcessorAndPipeline()

        {

            // 玄幻小说的首页网址

            string url = "http://www.jjxsw.com/e/action/ListInfo.php?page=0&classid=11&line=10&tempid=3&ph=1&andor=and&qujian=4&orderby=2&myorder=0&totalnum=150";

            Site site = new Site { CycleRetryTimes = 3, SleepTime = 300 };

            site.AddStartUrl(url);

            // 使用 PageProcessor和 Scheduler创建一个爬行器。添加数据处理管道

            Spider spider = Spider.Create(site, new QueueDuplicateRemovedScheduler(), new FictionPageProcessor()).AddPipeline(new FictionPipeline());

            // 爬虫下载器

            spider.Downloader = new HttpClientDownloader();

            // 爬虫的线程数

            spider.ThreadNum = 4;

            // 当没有其它链接请求时,爬虫的退出时间

            spider.EmptySleepTime = 2000;

            // 启动爬虫

            spider.Run();

        }

    }

    ///

    /// 对获取到的网页,进行解析,解析到的数据,将传到 Pipeline 中,进行处理

    ///

    internal class FictionPageProcessor:BasePageProcessor

    {

        protected override void Handle(Page page)

        {

            // 获取当前页面中,所有的小说: 标签的列表

            var totalFictionElements = page.Selectable.XPath("//div[@class=\"listbg\"]/a[1]").Nodes();

            // 创建小说类,列表。

            List results = new List();

            string reurl = "";

            foreach (var fictionElement in totalFictionElements)

            {

                var fiction = new Fiction();

                // 得到小说页面的链接

                reurl = fictionElement.Select(Selectors.XPath("@href")).GetValue();

                // 通过 ReURL 将小说页面的链接,替换为 下载页面的链接

                fiction.Url = ReURL(reurl);

                results.Add(fiction);

            }

            // 小说保存到页面的结果中

            page.AddResultItem("FictionResult", results);

            // 实现翻面效果,获取后面的页面

            foreach (var url in page.Selectable.XPath("//div[@class=\"pager\"]/ul").Links().Nodes())

            {

                // 得到的链接包含多余的字符,将其替换掉

                string u = replace(url.GetValue());

                // 将解析到的后续页面,添加到目标请求中,这将会遍历所有的页面

                page.AddTargetRequest(new Request(u, null));

            }

        }

        ///

        /// 替换多余的字符

        ///

        /// 需要修改的字符串

        /// 可以正常访问的链接

        private string replace(string v) => v.Replace("amp;", "");

        ///

        /// 修改 URL

        ///

        /// 小说页面的 URL 例:http://www.jjxsw.com/txt/26697.htm

        /// 小说下载页面的 URL 例:http://www.jjxsw.com/txt/dl-11-26697.html

        private string ReURL(string reurl)

        {

            string url = reurl + "l"; // 获取到的链接少了一个 "L"

            string pattern = "\\d+";

            string replace = "dl-11-" + Path.GetFileNameWithoutExtension(url);

            return Regex.Replace(url, pattern, replace);

        }

    }

    ///

    /// 小说对象

    ///

    internal class Fiction

    {

        ///

        /// 保存小说下载地址的 URL

        ///

        public string Url{get;set;}

    }

    ///

    /// 对 PageProcessor 解析到的页面数据,进行处理

    ///

    internal class FictionPipeline : BasePipeline

    {

        ///

        /// 保存所有小说,下载页面的 URL

        /// 例:例:http://www.jjxsw.com/txt/dl-11-26697.html

        ///

        List urlList = new List();

        public override void Process(IEnumerable resultItems, ISpider spider)

        {

            foreach (var resultItem in resultItems)

            {


                foreach (Fiction entry in resultItem.Results["FictionResult"])

                {

                    // 所有的小说,下载页面的 URL

                    urlList.Add(entry.Url);

                }

            }

            // 下载小说类,得到所有小说的下载链接 URL

            DownFiction df = new DownFiction(urlList);

            df.Run();

        }

    }

}


三:添加 DownFiction 类

using DotnetSpider.Core;

using DotnetSpider.Core.Downloader;

using DotnetSpider.Core.Pipeline;

using DotnetSpider.Core.Processor;

using DotnetSpider.Core.Scheduler;

using System;

using System.Collections.Generic;

using System.IO;

namespace SpiderFiction

{

    ///

    /// 获取所有小说的下载链接

    /// 例如:http://www.jjxsw.com/e/DownSys/doaction.php?enews=DownSoft&classid=11&id=26697&pathid=0&pass=ee247a67a5adcf1dfb1abecbd1ff5635&p=:::

    ///

    class DownFiction

    {

        ///

        /// 小说下载页面的连接

        /// 例:http://www.jjxsw.com/txt/dl-11-26697.html

        ///

        private List urlList;

        public DownFiction(List urlList)

        {

            this.urlList = urlList;


        }

        ///

        /// 页面解析:获取小说下载连接,并写入本地文件

        ///

        internal void Run()

        {

            XpathFiction(urlList);

            DownFictionPipeline df = new DownFictionPipeline();

            // 没有直接下载,而是存入文件,因为我不知道,如何在 C# 中,解析那样的网址

            df.WriteToFile();

        }

        ///

        /// 创建站点信息、爬虫

        ///

        ///

        private void XpathFiction(List urlList)

        {

            Site site = new Site { CycleRetryTimes = 3, SleepTime = 300 };

            site.AddStartUrls(urlList);

            Spider spider = Spider.Create(site, new QueueDuplicateRemovedScheduler(), new DownFictionPageProcessor()).AddPipeline(new DownFictionPipeline());

            spider.Downloader = new HttpClientDownloader();

            spider.ThreadNum = 4;

            spider.EmptySleepTime = 2000;

            spider.Run();

        }


    }

    ///

    /// 解析数据

    ///

    internal class DownFictionPageProcessor:BasePageProcessor

    {

        public DownFictionPageProcessor()

        {

        }

        protected override void Handle(Page page)

        {

            // 小说的下载链接:http://www.jjxsw.com/e/DownSys/doaction.php?enews=DownSoft&classid=11&id=26697&pathid=0&pass=ee247a67a5adcf1dfb1abecbd1ff5635&p=:::

            page.AddResultItem("url", page.Selectable.XPath("//a[@class=\"strong green\"][1]/@href").GetValue());

        }

    }

    internal class DownFictionPipeline : BasePipeline

    {

        private static List urls = new List();

        // 本地文本的位置

        private readonly string path = @"D:\ASP.NET Core\Book\URL.txt";

        public override void Process(IEnumerable resultItems, ISpider spider)

        {

            foreach (var result in resultItems)

            {

                // 将所有的链接,保存到 List 中

                urls.Add(result.Results["url"] as string);

            }

        }

      public void WriteToFile()

        {

            try

            {

                // 保存所有的链接到本地

                File.WriteAllLines(path, urls);

            }

            catch (Exception ee)

            {

                using (StreamWriter sw = new StreamWriter(@"D:\ASP.NET CORE\Book\log.txt",true))

                {

                    sw.WriteLine(ee.Message);

                }

            }

        }

    }

}


点击:视图--终端,或者按 CTRL+(TAB上面那个键),输入:dotnet run,执行程序。

程序会将,所有的小说链接,下载到本地。

由于我不知道,如何在 C# 中使用这些小说的下载链接,所以保存到了本地。

接下来,我将使用 Python ,解析这些链接,并下载小说保存到本地。

四:新建一个 Python 文件


文件正在下载,保存。

如果有人看到此文章,并有其它想法,欢迎指教,谢谢。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,650评论 18 139
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_X自主阅读 15,979评论 3 119
  • 当我们用vmvare安装完成centos6.5的时候,用root用户登录发现无网络连接。状态如下: 查资料发现这个...
    我最爱吃大西瓜了阅读 357评论 0 0
  • 早上出门,准备赶车去上班。院子外马路边,人行道上有一个熟悉的老太太。她是住在我们楼下的邻居,曾经在楼道里面,遇见过...
    阿牛_50f7阅读 405评论 0 0
  • 【书名】精进,如何成为一个很厉害的人 【作者】采铜 【金句】 知识创造的过程,其实是隐性知识和显性知识相互转化的过...
    必赢有话说阅读 544评论 18 9