使用Selenium模拟浏览器行为

在爬取动态渲染页面的数据时(通常为Ajax),我们可以使用AJAX URL分析法和Selenium模拟浏览器行为两种方法,其中前者已经分析一般思维已叙述,在本节中我们主要介绍如何使用Selenium模拟浏览器行为来获取数据。

一、准备工作

在正式介绍使用之前,我们需要先安装selenium库,安装库的过程和之前一样,我们可以直接使用命令’pip install selenium’。安装完成后我们还需要配置好用于驱动浏览器行为的驱动器driver,每一个浏览器对应的driver都是不同的,具体可以参看下表:

 

下载完对应版本的XXXdriver.exe文件后,将其放入我们python安装路径的scripts目录下即可,以供全局使用。例如,以Chrome为例,我的chromedriver.exe便可放在’C:\Users\UnikFox\AppData\Local\Programs\Python\Python36\Scripts’。

此外,这里要留意的是,每个浏览器版本的driver也是不同的,在下载页可以看到各driver所支持的浏览器版本。

二、基本使用

1.启动浏览器并访问页面

模拟浏览器的启动只需要实例化selenium的webdriver模块中相应的对象即可,然后通过这个对象的get(url)方法便可请求URL映射的页面,之后我们就可以通过访问这一个对象的属性来获取相应的页面数据信息。这里我们仍以Chrome为例,运行后我们便可发现其自动地打开了一个Chrome浏览器,并在顶部显示“Chrome正受到自动测试软件地字样”,说明我们使用selenium成功地打开了浏览器,同时我们还会发现也已经进入了我们所请求的页面。

 

 

2.关闭页面

在我们模拟完成后,可以使用browser对象的close()和quit()方法关闭页面,其主要区别是前者为关闭当前页面,而后者为退出整个浏览器。

 

3.解析元素

在我们获取到页面的HTML源文本后,如要对其进行解析,实际上我们可以使用之前介绍的lxml和beautifulsoup两种解析方法,不过这里我们主要来说明一下使用selenium的解析策略。

在selenium中,我们解析元素都是通过browser来实现的,解析的方法可以是通过元素id、元素名name、类名class_name、CSS选择器或者xpath语法,在实际中具体使用时我们只需要调用browser的相关方法即可。

例如,如果我们要解析百度中的输入框input元素,则可以使用如下的解析方法:

 

 

其实,在实际爬虫中我们更多的情况是需要解析多个元素,此时我们便可以通过’browser.find_elements_by_XXX()’来解析,和单个元素解析不同,其返回的是一个WebElement元素列表,即find_element是获取第一个满足条件的元素,而find_elements则是获取所有满足条件的元素。

此外,通过上述这种解析可能不够灵活,因为它都将解析方法都固定了,实际上selenium还为我们提供了一种可灵活选择解析方法的解析函数,这样上述示例便可等价为:

 

4.提取元素信息

在我们获取到元素后,就要对元素的内容进行提取,提取对象包括元素的文本信息和元素的属性信息,分别对应着text属性和get_attribute(),使用示例如下:

 

5.操作元素

元素的操作主要是点击和输入,在selenium中实现方式也很简便,只需要对相应待操作元素使用click()和send_keys()方法即可,使用示例如下:

 

此外,在输入中若要清除已输入的内容,则可以使用clear()方法。对于任何与点击操作有关的行为都可以用这种方法实现,比如说单选和复选,前提只需要获取相应的元素就行了。

除了表单和单复选外,处理较多的还有下拉选择,因下拉点击后还需要选中元素,我们不能直接进行操作。不过我们可以借助selenium的一个类selenium.webdriver.support.ui.Select来实现,先将下拉选择元素作为参数传入这个类中实例化对象,然后我们就可以使用这个对象进行选择了。使用示例如下:

三、其他使用

1.行为链

首先,什么是行为链呢?在上述的示例中,我们都是通过对单个元素执行单步操作完成的,其实还存有另一些操作,它们没有特定的执行对象,比如鼠标拖拽、键盘按键等,这些动作是用另一种方式来执行的,常分为多步,这就是行为链,又称为动作链。

由于行为链在爬虫中运用得不多,在此以将鼠标移动到某个元素上并执行点击事件为示例简单介绍一下:

 

此外,还有如下得常见鼠标操作得方法:

点击但不松开鼠标:click_and_hold(element)

右键点击:context_click(element)

双击:double_click(element)

2.Cookie操作

使用Selenium我们可以很方便地对Cookie进行获取、添加和删除操作,使用示例如下:

 

3.页面等待

由于很多时候我们无法预知页面元素需要花多长的时间进行加载,这时候我们就需要使用等待技术等待页面加载完成在进行解析。常用的等待方式分为显式等待和隐式等待。其中,显式等待即静态等待,无论是否加载完成都会等待,类似于time.sleep();而隐式等待则是条件等待,通常会设置一个条件,在等待的期间当条件满足时就会结束等待,若等待时间到了条件仍未满足就会抛出TimeoutException错误。

使用示例如下:

 

一些其他的等待条件:

presence_of_element_located():某个元素已加载完毕

presence_of_all_emement_located():网页中所有满足条件的元素都已加载完毕

element_to_be_cliable():某个元素已可以点击

4.打开新标签页面与切换页面

如果有时候一个浏览器需要打开不同的标签页面(这里不是新打开一个浏览器),我们可以借助browser的execute_script("window.open(url)")方法来实现,不过要注意的是,虽然打开了一个新的标签页面,但并没有切换过去,browser访问的还是原来的页面,我们可以通过browser.current_url来查看当前页面URL。

对于拥有多个子标签的页面,如果我们想要切换不同的页面,可以借助selenium提供的switch_to_window()切换方法,该方法接收待切换页面的对象,具体可通过browser.window_handles列表索引得到,而这给列表里的元素是按照browser访问页面的先后顺序自动定的。

使用示例如下:

 

5.使用代理

在Selenium中我们也可以进行代理设置,不同的浏览器设置代理得方式不同,这里我们以Chrome为例介绍设置代理得方法。

在Chrome中设置代理,首先需要获取设置对象webdriver.ChromeOptions(),再使用该对象得add_argument()方法对其添加代理参数,最后再实例化浏览器驱动对象webdrive.Chrome(),同时传入参数设置对象即可。

使用示例如下:

 

posted @   I'm_江河湖海  阅读(46)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示