用C#爬虫小说网站

摘要:

最近学习爬虫,做了个简单能实现爬取小说网站整页小说功能的DEMO

主要实现逻辑:“套娃”通过MyWebClient获取小说网站页面内所有小说的网络地址,然后通过网络地址找到每本小说的单独的网络地址,然后再通过每本小说的网络地址 找到小说章节正文的网络地址,最后通过章节地址获取到章节内容,最最后将章节内容整合起来的到整本小说。

 

 

简单说说实现功能的部分程序内容:

1、使用MyWebClient对小说网站源代码进行获取

 WebClient MyWebClient = new WebClient();
                MyWebClient.Credentials = CredentialCache.DefaultCredentials;//获取或设置用于向Internet资源的请求进行身份验证的网络凭据
                Byte[] bookPageData = MyWebClient.DownloadData("http://www.ibiqu.org/xuanhuanxiaoshuo/");
                //string pageHtml_Unicode = Encoding.Unicode.GetString(pageData);
                string bookPageHtml_Default = Encoding.Default.GetString(bookPageData);

2、分析bookPageHtml_Default中获取到的网站页面源代码文本,从而用正则表达式获取所有小说的url、小说名

//获取当前页面所有书籍的url
                Regex regex_AllBookUrl = new Regex(@"/book/\d+/");
                MatchCollection bookMatch = regex_AllBookUrl.Matches(bookPageHtml_Default);
                foreach (Match m in bookMatch)
                {
                    allBookUrl.Add("http://www.ibiqu.org" + m.Value);
                }
                allBookUrl = allBookUrl.Distinct().ToList();//去除集合中重复的数据
                ibBookCount.Text = Convert.ToString(allBookUrl.Count);

3、用以上获取到的小说url,获取每本小说的章节地址url

 for (int i = 0; i < allBookUrl.Count; i++)
            {
                UpdataUIBCN(Convert.ToString(i));
                Byte[] sectionPageData = MyWebClient.DownloadData(allBookUrl[i]);
                string sectionPageHtml_Default = Encoding.Default.GetString(sectionPageData);
                //获取小说名
                Regex regex_AllBookName = new Regex(@"<h1>[\s\S]+</h1>");
                MatchCollection bookMatch = regex_AllBookName.Matches(sectionPageHtml_Default);
                foreach (Match a in bookMatch)
                {
                    bookName = GetChinese(a.Value);
                    UpdataUIBN(bookName);
                }

4、最后获取小说正文,并保存

//获取小说正文URL
                Regex regex_AllsectionUrl = new Regex(@"/book/\d+/\d+.htm");
                MatchCollection sectionMatch = regex_AllsectionUrl.Matches(sectionPageHtml_Default);
                foreach (Match m in sectionMatch)
                {
                    allSectionUrl.Add("http://www.ibiqu.org" + m.Value);
                }
                allSectionUrl = allSectionUrl.Distinct().ToList();//去除集合中重复的数据
                UpdataUISC(Convert.ToString(allSectionUrl.Count));
                for (int ii = 0; ii < allSectionUrl.Count; ii++)
                {
                    UpdataUISCN(Convert.ToString(ii));
                    Byte[] txtPageData = MyWebClient.DownloadData(allSectionUrl[ii]);
                    string txtPageHtml_Default = Encoding.Default.GetString(txtPageData);
                    Regex regex_AllTxt_ZW = new Regex(@"[\uff01\u3002\uff1b\uff0c\uff1a\u201c\u201d\uff08\uff09\u3001\uff1f\u300a\u300b\u4e00-\u9fa5]+");
                    Regex regex_AllTxt_ZE = new Regex(@"[0-9\uff01\u3002\uff1b\uff0c\uff1a\u201c\u201d\uff08\uff09\u3001\uff1f\u300a\u300b\u4e00-\u9fa5]+");
                    Regex regex_AllTxt = new Regex(@"id=[-,.?:;'""!']{1}content[-,.?:;'""!']{1}[\s\S]+id=[-,.?:;'""!']{1}cbad[-,.?:;'""!']{1}");
                    Regex regex_AllSectionName = new Regex(@"<h1>[\s\S]+</h1>");
                    MatchCollection txtMatch = regex_AllTxt.Matches(txtPageHtml_Default);
                    MatchCollection sectionNameMatch = regex_AllSectionName.Matches(txtPageHtml_Default);
                    //ibSectionCount.Text = Convert.ToString(sectionNameMatch.Count);
                    string sectiontxt = "";
                    string sectionName = "";
                    foreach (Match q in sectionNameMatch)
                    {
                        sectionName = GetChinese(q.Value);
                    }
                    foreach (Match mm in txtMatch)
                    {
                        MatchCollection txtMatch_ZW = regex_AllTxt_ZW.Matches(mm.Value);
                        foreach (Match tt in txtMatch_ZW)
                        {
                            sectiontxt = sectiontxt + tt;
                        }
                    }
                    StreamWriter sw = new StreamWriter("C:\\Users\\User\\Desktop\\文本\\" + bookName + ".txt", true, Encoding.UTF8);
                    sw.WriteLine("\r\n" + sectionName + "\r\n" + sectiontxt);
                    sw.Flush();
                    sw.Close();
                }

结语:作为一名初级程序员,可能用到的技术太落后,希望有大佬能在评论里再指点指点,谢谢。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于使用C#来编写爬虫并抓取网站后台数据,您可以借助一些库和框架来实现。以下是一个基本的步骤指南: 1. 首先,您需要使用C#的网络请求库,例如HttpClient,来发送HTTP请求到目标网站。您可以使用GET或POST方法发送请求,并传递必要的参数。 2. 接下来,您可以使用HTML解析库,例如HtmlAgilityPack,来解析网页内容。这样您可以提取出所需的数据,如文本、链接、表格等等。 3. 如果目标网站需要登录或进行身份验证,您可能需要模拟登录过程。通过发送POST请求,将用户名和密码等凭据提交给登录页面,并在后续请求中使用Cookie来维持登录状态。 4. 在获取到所需数据后,您可以将其保存到数据库中或进行进一步处理和分析。您可以使用C#的数据库访问库,如Entity Framework或SqlClient,来连接和操作数据库。 5. 最后,为了确保取过程的合法性和稳定性,建议添加适当的延时和错误处理机制。遵守网站的robots.txt文件中的规定,并设置合理的请求间隔,以免给目标网站造成过大的负担。 请注意,在进行网络爬虫时,应该遵守法律法规和网站的使用规则,确保以合法和道德的方式使用爬虫技术。此外,如果目标网站有反爬虫机制,您可能需要采取一些反反爬虫的策略来应对。 希望以上信息对您有所帮助!如果您有任何问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值