在爬虫过程中,有的网页是动态更新的,有的数据会在页面加载时通过js加载或者用ajax加载,这时候如果只用普通的Request和Response获取的HTML页面将会不完整。所以这时候可以采用Senlium.

Selenium 是用于Web应用程序自动化测试的开源工具。通过Selenium,你可以模拟用户在浏览器中的操作。

Selenium可以模拟多种浏览器,目前主流是IE、Chrome、FireFox。这里我采用的Chrome浏览器。

首先在VS使用NuGet安装

然后使用Chrome浏览器则安装

安装完后在解决方案目录下的packages\Selenium.Chrome.WebDriver.2.42\driver中找到chromedriver.exe放到Bin的目录中。

之后引用命名空间:在Selenium之前都得加OpenQA,例如:

Using OpenQA.Selenium;

首先模拟打开浏览器:

  Var driver=new ChromeDriver();

  driver.Manage().Window.Maximize();

  driver.Navigate().GoToUrl("URL");

这时候谷歌浏览器则会弹出一个界面。

具体API可以详看:

https://seleniumhq.github.io/selenium/docs/api/dotnet/

一些小贴示:

1、 一般查找使用FindElement(By.---()),若找不到可以设置等待时间等待页面加载

2、 如果页面需要在新的标签页打开窗口,则可以用JS脚本例如

  string js = string.Format("window.open(\"{0}\")", downLoad);

  driver.ExecuteScript(js);

3、 页面中有的元素是在IFrame中,如果不先找到IFrame,则不会找到里面的属性,所以可以先用

  driver.SwitchTo().Frame(str)

4、 有时候我们需要等待浏览器加载则可以设置timeouts,Selenium有三种超时等待方式:

  1)、显式等待

  显式等待,就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,那么就跳出Exception.

  需要用到WebDriverWait

  2)、隐式等待

  隐式等待, 此处的隐式等待是针对Driver 每次执行命令的最长执行时间也可以理解为超时时间,一些人对此处有误解,认为是让Driver等一段时间,确实某些时候能让Driver等一段时间, 但是影响是全局的,每次Driver执行找不到元素都会等待此处设置的时间,假设某处将此值设置的太长,必须在执行完成之后还原回来,否则判断一个元素是否存在的时候,就会遇到很坑爹的问题。

  改进后的方法如下:WebDriver会进行一个隐式等待,但参数只有时间,这就导致我需要什么元素出现,我不一定能等到它

  driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10000);

  3)、线程休眠

Thread.Sleep();

5.如果切换不同标签可以需要用到句柄例如:能够跳到第一个标签页

  ReadOnlyCollection<string> windowsHandles = driver.WindowHandles;

driver.SwitchTo().Window(windowsHandles[0]);

6.如果需要打开新的标签页可以使用浏览器执行JS

  string js = "window.open(\"http://baidu.com\");";
  driver.ExecuteScript(js);

