动态网页抓取(交互selenium模拟执行方法总结(一):浏览器模拟用法)

优采云 发布时间: 2022-01-20 07:22

  动态网页抓取(交互selenium模拟执行方法总结(一):浏览器模拟用法)

  内容

  这里解释了用法,安装和配置就不详细解释了。我最喜欢的浏览器驱动程序是 ChromeDriver 和无界面的 PhantomJS。

  1:浏览器信息测试1.初始化浏览器

  使用以下代码初始化浏览器

  from selenium import webdriver

# 把浏览器对象赋值为browser对象,然后就可以进行模拟浏览器操作

browser = webdriver.Chrome()

  2.访问网页

  browser.get('url地址')

# 这个是打印网页源代码

print(browser.page_source)

browser.close() # 处理完后要关闭这个对象

  二:找到节点

  如果我们要执行一个操作,比如填写表单、模拟点击等,或者在输入框中输入文本,首先要知道位置,selenium提供了一系列查找节点的方法,如下。

  1.单节点

  如何找到 | 指示

  -|-|-

  find_element_by_id | 按 id 查找标签

  find_element_by_name | 按名称属性查找标签

  find_element_by_xpath | 通过 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 | 通过 css 选择器查找标签

  另一种通用的方法是给find_element()传递两个参数,一个是By。search方法,另一个是value。例如 find_element(By.ID, id) 和 find_element_by_id 的结果是一样的。

  2.多个节点

  查找多个节点时,在查找单个节点的方法中直接加s,如find_elements_by_name或find_elements(By.NAME,name),列表中的每个节点都是WebElement类型。

  三:测试动作1.简单交互

  Selenium 可以驱动浏览器执行一些操作,也就是让浏览器模拟一些动作。下面是一些常用方法的总结。

  方法 | 描述

  -|-|-

  发送键 | 输入文字

  明确 | 明文

  点击 | 点击按钮

  2.特殊互动

  有些交互操作没有具体的执行对象,比如鼠标拖拽、键盘按键等,这些比较复杂的动作是在一个动作链中执行的。此处暂时不用,暂且略过。

  3. 模拟运行 JavaScript

  execute_script() 方法可以模拟运行JavaScript,基本上所有复杂的动作都可以通过执行JavaScript来实现。

  四:获取节点信息

  使用 get_attribute() 方法获取节点的属性。

  使用 text 属性获取节点的文本值。

  使用 id 属性获取节点 id。

  使用 location 属性获取节点在页面上的相对位置。

  使用 tag_name 属性获取标签名称。

  使用 size 属性获取节点的大小。

  五:切换子页面Frame

  一个网页的节点之一是iframe,它是一个子框架,相当于页面的一个子页面。网页打开时,默认是在父Frame中操作。要获取子Frame的节点,需要使用switch_to.frame()方法进行切换。

  使用 switch_to.parent_frame() 获取父页面的内容。

  六、延迟请求

  在 selenium 中,get() 方法会在网页框架加载完成后结束执行。此时如果获取到网页源代码,则可能不是浏览器完全加载的页面。如果有额外的ajax请求,网页源代码可能不会成功。要获取,需要延迟并等待一定的时间,以确保动态网页的所有源代码都加载完毕。

  等待有两种方式,一种是隐式等待,另一种是显式等待。

  1.隐式等待

  隐式等待是一般等待。执行测试时,等待下一步后,使用implicitly_wait(),参数为时间。

  2.显式等待

  隐式等待不是那么好,它们只是指定一个固定的时间,网页的加载时间会受到网络条件的影响。

  这里有一个显式的等待方法,就是指定要搜索的节点,然后指定一个最大等待时间。如果在指定时间内加载,它将返回。如果无法加载,则会抛出异常。

  一个例子如下:

  from selenium import webdriver

from selenium.webdriver.common.by import By

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

browser = webdriver.Chrome()

browser.get('url地址')

# 先指定最长等待时间为20s

wait = WebDriverWait(browser,20)

# 传入等待条件expected_conditions,这里的presence_of_element_located代表节点出现的意思

input = wait.until(EC.presence_of_element_located(By.ID,'a'))

# 按钮等待条件,这里的element_to_be_clickable表示可点击的,10秒内能点击,就成功

button = wait.until(EC.element_to_be_clickable(By.CSS_SELECTOR,'.btn-ss'))

print(input,button)

  以下是所有等待条件:

  等待条件 | 描述

  -|-|-

  标题是 | 标题是东西

  标题_收录 | 标题收录一些东西

  Presence_of_all_elements_located | 节点是否加载

  visibility_of_element_located | 节点是否可见

  可见性_of | 节点是否可见,传入节点对象

  Presence_of_all_elements_located | 加载所有节点

  text_to_be_present_in_element | 节点文本收录文本

  text_to_be_present_in_element_value | 节点值收录文本

  frame_to_be_available_and_switch_to_it | 负载和开关

  invisibility_of_element_located | 节点不可见

  element_to_be_clickable | 节点可点击

  staleness_of | 判断DOM中是否存在节点,可以判断页面是否刷新过

  element_to_be_selected | 可以选择节点,传入节点对象

  element_located_to_be_selected | 可以选择节点,传入一个定位元组

  element_selection_state_to_be | 传入节点对象和状态,相等返回True,否则返回False

  element_located_selection_state_to_be | 传入定位元组和状态,相等返回True,否则返回False

  alert_is_present | 是否存在警报

  七:前进后退

  Selenium 测试使用 back() 方法返回,并使用 forward() 方法进行。

  八:饼干

  使用 selenium 可以轻松操作 Cookie。

  使用 get_cookies() 方法获取所有 cookie。

  使用 add_cookies() 方法添加 Cookie。

  使用 delete_all_cookies() 和 delete_cookies() 方法删除 Cookie。

  八:标签处理

  访问网页时,标签页是一个一个打开的,标签页也可以在 selenium 中进行操作。

  browser.execute_script('windows.open()')

print(window_handles)

browser.switch_to_window(browser.window_handles[1])

  使用 execute_script 方法执行 JavaScript 语句,其中 window_handles 获取所有当前打开的选项卡并返回选项卡的代码名称列表。使用 browser.window_handles[index] 跳转到索引索引对应的选项卡。

  九:捕捉异常

  捕获异常是一种常用的方法。该语句是 try-except-finally。它对于不同的错误非常有用,无论是网络连接、代码运行时超时还是找不到数据。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线