C#使用Selenium实现QQ空间数据抓取 登陆QQ空间


经@吃西瓜的星星提醒
css

首先咱们介绍下Seleniumgit

Selenium也是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操做同样。支持的浏览器包括IE、Mozilla Firefox、Mozilla Suite等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否可以很好得工做在不一样浏览器和操做系统之上。测试系统功能——建立衰退测试检验软件功能和用户需求。支持自动录制动做和自动生成。Net、Java、Perl等不一样语言的测试脚本。Selenium 是ThoughtWorks专门为Web应用程序编写的一个验收测试工具。github

详细介绍点击这里浏览器

这里咱们就利用模拟真人操做,不会被TX和谐来进行访问和数据抓取app

这里用到的IDE是VS2017,系统Win10,浏览器驱动选择的是ChromeDriver工具

新建单元测试解决方案单元测试

安装Nuget包测试

我这里使用谷歌浏览器采集数据,因此就使用谷歌浏览器的驱动了,若是不喜欢谷歌浏览器的能够引用别的驱动程序包ui

命令 spa

Install-Package Selenium.WebDriver Install-Package Selenium.WebDriver.ChromeDriver

或者直接管理器安装 以下图

Selenium.WebDriver.ChromeDriver是在项目编译后将Chorme的驱动程序即ChormeDriver.exe程序复制到bin目录下,

NetCore则是复制到对应的netcoreappv文件目录下

这样基本引用就完成了,下面讲具体实现

首先建立一个测试类Qzone.cs,咱们后面全部调用都在测试类中测试和实现

public class QzoneTest { [Fact] public void QQLogin() { var driver = new ChromeDriver(); driver.Url = "https://qzone.qq.com/"; driver.Quit(); } }

由于是xUnit测试类,因此能够直接右键调试测试,运行起来能够看到下图

驱动程序会自动打开Chrome浏览器,而且调转到指定的页面.

空间页面已经打开了,下面就是登陆步骤了

登陆有两种方法,也是QQ本身提供的

第一种 若是有已经登录的QQ,直接点击头像就能够登陆

第二种 输入帐号密码登陆

下面咱们来详细介绍

先说第二种,第一种比较简单,第二种学会以后,第一种就so easy了

咱们须要找到文本框 输入帐号和密码

这里咱们就用到了Selenium查找元素的方法了

这里给咱们提供了不少查找元素的方法,根据名字咱们就能明白它的意思

var driver = new ChromeDriver(); driver.FindElement(); driver.FindElementByClassName(); driver.FindElementByCssSelector(); driver.FindElementById(); driver.FindElementByName(); driver.FindElementByTagName(); driver.FindElementByXPath()

咱们使用ByXPath方法来查找元素,XPath的详细介绍能够自行了解下,我这里只给你们介绍如何快速查找XPath

刚才打开的空间地址,找到文本框,而后检查元素,右侧元素位置右键->Copy->Copy XPath

能够获得这样一个地址 

//*[@id="u"]

一样的方法找到密码框

//*[@id="p"]

经过这个xpath咱们能够找到用户名的xpath路径,而后在程序里面这样写

try { var userName = driver.FindElementByXPath("//*[@id='u']"); //这里的userName就是用户名的文本框 //设置用户名的值
                userName.SendKeys("123456"); var pwd = driver.FindElementByXPath("//*[@id='p']"); pwd.SendKeys("********"); } finally { driver.Quit(); }

运行后出现异常

 

 

不要慌,这个是由于浏览器驱动没有找到元素致使的,咱们来仔细检查一下

原来文本框是嵌套在一个Iframe中的,怪不得当前驱动程序没法找到元素,由于当前驱动只会找到当前链接下的元素,嵌套元素不包含在内

那么咱们就用到了切换语法

try { //切换语法有两种,一种是根据索引切换,另一种根据iframe名称切换 //这里咱们使用name切换
                ITargetLocator tagetLocator = driver.SwitchTo(); //tagetLocator.Frame(1); //frame index.
                tagetLocator.Frame("login_frame");  //frame frame name.

                var userName = driver.FindElementByXPath("//*[@id='u']"); //这里的userName就是用户名的文本框 //设置用户名的值
                userName.SendKeys("123456"); var pwd = driver.FindElementByXPath("//*[@id='p']"); pwd.SendKeys("********"); } finally { driver.Quit(); }

而后调试测试,以下图

 

 这样就把值填写到文本框中了

最后就是点击登陆了,找到登陆按钮元素,Click it 一样的方式找到登陆按钮元素 而且点击

 [Fact] public void QQLogin() {
dynamic type = (new PictureTest()).GetType(); string currentDirectory = Path.GetDirectoryName(type.Assembly.Location); var driver = new ChromeDriver(currentDirectory); driver.Url = "https://qzone.qq.com/"; try { //切换语法有两种,一种是根据索引切换,另一种根据iframe名称切换 //这里咱们使用name切换 ITargetLocator tagetLocator = driver.SwitchTo(); //tagetLocator.Frame(1); //frame index. tagetLocator.Frame("login_frame"); //frame frame name. var userName = driver.FindElementByXPath("//*[@id='u']"); //这里的userName就是用户名的文本框 //设置用户名的值 userName.SendKeys("123456"); var pwd = driver.FindElementByXPath("//*[@id='p']"); pwd.SendKeys("********"); var btnLogin = driver.FindElementByXPath("//*[@id='login_button']"); //这里是判断登陆按钮是否可见,能够不写,直接调用click方法 if (btnLogin != null && btnLogin.Displayed == true) { btnLogin.Click(); } } finally { driver.Quit(); } }

而后就登陆成功了

作一下总结,用到的几个关键语法

//Iframe切换,若是须要捕获的元素不在当前页面,则找到嵌套页面进行切换 //切换语法有两种,一种是根据索引切换,另一种根据iframe名称切换
 ITargetLocator tagetLocator = driver.SwitchTo(); //tagetLocator.Frame(1); //frame index.
 tagetLocator.Frame("login_frame");  //frame frame name. //查找元素方法,可使用css定位
 var userName = driver.FindElementByXPath("//*[@id='u']"); //设置文本框的值SendKeys
 userName.SendKeys("123456"); //元素点击事件
 var btnLogin = driver.FindElementByXPath("//*[@id='login_button']"); btnLogin.Click();

 

只要了解下驱动程序操做浏览器的一些方法就能够本身摸索实现想要的东西,好比点击切换登陆框和快捷登陆

好比找到相册元素并点击,找到菜单说说元素并点击,设置文本框值,发说说,写留言 均可以摸索使用

登陆先讲到这里,改天写一下说说或者留言板,或者相册图片的保存

 git 源码地址:https://github.com/ermpark/CrawlingQzone