第二把 使用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#的啊,哎 如果出了的话,在评论区吼一声 我去整个