前言
C#-Selenium爬虫抓取(一)
本文是对前文的一个完善,主要内容是通过Cookie跳过登录,并实现自动化信息抓取。
首先我们要去找到Cookie的地址,在地址栏输入 chrome://version/
其中的个人资料路径,去掉Default,就是我们的Cookie地址。
前端页面与逻辑设计
先简单画个界面,主要的设置分别为:URL、Cookie地址、Driver驱动地址(可见前文)、抓取目标、抓取结果保存地址。
逻辑设计上,我们通过Driver读取Cookie并直接打开到目标页面,直接开始元素信息抓取,如有需要则自动翻页抓取。
在这里的设计主要是针对一些反爬机制的处理:
1.需要登录验证
2.翻页时URL不变
3.从初始页面到目标页面过于复杂
代码块分析
变量:
public static string adressofprofile;//cookie缓存地址
public static string adressofdriver;//驱动地址
public static string saveadress;//保存地址(txt)
public static string PageNext;//点击下一页的元素Id名
public static string searchname;//搜索元素名
public static int page;//需要抓取内容的页码量
为驱动加载cookie跳过登录:
string headofprofile = "--user-data-dir=";
string profile_directory = headofprofile + adressofprofile;
ChromeOptions options = new ChromeOptions();
options.AddArguments(profile_directory);
页面翻查搜索(根据元素名查找)并保存内容:
for (int j = 0; j <= page; j++)
{
Thread.Sleep(2000);
try
{
for (int i = 0; i < 1000; i++)
{
str = driver.FindElementsByClassName(searchname)[i].Text;
using (StreamWriter writer = new StreamWriter(saveadress, true))
{
writer.WriteLine(str);
}
}
}
catch { }
driver.FindElementById("PageNext").Click();
}
实例测试
我们随便找个网站做一个简单的测试:
1.人工检查网页信息
2.输入参数开启程序,可以看到自动操控扫描过程
3.抓取结果:
完整代码
public void GetHtml(string url)
{
PhantomJSDriverService driverService = PhantomJSDriverService.CreateDefaultService();
driverService.IgnoreSslErrors = true;
string headofprofile = "--user-data-dir=";
string profile_directory = headofprofile + adressofprofile;
ChromeOptions options = new ChromeOptions();
options.AddArguments(profile_directory);
string str;
List<String> tagNmaeList = new List<string>();
using (driver = new ChromeDriver(adressofdriver, options, TimeSpan.FromSeconds(120)))
{
try
{
driver.Manage().Window.Maximize();
driver.Navigate().GoToUrl(url);
Thread.Sleep(5000);
for (int j = 0; j < page; j++)
{
Thread.Sleep(2000);
try
{
for (int i = 0; i < 1000; i++)
{
str = driver.FindElementsByClassName(searchname)[i].Text;
using (StreamWriter writer = new StreamWriter(saveadress, true))
{
writer.WriteLine(str);
}
}
}
catch { }
driver.FindElementById(PageNext).Click();
}
}
catch (NoSuchElementException)
{
Console.WriteLine("找不到该元素"); ;
}
}
}
注意前后文,经测试直接使用没问题。可以按自己的需要做一些补充,同时建议把所有前端textbox块,用config自动保存。
注意事项:测试时把浏览器关闭,避免占用。