一些网页,比如微博,只有在登录状态才能进行页面的访问,或者对数据有比较复杂的验证和保护,直接通过网络请求进行登录并获取数据就会比较麻烦。这种时候,就该本篇的主角 selenium 上场了。 Selenium 是一个用于 Web 应用程序测试的工具。它的优点在于,浏览器能打开的页面,使用 selenium 就一定能获取到。但 selenium 也有其局限性,相对于脚本方式,selenium 获取内容的效率不高。 本篇文章简单介绍 Selenium 下 webdriver 组件,它直接在浏览器中运行,其行为跟真实用户一样,打开浏览器、模拟输入内容、模拟点击按钮等等。Selenium 测试可以在市面上主流操作平台主流浏览器上运行。 1、安装 Selenium 本身的安装十分简单 ,使用 下载 chromedriver.exe 文件,地址:https://sites.google.com/a/chromium.org/chromedriver/downloads 下载解压之后,将 chromedriver.exe 添加到和 python安装的根目录下,如图: 然后就可以在脚本中正常使用 selenium 调用 Chrome 了,IE 的配置方法类似。 很多同学使用 selenium 的初衷是作为爬虫使用或者对付反爬虫手段,用不着浏览器界面,希望程序在后台运行就可以了。我们推荐有这样需求的同学使用无界面的 PhantomJS 代替 Chrome 或者 Firefox。 首先下载 PhantomJS ,地址:/ 将下载完成的 phantomjs.exe 添加到 python 安装路径中的 scripts 文件夹中,如图: 接着,就可以正常使用了。 2、基本使用方法2.1 启动完成安装以及环境配置之后,就可以正式的在脚本中调用了,我们以打开百度首页为例: from selenium import webdriver 以上就是一个最简单的打开网页的例子,当你使用 Firefox 时,调用方法: driver = webdriver.Firefox() 使用 PhantomJS 时: deriver = webdriver.PhantomJS() 2.2 选择器selenium 定位一个网页中的元素有许多方式,可以使用 html 标签中的 id、name、class 等属性,也可以使用 XPath 路径,甚至 js 代码。 我们依然以百度为例,去定位页面中的输入框以及搜索按钮。 首先是 F12 启动开发者工具,然后点击页面元素选择按钮 → 点击需定位的元素 → 查看定位元素的源代码 经过上图的流程,我们可以清楚的看到输入框的源代码为: <input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off"> 根据源代码内容,我们可以以 id 、name、class 名等方式来定位该输入框,代码如下: ele_input_id = driver.find_element_by_id('kw')
ele_input_name = driver.find_element_by_name('wd')
ele_input_cls = driver.find_element_by_class_name('s_ipt') 使用相同的方式,我们可以定位 百度一下 这个搜索按钮: 按钮的源代码: <input type="submit" id="su" value="百度一下" class="bg s_btn"> 定位代码如下: ele_btn = driver.find_element_by_id('su') 以上就是简单的选择器知识 2.3 基本的页面操作方法定位到页面的元素之后,我们会需要对该元素进行一些操作,比如输入内容、点击按钮等等。 # 输入搜索内容 结果如下: 3、Selenium 获取 cookies在爬虫领域中,常常使用 selenium 获取 cookies 应付反爬虫。 比如,爬取微博的内容,需要登陆状态,而保存的 cookies 会在一定时间后失效,这时候 selenium 就派上了用场,使用预先设置的账号密码登陆,然后获取 cookies 发送给脚本使用。 3.1 使用内置函数获取 cookies 使用 get_cookies 函数,依然以百度为例: cookie_r = driver.get_cookies() 打印出 cookie_r 是这样的: [{'domain': '.baidu.com', 'httpOnly': False, 'name': 'H_PS_PSSID', 'path': '/', 'secure': False, 'value': '22584_1465_21087_18560_22581'}, {'domain': '.baidu.com', 'expiry': 3639883283.649732, 'httpOnly': False, 'name': 'BAIDUID', 'path': '/', 'secure': False, 'value': '69F8E8C5CF050F0C8CA3C358CB08BAC6:FG=1'}, {'domain': '.baidu.com', 'expiry': 3639883283.649952, 'httpOnly': False, 'name': 'PSTM', 'path': '/', 'secure': False, 'value': '1492399635'}, {'domain': '.baidu.com', 'expiry': 3639883283.649925, 'httpOnly': False, 'name': 'BIDUPSID', 'path': '/', 'secure': False, 'value': '69F8E8C5CF050F0C8CA3C358CB08BAC6'}, {'domain': 'www.baidu.com', 'expiry': 1493263637, 'httpOnly': False, 'name': 'BD_UPN', 'path': '/', 'secure': False, 'value': '12314753'}, {'domain': 'www.baidu.com', 'expiry': 1492399637.649969, 'httpOnly': False, 'name': 'BD_LAST_QID', 'path': '/', 'secure': False, 'value': '18362646771513028098'}, {'domain': 'www.baidu.com', 'httpOnly': False, 'name': 'BD_HOME', 'path': '/', 'secure': False, 'value': '0'}, {'domain': '.www.baidu.com', 'expiry': 1492399642.240359, 'httpOnly': False, 'name': '__bsi', 'path': '/', 'secure': False, 'value': '16804089554912194086_00_0_I_R_3_0303_C02F_N_I_I_0'}, {'domain': 'www.baidu.com', 'expiry': 1492399647, 'httpOnly': False, 'name': 'WWW_ST', 'path': '/', 'secure': False, 'value': '1492399637585'}] 此形式的 cookies 是不能直接传递给脚本使用的,我们需要进一步的处理,提取出每个字典 name 和 value 值,将其组合在一起。 cookies_list = [] 经过处理的 cookies_str 就可以直接发送给 脚本使用了,打印出 cookies_str 如下: H_PS_PSSID=22583_1433_21106_17001_20929;BAIDUID=456846B8C2CECBC077CA6A700DA24A89:FG=1;PSTM=1492400387;BIDUPSID=456846B8C2CECBC077CA6A700DA24A89;BD_HOME=0;BD_UPN=12314753;__bsi=16211205307050373314_00_0_I_R_2_0303_C02F_N_I_I_0;WWW_ST=1492400389401 3.2 执行 js 函数获取 cookies 不仅仅可以通过 get_cookies 函数,还可以直接使用 javascript 代码,示例: # 字符串形式的 js 代码 此时获取的 cookies 可以直接发给脚本使用,结果如下: BAIDUID=7ABCBA83953DC58B59943B0967D10098:FG=1; BIDUPSID=7ABCBA83953DC58B59943B0967D10098; PSTM=1492400818; BD_HOME=0; H_PS_PSSID=22584_1457_21106_17001_21673_20927; BD_UPN=12314753; __bsi=17435099398291019533_00_0_I_R_2_0303_C02F_N_I_I_0; WWW_ST=1492400820362 这里我们只简单介绍一下获取 cookies 的方法,在 selenium 中执行 javasript 代码还有更多更精彩的玩法,就不在这里展开讲了。 4、结语在本篇文章中,我们简单的介绍了 selenium 的安装使用过程,以操作百度首页为例,演示了如何定位、如何启用事件、如何获取 cookies 应对基本的反爬虫手段。 当然,selenium 所包含得内容远不止此,详细内容请查看官方文档: |
|