吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1989|回复: 32
收起左侧

[其他原创] C#下载小说源码分享

  [复制链接]
luxingyu329 发表于 2024-7-30 22:19
利用.net 下载小说的一个小程序,目的主要是学习,为了不被封,设置了每3秒下载一个章节,目前实现的功能,如果有需要的拿去。
本代码利用了HtmlAgilityPack 进行解析,是第三方库,需要NuGet安装或者引用DLL文件
安装HtmlAgilityPack

安装方法网上可以搜到
下面是代码:

[Asm] 纯文本查看 复制代码
using HtmlAgilityPack;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DownLoad88XiaoShuo
{
    public partial class FrmMain : Form
    {
        Thread thread;
        public FrmMain() {
            InitializeComponent();
            CheckForIllegalCrossThreadCalls = false;  //线程间操作无效的解决办法
        }
        /// <summary>
        /// 验证是不是正确的书箱地址
        /// </summary>
        /// <param name="txt">Url</param>
        /// <returns>返回是否符合 true or false</returns>
        public static bool IsHtml(string txt) {
            Regex regex = new Regex(@"^[url]https://www.88xiaoshuo.net/Partlist[/url](/[\d+./]*)$");
            return regex.IsMatch(txt);
        }

        private async Task DownLoadXiaoShuo88(string url) {
            btnStartDown.Enabled = false;
            string baseUrl = @"https://www.88xiaoshuo.net";
            //直接调用获取节点的方法Respose(url)
            HtmlNode htmlNode = GetDocument(url).DocumentNode;
            string title = htmlNode.SelectSingleNode("//div[@id='info']/a/h1").InnerText;
            //判断文件夹是否存在
            string downLoadPath = $@"{Environment.CurrentDirectory}\downLoad\{title.Trim()}\";
            //如果没有这个目录创建
            if (!Directory.Exists(downLoadPath)) {
                Directory.CreateDirectory(downLoadPath);
            }

            HtmlNodeCollection node = htmlNode.SelectNodes("//div[@id='list']/dl/dd/a");
            Dictionary<string, string> dict = new Dictionary<string, string>();
            int count = 0;
            foreach (var item in node) {

                count++;
                if (count < 13) continue;
                try {
                    dict.Add(item.InnerText, baseUrl + item.Attributes["href"].Value);
                    //break;
                    File.AppendAllText(downLoadPath + "/a_dict.txt", $"{item.InnerText.Trim()} ,{baseUrl + item.Attributes["href"].Value}{Environment.NewLine}");
                }
                catch (ArgumentException) {
                    File.AppendAllText(downLoadPath + "/a_log.txt", $"章节 {item.InnerText.Trim()}  ---> 出现重复{Environment.NewLine}");
                    btnStartDown.Enabled = true;
                    //throw;
                }
            }

            StringBuilder stringBuilder = new StringBuilder();
            int BarStart = 1;  //进度条初始数据
            prbDownLoad.Maximum = dict.Count; //设置进度条的最大值 
            foreach (var item in dict) {
                prbDownLoad.Value = BarStart++;
                string saveFile = $@"{downLoadPath}{item.Key.Trim()}.txt";
                if (File.Exists(saveFile)) continue; // 如果文件存在了就跳过
                HtmlNodeCollection content = GetDocument(item.Value).DocumentNode.SelectNodes("//div[@id='content']/p");
                foreach (var _content in content) {
                    stringBuilder.Append(_content.InnerText.Trim());
                    stringBuilder.Append(Environment.NewLine);
                }
                File.WriteAllText(saveFile, stringBuilder.ToString());
                stringBuilder.Clear();
                await Task.Delay(3001);
                //if (BarStart - 1 != dict.Count) {
                //    textBox1.AppendText($"第 {BarStart - 1} 章下载完成, 还有 {dict.Count - BarStart + 2} 章没有下载,请耐心等待......{Environment.NewLine}");
                //}
                //else {
                //    textBox1.AppendText($"{dict.Count} 章已经全部下载完成{Environment.NewLine}");
                //}
            }
            btnStartDown.Enabled = true;
            MessageBox.Show("下载结束......");
        }

        /// <summary>
        /// 获取网页的节点
        /// </summary>
        /// <param name="url">网址</param>
        /// <returns>Node节点</returns>
        private HtmlAgilityPack.HtmlDocument GetDocument(string url) {
            HtmlWeb htmlWeb = new HtmlWeb();
            // 设置请求的User-Agent头,模拟浏览器访问
            htmlWeb.PreRequest += handler;
            HtmlAgilityPack.HtmlDocument document = new HtmlAgilityPack.HtmlDocument();
            document = htmlWeb.Load(url);
            return document;
        }

        /// <summary>
        /// 设置请求头等相关信息,比如cookie  userAgent
        /// </summary>
        HtmlWeb.PreRequestHandler handler = delegate (HttpWebRequest request) {         
            request.CookieContainer = new CookieContainer();
            request.UserAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36";

            return true;
        };

        private void btnQuit_Click(object sender, EventArgs e) {
            Application.Exit(); 
        }

        private void btnStartDown_Click(object sender, EventArgs e) {
            string Default_url = @"https://www.88xiaoshuo.net/Partlist/314179/";  //梦源头  24章节
            //string url = @"https://www.88xiaoshuo.net/Partlist/308159/";  
            //string url = @"https://www.88xiaoshuo.net/Partlist/316967/";   //末世?干自己的  19章节
            //string url = @"https://www.88xiaoshuo.net/Partlist/44592/";  //190章节   猎艳江湖
            //115章节   六零年,穿成了心机女主的垫脚石
            //string url = @"https://www.88xiaoshuo.net/Partlist/87285/";  
            //string url = @"https://www.88xiaoshuo.net/Partlist/50408/"; //瑜伽老师花样多 206章节
            //string url = @"https://www.88xiaoshuo.net/Partlist/312709/"; //玄幻:再见乔峰 178章节


            //利用正则验证网址 如果文本框中的地址正确那么文本框里面的,否则 默认下载地址
            string url = IsHtml(txtUrl.Text.Trim()) ? txtUrl.Text.Trim() : Default_url;

            thread = new Thread(async () => await DownLoadXiaoShuo88(url));
            thread.Start();

            // 等待线程结束
            thread.Join();
        }
    }
}


