爬虫学习笔记(七)Selenium和PhantomJS

2018-07-23 分类:Python, 爬虫 阅读(49) 评论(1)

现在越来越多的网站都是动态生成的网页,不是静态网页,意思就是打开网站之后,页面的html代码是通过JavaScript动态生成的,浏览器打开网站的时候才会加载js,产生html和css。

用requests模块发送请求的话,不会加载js,产生不了咱们想要的页面数据,那怎么办呢,1、需要你懂js,看源码是哪端js产生的数据,然后手动执行那段js,产生数据;2、写代码打开浏览器访问这个网站。

那第一种肯定费时费力,得研究它网站的源码,还得懂js,一时半会儿研究不出来,抓耳挠腮的。那就只能用第二种了,简单粗暴直接,就需要用到selenium模块了,selenium是用来做web自动化测试的一个工具,就是帮你打开一个浏览器,然后点点点。selenium可以打开各种浏览器,谷歌、火狐、ie等等。安装selenium直接使用pip install selenium即可。PhantomJS呢是一个无界面的浏览器,它会把网站加载到内存并执行页面上的 JavaScript,因为不会展示图形界面,所以运行起来比完整的浏览器要高效。

PhantomJS 是一个基于Webkit的“无界面”(headless)浏览器,它会把网站加载到内存并执行页面上的 JavaScript,因为不会展示图形界面,所以运行起来比完整的浏览器要高效。

如果我们把 Selenium 和 PhantomJS 结合在一起,就可以运行一个非常强大的网络爬虫了,这个爬虫可以处理 JavaScrip、Cookie、headers,以及任何我们真实用户需要做的事情。

注意:PhantomJS 只能从它的官方网站http://phantomjs.org/download.html) 下载。 因为 PhantomJS 是一个功能完善(虽然无界面)的浏览器而非一个 Python 库,所以它不需要像 Python 的其他库一样安装,但我们可以通过Selenium调用PhantomJS来直接使用。

PhantomJS 官方参考文档:http://phantomjs.org/documentation

快速入门

Selenium 库里有个叫 WebDriver 的 API。WebDriver 有点儿像可以加载网站的浏览器,但是它也可以像 BeautifulSoup 或者其他 Selector 对象一样用来查找页面元素,与页面上的元素进行交互 (发送文本、点击等),以及执行其他动作来运行网络爬虫。

页面操作

Selenium 的 WebDriver提供了各种方法来寻找元素,假设下面有一个表单输入框:

定位UI元素 (WebElements)

关于元素的选取,有如下的API 单个元素选取或者多个元素的选取,带elements的都是多个元素的,返回的是list

下面是各种选择器的用法

鼠标动作链

有些时候,我们需要再页面上模拟一些鼠标操作,比如双击、右击、拖拽甚至按住不动等,我们可以通过导入 ActionChains 类来做到:

处理下拉框

我们已经知道了怎样向文本框中输入文字,但是有时候我们会碰到<select> </select>标签的下拉框。直接点击下拉框中的选项不一定可行。

Selenium专门提供了Select类来处理下拉框。 其实 WebDriver 中提供了一个叫 Select 的方法,可以帮助我们完成这些事情:

弹窗处理

当你触发了某个事件之后,页面出现了弹窗提示,处理这个提示或者获取提示信息方法如下:

页面切换、页面前进和后退

一个浏览器肯定会有很多tab页,所以我们肯定要有方法来实现窗口的切换。切换窗口的方法如下:

操作Cookies

页面等待

页面等待非常重要,因为我们在打开一个网站的时候,由于网速或者其他原因,页面没有加载全,这时候可能咱们想要找的元素还没有出现,运行代码的时候就会报错了。找不到该元素。

为了避免这种情况的出现,selenium里面有2种等待元素加载完成的方式,一种是隐式等待,一种是显示等待。前者就比较傻瓜了,就是固定等一个时间,过了时间就继续执行下面的代码,和sleep差不多。后者是指定一个最长的等待时间,在这个时间内它会一直检查这个元素有没有被加载出来,如果被加载出来,那么就不等待了,继续执行;如果超过最长的等待时间,那么就会抛出异常。

显式等待

隐式等待

 

您可能也喜欢:

协程、gevent实现异步io、进程、线程、协程对比

异步io的说白了就是遇到io操作的时候,就停下来去做别的事情。io分网络io和磁盘io,网络io比如说打开一个网站获取数据,下载一首歌等等,磁盘io就是把数据存到一个文件里面,写到磁盘上。 从网站上获取数据或者把数据写到磁盘上都是需要时间的,那就得等待了,这样的话,很多任务的时候就比较慢了,而异步i...

more

迭代器、生成器

迭代器只有在调用next的时候才会取数据(所以省内存),或者循环的时候,一个对象里面实现了__iter__方法,iter方法里面返回了一个迭代器,那就是一个可迭代对象了。 下面的代码,首先实现了iter方法,这个对象就是一个可迭代对象了,然后又返回了self就是自己,就是一个迭代器了。 使用for ...

more

socket、tcp/ip协议、udp协议

socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求。 socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现,...

more

评论&留言
欢迎新朋友你的到来!
已经有1 条评论抢在你前面了~
昵称

  1. 匿名

    厉害了,牛老板~

    #1
    回复

登录

忘记密码 ?

切换登录

注册