经@吃西瓜的星星提醒

首先我们介绍下Selenium

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

详细介绍点击这里

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

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

新建单元测试解决方案

安装Nuget包

我这里使用谷歌浏览器采集数据,所以就使用谷歌浏览器的驱动了,如果不喜欢谷歌浏览器的可以引用别的驱动程序包

命令

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("");
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("");
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("");
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("");
//元素点击事件
var btnLogin = driver.FindElementByXPath("//*[@id='login_button']");
btnLogin.Click();

只要了解下驱动程序操作浏览器的一些方法就可以自己摸索实现想要的东西,比如点击切换登录框和快捷登录

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

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

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

C#使用Selenium实现QQ空间数据抓取 登录QQ空间的更多相关文章

  1. C#使用Selenium实现QQ空间数据抓取 说说抓取

    上一篇讲的是如何模拟真人操作登录QQ空间,本篇主要讲述一下如何抓取QQ说说数据 继续登录空间后的操作 登陆后我们发现QQ空间的菜单其实是固定的,只需要找到对应元素就可以,继续XPath 可以得到地址 ...

  2. 抓取60000+QQ空间说说做一次数据分析

    对于QQ空间的数据一直来是垂涎不已,老早就想偷过来研究研究,这几天闲下来便开始动手... 整个程序的流程为:登录-->获取cookie-->获取所有的好友qq_number-->根据 ...

  3. 爬虫:selenium + phantomjs 解决js抓取问题(一)

    selenium模块主要用来做测试,模拟键盘.鼠标来操作浏览器. phantomjs 就像一个无界面的浏览器一样. 两个结合能很好的解决js抓取的问题. 测试代码: #coding=utf-8 fro ...

  4. 爬虫---selenium动态网页数据抓取

    动态网页数据抓取 什么是AJAX: AJAX(Asynchronouse JavaScript And XML)异步JavaScript和XML.过在后台与服务器进行少量数据交换,Ajax 可以使网页 ...

  5. [Python爬虫] 之三十:Selenium +phantomjs 利用 pyquery抓取栏目

    一.介绍 本例子用Selenium +phantomjs爬取栏目(http://tv.cctv.com/lm/)的信息 二.网站信息 三.数据抓取 首先抓取所有要抓取网页链接,共39页,保存到数据库里 ...

  6. [Python爬虫] 之二十九:Selenium +phantomjs 利用 pyquery抓取节目信息信息

    一.介绍 本例子用Selenium +phantomjs爬取节目(http://tv.cctv.com/epg/index.shtml?date=2018-03-25)的信息 二.网站信息 三.数据抓 ...

  7. [Python爬虫] 之二十八:Selenium +phantomjs 利用 pyquery抓取网站排名信息

    一.介绍 本例子用Selenium +phantomjs爬取中文网站总排名(http://top.chinaz.com/all/index.html,http://top.chinaz.com/han ...

  8. [Python爬虫] 之十六:Selenium +phantomjs 利用 pyquery抓取一点咨询数据

    本篇主要是利用 pyquery来定位抓取数据,而不用xpath,通过和xpath比较,pyquery效率要高. 主要代码: # coding=utf-8 import os import re fro ...

  9. [Python爬虫] 之十七:Selenium +phantomjs 利用 pyquery抓取梅花网数据

    一.介绍 本例子用Selenium +phantomjs爬取梅花网(http://www.meihua.info/a/list/today)的资讯信息,输入给定关键字抓取资讯信息. 给定关键字:数字: ...

随机推荐

  1. 阿里云服务器安全设置 分类: B3_LINUX 2014-07-24 11:10 5197人阅读 评论(1) 收藏

    1.开启云盾所有服务 2.通过防火墙策略限制对外扫描行为 请您根据您的服务器操作系统,下载对应的脚本运行,运行后您的防火墙策略会封禁对外发包的行为,确保您的主机不会再出现恶意发包的情况,为您进行后续数 ...

  2. html5-5 HTML5表单元素和内嵌框架

    html5-5   HTML5表单元素和内嵌框架 一.总结 一句话总结:单选框和多选框选的时候外面加label就可以实现选后面文字也可以选中了 1.html5如何实现文件上传? 必须加上enctype ...

  3. ASP.NET 生命周期及管道事件

    Client(发送报文:请求行+请求头+空行+请求体) <------ Http 协议 ------> Server,由 Http.sys 监听 Http 请求 -> WAS+Met ...

  4. Android View框架的measure机制

    概述 Android中View框架的工作机制中,主要有三个过程: 1.View树的測量(measure)Android View框架的measure机制 2.View树的布局(layout) Andr ...

  5. 01_Git的安装和简单使用(命令行模式+图形化模式)

      刚开始用git的小白适用,参考链接:http://www.cnblogs.com/qijunjun/p/7137207.html  实际项目开发中,我们经常会用一些版本控制器来托管自己的代码,今天 ...

  6. 记录一次对接XX支付SDK过程中报错问题

    我们支付平台以前我不做对接上游的,偶然间替别人做"对接了XX支付的相关接口的工作".在工作过程中发现SDK和对外提供服务过程中很容易出问题.在此做个记录,为了以后相关工作中作为自己 ...

  7. Java数组课后习题

    package javafirst; import java.util.Arrays; class Show{ public void showArray(int[] arr){ for(int i ...

  8. JAVA SE回顾及思考(3)——排序算法

    排序的算法是很多公司的笔试和面试题,个人感觉Java中其实无需使用这些排序方法,因为Java中已经为我们提供了很方便效率很高的sort()方法.但是不使用不能代表不需要学习这些算法,也不是仅仅为了面试 ...

  9. 多域名绑定同一IP地址,Node.js来实现

    本来打算用Nginx来实现,看了一会Nginx的配置,感觉又要费时间学习,就抱着试试看的心在网上搜,是否可以用Node.js来实现. 没想到,竟然搜到了.想试一下,但国内域名备案时间长达一个月,我肯定 ...

  10. 64 位系统 vs2013 配置 OpenCV-3.1.0

    参考:64 位系统 vs2013 配置 opencv3.0 1. 环境准备 进入官网 http://opencv.org/,下载最新版本的 opencv(以本文 opencv-3.1.0 为例,.ex ...