Selenium + C# 实现模拟百度贴吧签到 1
代码直通车
Github FoxCrawler项目下的SeleniumClawer解决方案
工具介绍
Selenium:是一个自动化测试工具,封装了很多WebDriver用于跟浏览器内核通讯,我用开发语言来调用它实现PhantomJS的自动化操作。它的下载页面里有很多东西,我们只需要Selenium Client,它支持了很多语言(C#、JAVA、Ruby、Python、NodeJS),按自己所学语言下载即可。
下载地址:http://docs.seleniumhq.org/download/
Nuget 使用
image.png
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、后期维护方便
Selenium + C# 实现模拟百度贴吧签到 1相关推荐
- python 在软件自己自动输入-Python模拟百度自动输入搜索功能的实例
如下所示: # 访问百度,模拟自动输入搜索 # 代码中引入selenium版本为:3.4.3 # 通过Chrom浏览器访问发起请求 # Chrom版本:59 ,chromdriver:2.3 # 需要 ...
- chrome frame节点 取_爬虫3-下(利用Selenium + Chrome Driver模拟用户操作浏览器)
一.前言 前面利用request的方法爬取页面数据的操作,今天用另外一种方法:利用Selenium + Chrome Driver模拟用户操作浏览器,来爬取数据. 在此之前需要做一些准备工作:安装se ...
- 孤荷凌寒自学python第八十五天配置selenium并进行模拟浏览器操作1
孤荷凌寒自学python第八十五天配置selenium并进行模拟浏览器操作1 (完整学习过程屏幕记录视频地址在文末) 要模拟进行浏览器操作,只用requests是不行的,因此今天了解到有专门的解决方案 ...
- Java Selenium简单浏览器模拟
Java Selenium简单浏览器模拟 模拟登陆QQ邮箱为例 Maven中pom.xml配置: <?xml version="1.0" encoding="UTF ...
- 360浏览器模拟百度搜索引擎蜘蛛访问
一般用在网站被挂马以后,直接访问没有问题,可以通过模拟百度或其他搜索引擎来访问,即可发现问题.比如下面的例子,直接访问没问题,使用模拟搜索引擎访问即可发现问题. 比如访问一个针对搜索引擎挂马的网页:h ...
- java怎样模拟点击网页,笔者操作Java+selenium实现网站模拟点击和页面数据爬取
电脑现已成为我们工作.生活和娱乐必不可少的工具了,在使用电脑的过程中,可能会遇到Java+selenium实现网站模拟点击和页面数据爬取的问题,如果我们遇到了Java+selenium实现网站模拟点击 ...
- html 模拟百度和模拟360
百度搜索java的url https://www.baidu.com/s?wd=java &rsv_spt=1&rsv_iqid=0x9f31aa5c00116d2b&issp ...
- win爬取网址获取宵宫语音,使用python的selenium库来模拟点击
前言:经过大量的收集资料,发现因为seleuninm的更新,所有的教程都各不相同,因此自己花了半天时间学习了完整的一个爬取过程,并分享一个用Chrome爬取的示例. 一.环境准备 python> ...
- 如何邀请好友注册您的网站(模拟百度网盘)
花了一年时间做了个网盘下载站点,有兴趣的朋友可以看看站名:去转盘网 其中有个需求是想模拟百度网盘的邀请好友注册功能,想了很久果然 "皇天不负有心人" ,终于整理出个思路,并 ...
- php 模拟蜘蛛,PHP模拟百度蜘蛛,伪造IP爬行网站,附源代码
PHP模拟百度蜘蛛,伪造IP爬行网站,附源代码 // 关闭PHP报错 error_reporting( E_ALL^E_NOTICE^E_WARNING ); //实现使用curl模拟百度 蜘蛛进行采 ...
最新文章
- css层叠样式表(一)
- 洛谷P4216 [SCOI2015]情报传递(树剖+主席树)
- java字符串的替换replace、replaceAll、replaceFirst的区别
- linux tomcat 日志路径,linux日志文件在哪 linux安装tomcat
- 我----大抵是个废人
- POJ - 2411 Mondriaan's Dream(状压dp)
- MySQL与PostgreSQL:该选择哪个开源数据库?哪一个更好?
- Java快速开发平台——JEECG 3.7.8 版本发布!我们的目标是有鱼丸也有粗面
- 图解TCPIP-ICMP
- java抽象方法特点_java-抽象类的特点
- Django访问静态资源
- 新版PassXYZ已上线,新增一次性密码(OTP)管理功能
- Java static关键字与静态块
- Redis连接报错【redis.clients.jedis.exceptions.JedisDataException: ERR Client sent AUTH, but no password 】
- 关于盗墓笔记的那些事
- 越来越多的Java程序员转行Java大数据...
- arm开发板移植ALSA库与ALSA工具
- CentOS7系统下Java环境和tomcat的安装
- mysql gui vim_Vim 有什么奇技淫巧?
- Kaggle新赛:Lyft 自动驾驶运动预测,发布迄今最大预测任务数据集