C#爬虫之Senlium的更多相关文章

  1. 设计爬虫Hawk背后的故事

    本文写于圣诞节北京下午慵懒的午后.本文偏技术向,不过应该大部分人能看懂. 五年之痒 2016年,能记入个人年终总结的事情没几件,其中一个便是开源了Hawk.我花不少时间优化和推广它,得到的评价还算比较 ...

  2. Scrapy框架爬虫初探——中关村在线手机参数数据爬取

    关于Scrapy如何安装部署的文章已经相当多了,但是网上实战的例子还不是很多,近来正好在学习该爬虫框架,就简单写了个Spider Demo来实践.作为硬件数码控,我选择了经常光顾的中关村在线的手机页面 ...

  3. Python 爬虫模拟登陆知乎

    在之前写过一篇使用python爬虫爬取电影天堂资源的博客,重点是如何解析页面和提高爬虫的效率.由于电影天堂上的资源获取权限是所有人都一样的,所以不需要进行登录验证操作,写完那篇文章后又花了些时间研究了 ...

  4. scrapy爬虫docker部署

    spider_docker 接我上篇博客,为爬虫引用创建container,包括的模块:scrapy, mongo, celery, rabbitmq,连接https://github.com/Liu ...

  5. scrapy 知乎用户信息爬虫

    zhihu_spider 此项目的功能是爬取知乎用户信息以及人际拓扑关系,爬虫框架使用scrapy,数据存储使用mongo,下载这些数据感觉也没什么用,就当为大家学习scrapy提供一个例子吧.代码地 ...

  6. 120项改进:开源超级爬虫Hawk 2.0 重磅发布!

    沙漠君在历时半年,修改无数bug,更新一票新功能后,在今天隆重推出最新改进的超级爬虫Hawk 2.0! 啥?你不知道Hawk干吗用的? 这是采集数据的挖掘机,网络猎杀的重狙!半年多以前,沙漠君写了一篇 ...

  7. Python爬虫小白入门(四)PhatomJS+Selenium第一篇

    一.前言 在上一篇博文中,我们的爬虫面临着一个问题,在爬取Unsplash网站的时候,由于网站是下拉刷新,并没有分页.所以不能够通过页码获取页面的url来分别发送网络请求.我也尝试了其他方式,比如下拉 ...

  8. Python多线程爬虫爬取电影天堂资源

    最近花些时间学习了一下Python,并写了一个多线程的爬虫程序来获取电影天堂上资源的迅雷下载地址,代码已经上传到GitHub上了,需要的同学可以自行下载.刚开始学习python希望可以获得宝贵的意见. ...

  9. QQ空间动态爬虫

    作者:虚静 链接:https://zhuanlan.zhihu.com/p/24656161 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 先说明几件事: 题目的意 ...

随机推荐

  1. mysql排错小指南

    mysql排错小指南 查询运行很慢时,可以执行mysql> show processlist\G mysql> show processlist\G ******************* ...

  2. Qualcomm_Mobile_OpenCL.pdf 翻译-7 内存性能优化

    内存优化是最重要也是最有效的OpenCL性能优化技术.大量的应用程序是内存限制而不是计算限制.所以,掌握内存优化的方法是OpenCL优化的基础.在这章中,将会回顾OpenCL的内存模型,然后是最优的实 ...

  3. 006-saltstack之远程执行

    1.目标 2.执行模块 3.返回 salt ‘*’ cmd.run ‘uptime’ 命令 目标 执行模块 执行模块参数 1.SlatStack远程执行–目标 执行目标:https://docs.sa ...

  4. exe 错误

    1,NTVDM 是从 WINDOWS NT 架构开始引入的一个子系统进程,目的是虚拟一个DOS环境来运行以前的DOS 16bit 程序.2,只有当启动16位DOS程序时,才会启用 NTVDM 这个进程 ...

  5. u-boot bl _main分析

    ldr    r0, =(CONFIG_SYS_INIT_SP_ADDR): #define CONFIG_SYS_INIT_SP_ADDR     (CONFIG_SYS_INIT_RAM_ADDR ...

  6. 如何创建DLL,以及注入DLL

    为了防止忘记,特记下 DLL的创建,在VS2017中选择dll的创建 // dllmain.cpp : Defines the entry point for the DLL application. ...

  7. vuex 管理状态

    来分析下vuex的管理状态吧,如果你用过react中的redux的管理树,那我觉得vuex对你来说很容易掌握 如果你还是不太熟悉vuex是什么,那先看下官网https://vuex.vuejs.org ...

  8. 【leetcode】1202. Smallest String With Swaps

    题目如下: You are given a string s, and an array of pairs of indices in the string pairs where pairs[i] ...

  9. 拉链法解决hashtable冲突问题

    拉链法解决冲突.拉链法解决冲突的做法是将所有的相同Hash值的key放在一个链表中,比如key3和key14在hash之后都是0,那么在数组的键为0的地方存储这两个值,形式是链表.如果不能理解我的文字 ...

  10. UVA 12299 线段树 ( 单点跟新 , 区间查询)

    题目链接:题意:在传统的RMQ的基础上加上一个操作:shift(i1,i2,i3...ik),表示将这些元素,依次向左移动一位(训练指南247页) #include <iostream> ...