动态网页抓取(交互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。它对于不同的错误非常有用,无论是网络连接、代码运行时超时还是找不到数据。