Selenium + C# 实现模拟百度贴吧签到 1
代码直通车
Github FoxCrawler项目下的SeleniumClawer解决方案
工具介绍
Selenium:是一个自动化测试工具,封装了很多WebDriver用于跟浏览器内核通讯,我用开发语言来调用它实现PhantomJS的自动化操作。它的下载页面里有很多东西,我们只需要Selenium Client,它支持了很多语言(C#、JAVA、Ruby、Python、NodeJS),按自己所学语言下载即可。
下载地址:http://docs.seleniumhq.org/download/
Nuget 使用
Selenium的好处
Selenuim的好处是显而易见的,当我们爬取网站信息时候,难免会碰到异步加载,数据延时绑定,数据接口定位难,加密信息解码难等问题。其实最终数据都会完整的显示在界面上,既然数据能够显示出来,使用Selenium操控WebDriver进行模拟浏览器行为(点击,切换,移动)等等事件,等待数据显示,然后使用选择器(Id,Class,XPath等)进行爬取,这是一种符合人习惯的编程方式。当然我也不是说其他的方式不好,只是在同等时间的情况下,这种方式效率更高,耗时更快,可靠性也更高。
下面使用Selenium进行一个简单的百度贴吧一键签到功能编码
项目创建,环境配置
打开Vs,新建控制台项目,使用Nuget获取最新Selenium的C#库,然后根据自己机型安装的浏览器选择WebDirver(有点类似运行时打开的模拟浏览器,不过时单独的一个.exe文件,首先你电脑要安装这个浏览器),我以自己的电脑Chrome浏览器为例子,所以我Nuget下载一个
下载完成后在项目根目录的packages文件夹中找到对应内容
根据系统类型,系统是32还是64自行选择
复制.exe文件到项目Bin文件夹下即可,环境配置完成
先来一下简单例子
在完成一键签到功能之前,我们先来完成一个简单的例子,这样能让大家对这种方式有一个基本的了解
我的例子选取的是某学校的通知公告数据爬取,进行一般爬虫和Selenium爬取的区别
爬取地址
http://www.jit.edu.cn/myNews_list_out.aspx?infotype=1
普通方式爬取
我们首先要分析如何获取数据,当我们点击下一页的时候,我们发现页面整体刷新,且地址栏没有发生变化,通过分析Respons信息我们发现IIS字样,这样可以推定使用的技术是.net webform 自带的gridview服务端控件,这种方式自带了加密验证,破解的方式网上有,就是要获取每次页面生成的加密码,然后带上其他参数向后台重新发起请求。
缺点:
如果使用这种方式,当我们碰到不同的问题,需要根据不同的问题寻找解决方案,测试可行然后再进行编码,要花多的时间在一个一个没有接触过的问题身上。
Selenium 模拟爬取
这种方式就相对简单,也很好理解。编码的逻辑就是如下
1、打开网页
2、找到下一页按钮
3、模拟点击
4、数据获取
这样的方式就和我们使用浏览器操作习惯一置,逻辑也更加清楚。
接下去我就基于这一种方法,对代码进行说明
打开网页
var docHtml = new HtmlDocument(); var driver = new ChromeDriver(); driver.Navigate().GoToUrl("http://www.jit.edu.cn/myNews_list_out.aspx?infotype=1");
业务逻辑
代码简单明了,爬取当页数据,然后找到下一页按扭,如果存在点击,如何不存在,退出循环
bool nextpage = true; do { ReadOnlyCollection<IWebElement> newsNodes = driver.FindElements(By.XPath("//*[@id=\"table_list\"]/li/a")); //获取li内容 GetNewList(newsNodes);//获得新闻内容 docHtml.LoadHtml(driver.PageSource); //找到下一页按钮 HtmlNode node = docHtml.GetElementbyId("nextpage"); IWebElement element = null; if (node != null) { element = driver.FindElementById("nextpage"); } else { nextpage = false; } //如果存在下一页按钮,模拟点击 if (nextpage) { element.Click(); } } while (nextpage);
获取新闻内容
private static List<NewInfo> GetNewList(ReadOnlyCollection<IWebElement> newsNodes) { List<NewInfo> newInfoList = new List<NewInfo>(); foreach (var news in newsNodes) { newInfoList.Add(new NewInfo() { Url = news.GetAttribute("href"), Title = news.Text }); Console.WriteLine($"{news.Text} {news.GetAttribute("href")}"); } return newInfoList; }
好处:
1、代码简单明了
2、逻辑清晰
3、后期维护方便
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Mac上使用Jenv管理多个JDK版本
使用Java时会接触到不同的版本。大多数时候我在使用Java 8,但是因为某些框架或是工具的要求,这时不得不让Java 7上前线。一般情况下是配置JAVA_HOME,指定不同的Java版本,但是这需要人为手动的输入。如果又要选择其他版本,就需要对JAVA_HOME重新进行设置。终于,我发现了JEnv。 正如它的官网所宣称的那样,它是来让你忘记怎么配置JAVA_HOME环境变量的神队友。使用简单的命令就可以在不同的Java版本之间进行切换。如果你使用过rbenv,你会发现JEnv就如同rbenv的Java版一样。 基本使用: 在Mac OS下使用Homebrew安装JEnv: > brew install jenv 安装成功后需要进行一下简单的配置,让它可以起作用: > echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.bash_profile > echo 'eval "$(jenv init -)"' >> ~/.bash_profile 好了,JEnv已经安装好了,让我们来看一下它找见哪个Ja...
- 下一篇
Java 多线程
多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的。 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程各重要知识点。掌握了上图中的各知识点,Java中的多线程也就基本上掌握了。主要包括: Java线程具有五中基本状态 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread(); 就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了t.start()此线程立即就会执行; 运行状态(Running):当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。注:就 绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中; 阻塞状态(Blocked):处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8编译安装MySQL8.0.19
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,7,8上安装Nginx,支持https2.0的开启