爬虫基础-句号selenium_第1页
爬虫基础-句号selenium_第2页
爬虫基础-句号selenium_第3页
爬虫基础-句号selenium_第4页
爬虫基础-句号selenium_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

selenium讲师:句号授课时间:2018年9月免责声明:如果本课程内有任何内容侵害了您的权益,请您及时联系我们潭州教育全球教学服务中心热线:目录CONTENTSselenium介绍基本使用切换动作动作链/等待01020304selenium介绍01Selenium简介Selenium是一个用于web自动化测试的工具,Selenium测试直接运行在浏览器中,就好像一个真正的用户在操作一样,

支持大部分主流的浏览器,包括IE(7,8,9,10,11),Firefox,Safari,Chrome,Opera等。我们可以利用它来模拟用户点击访问网站,绕过一些复杂的认证场景通过selnium+驱动浏览器这种组合可以直接渲染解析js,绕过大部分的参数构造和反爬。注意事项新版本的Selenium已经不在支持phantomjs,原作者也已经放弃维护该项目了。还有在做爬虫的时候尽量不要用这种方法,Selenium+浏览器的组合速度慢,应付不了数据量比较大的爬取以及并发爬取。并且很吃电脑资源。Selenium介绍Selenium配置使用selenium驱动chrome浏览器需要下载chromedriver,而且chromedriver版本需要与chrome的版本对应,版本错误的话则会运行报错。Chromedriver下载地址:Windows:下载对应版本的chromedriver解压后,将文件移动到一个配置了环境变量的文件夹中,例如Python安装文件夹Linux/Mac:解压后,将文件移动至/usr/local/bin目录中Selenium安装非常简单,直接pip就可以搞定:pipinstallseleniumSelenium驱动其他浏览器的也是需要下载对应的驱动基本使用02元素选取在一个页面中有很多不同的策略可以定位一个元素。我们可以选择最合适的方法去查找元素。Selenium提供了下列的方法:单个元素查找方法作用find_element_by_xpath()通过Xpath查找find_element_by_class_name()通过class属性查找find_element_by_css_selector()通过css选择器查找find_element_by_id()通过id查找find_element_by_link_text()通过链接文本查找find_element_by_name()通过name属性进行查找find_element_by_partial_link_text()通过链接文本的部分匹配查找find_element_by_tag_name()通过标签名查找注:其中的element加上一个s,则是对应的多个元素的查找方法元素选取除了以上的多种查找方式,还有两种私有方法集成了上面的所有的查找方法,让我们更方便的使用方法作用find_element(By.XPATH,‘//button/span’)通过Xpath查找一个find_elements(By.XPATH,‘//button/span’)通过Xpath查找多个其中的第一个参数可以选择使用查找的方法,By.xxx使用xxx方式解析,解析方法如下:ID="id"

XPATH="xpath"

LINK_TEXT="linktext"

PARTIAL_LINK_TEXT="partiallinktext"

NAME="name"

TAG_NAME="tagname"

CLASS_NAME="classname"

CSS_SELECTOR="cssselector"

注:By对象导入:frommon.byimportBy窗口/页面/弹窗切换03窗口切换用selenium操作浏览器如果需要在打开新的页面,这个时候会有问题,因为我们用selenium操作的是第一个打开的窗口,所以新打开的页面我们是无法去操作的,所以我们要用到切换窗口:既handle切换的方法方法作用window_handles获取所有页面窗口的句柄current_window_handle获取当前页面窗口的句柄switch_to.window(window_name)定位页面转到指定的window_name页面页面(frame)切换在实际的爬虫中,有时候我们会遇到找不到元素的问题,明明定位的路径没问题,这个时候我们可以考虑一下是否是该页面存在frame的问题导致的定位不到元素。方法作用switch_to.frame(frame_reference)切到指定frame,可用id或name(str)、index(int)、元素(WebElement)定位switch_to.parent_frame()切到父级frame,如果已是主文档,则无效果,相当于后退回去switch_to_default_content()切换到主页面,DOM树最开始的frame页面弹窗有的时候还会遇到弹窗的问题,主要有两种一种是浏览器弹窗(alert/prompt),一种是自定义弹窗自定义弹窗,就是一个自定义的div层,是隐藏页面中的,当触发了这个弹窗后,他就显示出来,这种方式我们通过正常的定位方式是可以定位到的。alert弹窗,就要用下面的方法处理:方法作用switch_to_alert定位到alert弹窗,返回一个弹窗的对象dismiss()对弹窗对象的取消操作(相当于点击弹窗上的取消按钮)accept()对弹窗对象的确定操作(相当于点击弹窗上的确定按钮)send_keys(key)对弹窗对象内的输入框输入数据(针对于prompt弹窗)text获取弹窗内的文本等待/动作链04等待在selenium操作浏览器的过程中,每一次请求url,selenium都会等待页面加载完成以后,才会将操作权限在交给我们的程序。但是,由于ajax和各种JS代码的异步加载问题,当一个页面被加载到浏览器时,该页面内的元素可以在不同的时间点被加载,这就使得元素的定位变得十分困难,当元素不再页面中时,使用selenium去查找的时候会抛出ElementNotVisibleException异常。

为了解决这个问题,selenium提供了两种等待页面加载的方式,显示等待和隐式等待,让我们可以等待元素加载完成后在进行操作。等待显示等待显示等待:显式等待指定某个条件,然后设置最长等待时间,程序每隔XX时间看一眼,如果条件成立,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出超时异常(TimeoutException)。显示等待主要使用了WebDriverWait类与expected_conditions模块。一般写法:WebDriverWait(driver,timeout,poll_frequency,igonred_exceptions).until(method,message)Driver:传入WebDriver实例。timeout:超时时间,等待的最长时间(同时要考虑隐性等待时间)poll_frequency:调用until中的方法的间隔时间,默认是0.5秒ignored_exceptions:忽略的异常,如果在调用until的过程中抛出这个元组中的异常,则不中断代码,继续等待.Method:可执行方法Message:

超时时返回的信息WebDriverWait包:fromselenium.webdriver.support.waitimportWebDriverWaitexpected_conditions包:fromselenium.webdriver.supportimportexpected_conditionsasECexpected_conditions条件expected_conditions是selenium的一个子模块,其中包含一系列可用于判断的条件,配合该类的方法,就能够根据条件而进行灵活地等待了ActionChains提供的方法作用title_istitle_contains这两个条件类验证title,验证传入的参数title是否等于或包含于driverpresence_of_element_locatedpresence_of_all_elements_located这两个条件验证元素是否出现,传入的参数都是元组类型的locator,如(By.ID,'kw')顾名思义,一个只要一个符合条件的元素加载出来就通过;另一个必须所有符合条件的元素都加载出来才行visibility_of_element_locatedinvisibility_of_element_locatedvisibility_of这三个条件验证元素是否可见,前两个传入参数是元组类型的locator,第三个传入WebElementtext_to_be_present_in_elementtext_to_be_present_in_element_value判断某段文本是否出现在某元素中,一个判断元素的text,一个判断元素的valueframe_to_be_available_and_switch_to_it判断frame是否可切入,可传入locator元组或者直接传入定位方式:id、name、index或WebElementalert_is_present判断是否有alert出现element_to_be_clickable判断元素是否可点击,传入locator显示等待fromseleniumimportwebdriverfromselenium.webdriver.support.waitimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasECfrommon.byimportBydriver=webdriver.Chrome()driver.get('')locator=(By.LINK_TEXT,'贴吧')try:WebDriverWait(driver,20,0.5).until(EC.presence_of_element_located(locator))print(driver.find_element_by_link_text('贴吧').get_attribute('href'))finally:driver.close()隐式等待隐性等待implicitly_wait(xx):设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步。弊端就是程序会一直等待整个页面加载完成,就算你需要的元素加载出来了还是需要等待。,也就是一般情况下你看到浏览器标签栏那个小圈不再转,才会执行下一步,隐性等待对整个driver的周期都起作用,所以只要设置一次即可隐性等待和显性等待可以同时用,但要注意:等待的最长时间取两者之中的大者默认等待时间为0,可以通过下面的方式设置:fromseleniumimportwebdriverdriver=webdriver.Chrome()driver.implicitly_wait(10)#隐式等待,最长10sdriver.get('')ActionChains在selenium当中除了简单的点击动作外,还有一些稍微复杂的动作,就需要用到ActionChains(动作链)这个子模块来满足我们的需求。

ActionChains可以完成复杂一点的页面交互行为,例如元素的拖拽,鼠标移动,悬停行为,内容菜单交互。

它的执行原理就是当调用ActionChains方法的时候不会立即执行,而是将所有的操作暂时储存在一个队列中,当调用perform()方法的时候,会按照队列中放入的先后顺序执行前面的操作。动作链(ActionChains)ActionChains包:frommon.action_chainsimportActionChains动作链move_by_offset(xoffset,yoffset)移动鼠标到指定的x,y位置move_to_element_with_offset(to_element,xoffset,yoffset)将鼠标移动到距某个元素多少距离的位置perform()执行链中的所有动作ActionChains提供的方法作用click(on_element=None)鼠标左键单击传入的元素double_click(on_element=None)双击鼠标左键context_click(on_element=None)点击鼠标右键click_and_hold(on_element=None)点击鼠标左键,按住不放release(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论