c#使用Selenium爬小说

第二把 使用Selenium来爬取小说


前言

上一篇中提到了有些网站有反爬措施,直接用HttpWebRequest不得行,要直接给你返回个超时或者别的错误。所以现在我用Selenium(伪装我是浏览器),这个方法只要不是特别严格的,都能爬,嘿嘿

一、Selenium安装步骤

1.查看自己的浏览器版本

例如我的: 打开浏览器(edge)→点三个点→设置→关于 Microsoft Edge
在这里插入图片描述

2.下载Selenium WebDriver和浏览器对应的Selenium驱动

Selenium.WebDriver(这个下最新的就行)
Selenium WebDriver.MSEdgeDriver(这个要和上个步骤的版本对应)
在这里插入图片描述

二、代码

界面和上一次的一模一样
界面代码 就一个框 外加个按钮
在这里插入图片描述

代码如下(示例):

  private void Button_Click(object sender, RoutedEventArgs e)
  {
      EdgeDriverService service = EdgeDriverService.CreateDefaultService(@".", "msedgedriver.exe");
      EdgeOptions options = new EdgeOptions();

      //隐藏黑色CMD窗口
      service.HideCommandPromptWindow = true;

      //不显示浏览器
      options.AddArgument("--headless");

      EdgeDriver driver = new EdgeDriver(service, options);

      string url = urlTb.Text;
      int i = 0;
      bool read = true;
      Task.Run(() =>
      {
          while (read)
          {
              Thread.Sleep(100);
              try
              {
                  #region 读取网页
                  driver.Navigate().GoToUrl(url);
                  #endregion

                  //标题
                  IWebElement h1Element = driver.FindElement(By.CssSelector(".bookname > h1"));
                  string title =  h1Element.Text;

                  //内容
                  IWebElement contentele = driver.FindElement(By.Id("content"));
                  ReadOnlyCollection<IWebElement> allLines = contentele.FindElements(By.TagName("p"));
                  List<string> lines = new List<string>();
                  foreach (var line in allLines)
                  {
                      string lineText = line.Text;
                      lines.Add(lineText);
                  }

                  //下一个 最后一章会没下一章 这里会找不到 出异常
                  IWebElement element = driver.FindElement(By.LinkText("下一章"));
                  string hrefValue = element.GetAttribute("href");
                  url = hrefValue;

                  //拼接和保存
                  string novelContent = $"\r\n{title}\r\n\r\n{string.Join("\r\n\r\n", lines)}";

                  string outputPath = "自己写目录啊亲\\自己写名字啊.txt";
                  StreamWriter sw = new StreamWriter(outputPath, true);
                  sw.WriteLine(novelContent);
                  sw.Close();

                  i++;
                  this.Dispatcher.Invoke(new Action(() =>
                  {
                      infoTb.Text = i.ToString();
                  }));
              }
              catch (Exception ex)
              {
                  this.Dispatcher.Invoke(new Action(() =>
                  {
                      this.infoTb.Text += $"错误:{ex}";
                      this.urlTb.Text = url;
                  }));
                  read = false; //错了打印错误并退出
                  //错了等几秒再来
                  //Thread.Sleep(3000);
              }
          }
      });
  }

总结

有啥爬虫需求的可以私信我,嘿嘿(打广告啊)
使用这个方法呢,有的网站是不给爬的(高端反爬啊,低端反爬的这个能爬的)
下一章、小说内容、标题只针对例子上的网站,你们要爬其他的得自己看看网页结构重写哈(可能都差不多吧,得试试,如果你用例子上的那个那可以直接用哈)
据说有更好的工具DrissionPage,但是他没出c#的啊,哎 如果出了的话,在评论区吼一声 我去整个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值