打包源码下载地址:  https://luxingyu329.lanzoue.com/i1uuE2605gsd
打包成品下载地址:  https://luxingyu329.lanzoue.com/iVd7P2606lab
20171026124038376.png

免费评分

参与人数 12吾爱币 +17 热心值 +12 收起 理由
tanlini + 1 + 1 学习学习。
蛋蛋侠 + 1 + 1 谢谢@Thanks!
xyj152 + 1 + 1 谢谢@Thanks!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
huang0817 + 1 + 1 感谢分享,下载下来学习一下。
MargaretTOTO + 1 + 1 用心讨论,共获提升!
chinawolf2000 + 1 + 1 热心回复!
apull + 1 + 1 谢谢@Thanks!
PastorBonus + 1 + 1 谢谢@Thanks!
360NENZ + 1 + 1 谢谢@Thanks!
strive9930 + 1 热心回复!
zhanglei1371 + 1 + 1 用心讨论,共获提升!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| luxingyu329 发表于 2024-7-31 08:19

有成品,小说的网址输入进文件框点开始下载就可以了,然后在软件目录下有一个DownLoad文件夹,里面就是下载的小说章节,文本框中的地址,可以进入网站找到
wfghim 发表于 2024-7-31 10:28
站内也有个多线程下载小说的,参考下【https://www.52pojie.cn/forum.php?mod=viewthread&tid=1710853&highlight=C%23%2B7.0】
360NENZ 发表于 2024-7-30 23:57
PastorBonus 发表于 2024-7-31 00:08
好好好,有用的
apull 发表于 2024-7-31 00:42
很不错,学习下。
52PJ070 发表于 2024-7-31 00:43
学习了,谢谢楼主分享!
sdking 发表于 2024-7-31 00:45
感谢分享
MargaretTOTO 发表于 2024-7-31 01:00
学习了,谢谢楼主。
1610453925 发表于 2024-7-31 01:40
大佬牛,感谢大佬分享
破凤凰 发表于 2024-7-31 06:53
感谢大佬分享。
头上有奇角 发表于 2024-7-31 07:21
感谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-15 11:46

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表