在上一篇博文中,咱们的爬虫面临着一个问题,在爬取Unsplash网站的时候,因为网站是下拉刷新,并无分页。因此不可以经过页码获取页面的url来分别发送网络请求。我也尝试了其余方式,好比下拉的时候监控http请求,看看请求是否有规律能够模拟。后来发现请求并无规律,也就是不可以模拟http请求来获取新的数据(也多是我水平有限,哪位童鞋找到了规律必定要告诉我哦)。那么就只有模拟下拉操做了。css
想要模拟下拉操做,咱们须要用到两个工具,一个是PhatomJs,一个是Selenium。
PhatomJS其实就是一个没有界面的浏览器,最主要的功能是可以读取js加载的页面。
Selenium实质上是一个自动化测试工具,可以模拟用户的一些行为操做,好比下拉网页。html
一直有个说法,Python + PhatomJS + Selenium 是爬虫的无敌三件套,基本可以实现全部爬虫需求。python
OK,咱们分别介绍下他们的使用,而后开始咱们的实战。web
个人运行环境以下:chrome
系统版本
Windows10。api
Python版本
Python3.5,推荐使用Anaconda 这个科学计算版本,主要是由于它自带一个包管理工具,能够解决有些包安装错误的问题。去Anaconda官网,选择Python3.5版本,而后下载安装。浏览器
IDE
我使用的是PyCharm,是专门为Python开发的IDE。这是JetBrians的产品,点我下载。cookie
PhatomJS是一个WebKit内核的浏览器引擎,它能像浏览器同样(它就是一个浏览器,只不过没有界面)解析网页,以及运行JavaScript脚本。网络
迄今为止,咱们的实战小爬虫只是在模拟http请求,而后获取response,从response中解析HTML代码得到想要的数据。可是,网页中有些数据是用js动态加载的,这样,咱们使用使用http请求得到的数据中并不包含js动态加载的内容。好比我在本系列的第一篇博文中请求了一下网易云音乐的网站,原本想用网易云音乐作实战示例的(个人设计师小伙伴儿的另外一个需求),不过因为它是由js动态加载的,用不到requests库,因此就先以Unsplash网站为实例了。写完Unsplash网站的爬虫后就开始网易云音乐的实战!框架
那么,怎么判断一个网站的内容是否是js动态加载的呢?
打开网易云音乐,在页面上点击右键-->View page source。会弹出一个新窗口,在新窗口中搜索你想要爬取的内容,发现搜不到。那就确定是js动态加载的了。
好比看下图中的选中图片,下面有文字:“影视歌曲|从新演绎经典 听翻唱焕发新生命力”。
咱们在View page source页面搜索该内容,发现搜索不到,可见这部份内容是由js动态加载的。
好了,进入正题,来看看PhatomJS如何使用。
PhatomJS 不能使用conda install 或者pip install 来安装。须要去官网下载,选择你的系统版本。下载完成的是一个压缩包,解压到你想存放的目录(我放在了“C:\Program Files” 目录)。
接下来须要把PhatomJS配置成环境变量,这样就能够直接调用了。
步骤:
1). 按win+E快捷键打开文件资源管理器“,在左侧的“此电脑”上点击右键,选择“属性”。
2). 在打开的窗口中左侧,点击“高级系统设置”。
3). 在弹出的窗口中点击“环境变量”。
4). 在新窗口中选择“PATH”,在下方点击编辑按钮。
5). 把phatomjs.exe所在的目录添加到path中便可。
这样,安装过程就搞定了。
在网上搜了一下,没有找到中文的官网文档,只找到了PhatomJS英文官方文档。
先来一个官网上的例子,PhatomJS执行js文件,输出“Hello, World!”
新建一个js文件,包含下面的代码,而后保存为hello.js。
console.log('Hello, world!'); phantom.exit(); #用来终止phtomjs程序
打开cmd命令窗口,进入到hello.js 文件所在目录,执行下面的命令:
phantomjs hello.js
输出:
Hello, world!
这个例子虽然方法比较笨,须要先建立一个js文件,而后再去执行。可是演示了PhatomJS的一个很重要的功能,就是执行js代码。咱们后面会用到它来执行下拉操做哦。
咱们使用PhatomJS来请求一个网页,而后把网页截图保存。
建立一个js文件,包含下面的代码,保存为music.js
var page = require('webpage').create(); page.open('http://music.163.com/', function(status) { console.log("Status: " + status); if(status === "success") { page.render('music.png'); } phantom.exit(); });
而后使用cmd命令窗口,在music.js文件所在目录,执行下面的命令:
phatomjs music.js
这样会有一个屏幕截图保存在文件所在的文件夹喽。
还有一些功能就不细细展开了,知道经常使用的就能够继续我们的爬虫了。有用到其余功能的童鞋们去官网看看例子。
对了,官网还有许多栗子,奉上连接:Phatomjs官网栗子。
Selenium是一个自动化测试框架,普遍的用于自动化测试领域(是否是真的普遍用于自动化测试领域我也不知道,没怎么搞过自动化测试 -_-!,这是我臆测的 = ̄ω ̄=)。由于它可以模拟人工操做,好比能在浏览器中点击按钮、在输入框中输入文本、自动填充表单、还能进行浏览器窗口的切换、对弹出窗口进行操做。也就是说你能手动作的东西,基本都能用它来实现自动化!
本身总结的大白话介绍~,你们凑合看哦。主要是文学水平有限,青春期的时候还想当一个文艺青年,没事儿矫情矫情写点东西,还注重个押韵啥的,学了理工科之后,矫情的东西受不了了,喜欢直接了当的。哎呦,跑偏了,赶忙回归正题!
该框架还支持多种语言:Java、C#、Python、Ruby、PHP、Perl、JavaScript。
固然,咱们使用的是面向Python语言的API。
可使用pip install selenium
来安装。使用Anaconda3版本的童鞋们,conda install selenium
在个人机器上不会下载,未找到缘由。可是一样使用pip install selenium
安装成功了。经过在命令行里面输入conda list
,能够看到已经安装的包。
同时装有Python2.7和Python3.5的童鞋,使用下面的命令来安装。
py -3 -m pip install selenium
Selenium支持不少语言的使用,上面也提到了。其余语言的使用我没有接触过,直接看Python语言的使用。官网:Selenium with Python。
由于PhatomJS没有界面,在使用的时候没有直观感觉。因此,咱们暂时使用Chrome浏览器代替PhatomJS。
首先下载Chrome浏览器驱动:下载地址,选择本身的系统版本,而后下载。这是一个压缩包,解压后存到一个目录中,而后把该目录添加到环境变量。由于上面的PhatomJS已经演示过添加环境变量的流程,这里就不赘述了。
在PyCharm中输入下面代码,而后运行看看有什么反应。
from selenium import webdriver #导入Selenium的webdriver from selenium.webdriver.common.keys import Keys #导入Keys driver = webdriver.Chrome() #指定使用的浏览器,初始化webdriver driver.get("http://www.python.org") #请求网页地址 assert "Python" in driver.title #看看Python关键字是否在网页title中,若是在则继续,若是不在,程序跳出。 elem = driver.find_element_by_name("q") #找到name为q的元素,这里是个搜索框 elem.clear() #清空搜索框中的内容 elem.send_keys("pycon") #在搜索框中输入pycon elem.send_keys(Keys.RETURN) #至关于回车键,提交 assert "No results found." not in driver.page_source #若是当前页面文本中有“No results found.”则程序跳出 driver.close() #关闭webdriver
哎呀,其实浏览器的变化流程我都写到上面的代码的注释中了,就再也不说一遍了哦。
经过上面的例子,咱们能够大概的了解了Selenium都能作什么。我的认为其中比较重要的就是定位,即找到页面中的元素,而后进行相关操做。
导航操做的使用很是简单,彻底能够通名字就知道它们是干什么的,不信先给你几个例子瞧瞧:
element = driver.find_element_by_id("passwd-id") #经过id获取元素 element = driver.find_element_by_name("passwd") #经过name获取元素 element = driver.find_element_by_xpath("//input[@id='passwd-id']") #经过使用xpath匹配获取元素
下面列出详细的定位方法。有定位一个元素的,也有定位多个元素的。
find_element_by_id find_element_by_name find_element_by_xpath find_element_by_link_text find_element_by_partial_link_text find_element_by_tag_name find_element_by_class_name find_element_by_css_selector
find_elements_by_name find_elements_by_xpath find_elements_by_link_text find_elements_by_partial_link_text find_elements_by_tag_name find_elements_by_class_name find_elements_by_css_selector
经过导航操做,咱们就能够在找到想找的元素,而后进行接下来的处理,好比,想在一个输入框中输入数据。看3.1的那个栗子,经过导航,找到了name为p的输入框,而后使用send_keys
在输入框中写入数据:
elem.send_keys("pycon")
咱们知道了如何在输入框中输入数据,那若是咱们碰到了下拉框该怎么办呢?
from selenium.webdriver.support.ui import Select #导入Select select = Select(driver.find_element_by_name('name')) #经过Select来定义该元素是下拉框 select.select_by_index(index) #经过下拉元素的位置来选择 select.select_by_visible_text("text") #经过下拉元素的内容来选择 select.select_by_value(value) #经过下拉元素的取值来选择
来看一个下拉框的HTML:
<select name="cars"> <option value ="volvo">沃尔沃</option> <option value ="bmw">宝马</option> <option value="benz">奔驰</option> <option value="audi">奥迪</option> </select>
结合上面的例子:
from selenium.webdriver.support.ui import Select select = Select(driver.find_element_by_name('cars')) #找到name为cars的select标签 select.select_by_index(1) #下拉框选中沃尔沃 select.select_by_visible_text("宝马") #下拉框选中宝马 select.select_by_value("benz") #下拉框选中奥迪
嗯...,让我想一想还有什么... ...。对了,还有一个操做特别经常使用,就是点击操做。这个很简单:
elem.click()
在找到的元素后面加上click()就能够了。
咱们想要爬取的网站有些可能须要登陆,这样就须要在请求网站的时候添加Cookies。
driver.get("http://www.example.com") #先请求一个网页 cookie = {‘name’ : ‘foo’, ‘value’ : ‘bar’} #设置cookie内容 driver.add_cookie(cookie) #添加cookie
还有其余的功能,好比拖拽页面的元素、浏览器切换、处理弹出框口等。我就不一一列举了,有须要的小伙伴儿们去看看官网吧。
咱们的PhatomJS 和Selenium 已经安装完成,而且了解了他们的使用。
这篇就先到这里吧,下一篇开始改造咱们的小爬虫喽。