Python爬虫课--第九节 selenium使⽤

tech2024-11-11  15

1 定位元素

find_element_by_id:根据id来查找某个元素 from selenium import webdriver import time driver = webdriver.Chrome() # 打开百度 driver.get('https://www.baidu.com/') # 定位元素 # find_element_by_id:根据id来查找某个元素 driver.find_element_by_id('kw').send_keys('胡歌') time.sleep(2) driver.close() # 引入 from selenium.webdriver.common.by import By driver.find_element(By.ID,'kw').send_keys('胡歌') # 也可以根据ID来查找某个元素 find_element_by_class_name:根据类名查找元素 # find_element_by_class_name:根据类名查找元素 # driver.find_element_by_class_name('s_ipt').send_keys('霍建华') driver.find_element(By.CLASS_NAME,'s_ipt').send_keys('霍建华') find_element_by_name:根据name属性的值来查找元素 # find_element_by_name:根据name属性的值来查找元素 driver.find_element_by_name('wd').send_keys('赵丽颖') driver.find_element(By.NAME,'wd').send_keys('胡歌') find_element_by_tag_name:根据标签名来查找元素,可以找多个元素 # find_element_by_tag_name:根据标签名来查找元素 head = driver.find_element_by_tag_name('head') print(head) 结果 <selenium.webdriver.remote.webelement.WebElement (session="fc02de174c1403f4713731c9580645e4", element="8d7f4712-070d-4e53-b709-ce8860eeaab3")> find_element_by_xpath:根据xpath语法来获取元素 # find_element_by_xpath:根据xpath语法来获取元素 driver.find_element_by_xpath('//input[@id="kw"]').send_keys('袁冰妍') driver.find_element_by_xpath('//*[@id="kw"]').send_keys('袁冰妍') # 简单但是阅读性不太好 find_element_by_css_selector:根据css选择器选择元素 # find_element_by_css_selector:根据css选择器选择元素 # 涉及前端的一些知识点,这个点.代表class #代表id driver.find_element_by_css_selector('.s_ipt').send_keys('陈瑶')

要注意,find_element是获取第⼀个满⾜条件的元素。find_elements 是获取所有满⾜条件的元素

T = driver.find_elements_by_tag_name('input') print(T,len(T))

2 操作表单元素

from selenium import webdriver import time from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get('https://www.baidu.com/') # driver.find_element_by_id('su').send_keys('胡歌') # 不能输入内容 但是没有报错 driver.find_element_by_id('head_wrapper').send_keys('胡歌') # 不能输入内容 但是报错

操作输⼊框:分为两步。 第⼀步:找到这个元素。 第⼆步:使⽤send_keys(value),将数据填充进去

使⽤clear⽅法可以清除输⼊框中的内容 from selenium import webdriver import time from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get('https://www.baidu.com/') # driver.find_element_by_id('su').send_keys('胡歌') # 不能输入内容 但是没有报错 # driver.find_element_by_id('head_wrapper').send_keys('胡歌') # 不能输入内容 但是报错 inputTag = driver.find_element_by_id('kw') inputTag.send_keys('胡歌') time.sleep(3) inputTag.clear() 操作checkbox 因为要选中checkbox标签,在⽹⻚中是通过⿏标点击的。因此想要选中checkbox标签,那么先选中这个标签,然后执⾏click事件 1 rememberTag = driver.find_element_by_name("rememberMe") 2 rememberTag.click()

下面这个没解决

from selenium import webdriver import time driver = webdriver.Chrome() # 打开豆瓣 driver.get('https://www.douban.com/') # 切换到账号密码登录 # 在这用xpath 注意不许有空格 所以删掉 on---但是还是不行 driver.find_element_by_xpath('//li[@class="account-tab-account"]').click() # 选中CheckBox 下次自动登录 driver.find_element_by_id('account-form-remember').click() 操作按钮 操作按钮有很多种⽅式。⽐如单击、右击、双击等。这⾥讲⼀个最常⽤的。就是点击。直接调⽤click函数就可以了 1 inputTag = driver.find_element_by_id('su') 2 inputTag.click() 选择select 具有下拉框的一些情况 select元素不能直接点击。因为点击后还需要选中元素。这时候selenium就专⻔为select标签提供了⼀个类 这么引入 from selenium.webdriver.support.ui import Select 将获取到的元素当成参数传到这个类中,创建这个对象。以后就可以使⽤这个对象进⾏选择了。https://www.17sucai.com/boards/53562.html from selenium import webdriver import time from selenium.webdriver.support.ui import Select driver = webdriver.Chrome() # 打开目标网站 driver.get('https://www.17sucai.com/pins/demo-show?id=5926') # 切换到iframe 因为iframe嵌套了一个页面,跟目标页面一样,如果直接操作目标页面,是无法实现的,所以通过iframe操作 # 还是快捷 需要一个Select类 把要找的参数传递进来 driver.switch_to_frame(driver.find_element_by_id('iframe')) # AttributeError: 'NoneType' object has no attribute 'select_by_value' # 找到下拉框 selectTag = Select(driver.find_element_by_class_name('nojs')) # 选择方式 # 1.根据值来选择 selectTag.select_by_value('AU') # 2.根据索引选择 selectTag.select_by_index(3) 最终登录豆瓣实现了 from selenium import webdriver import time driver = webdriver.Chrome() # 打开豆瓣 driver.get('https://www.douban.com/') # 切换iframe login_frame = driver.find_element_by_xpath('//div[@class="login"]/iframe') driver.switch_to_frame(login_frame) time.sleep(2) # 切换到账号密码登录 # 在这用xpath 注意不许有空格 所以删掉 on---但是还是不行,--后来引入iframe后就可以了 # 自己拷贝的xpath路径是 /html/body/div[1]/div[1]/ul[1]/li[2] driver.find_element_by_xpath('//li[@class="account-tab-account"]').click() # driver.find_element_by_xpath('/html/body/div[@class="account-body login-wrap login-start account-anonymous"]/div[@class="account-body-tabs"]/ul[@class="tab-start"]/li[@class="account-tab-account on"]').click() # 也不行 # 选中CheckBox 下次自动登录 driver.find_element_by_id('account-form-remember').click() # 输入账号密码 driver.find_element_by_id('username').send_keys('xxxxx') driver.find_element_by_id('password').send_keys('xxxxx') # 点击登录按钮 driver.find_element_by_class_name('btn-account').click() # class这个属性如果有空格,会找不到,所以删掉btn

3 ⾏为链

有时候在⻚⾯中的操作可能要有很多步,那么这时候可以使⽤⿏标⾏为链类ActionChains来完成。⽐如现在要将⿏标移动到某个元素上并执⾏点击事件

from selenium import webdriver import time from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get('https://www.baidu.com/') # 定位到输入框 inputTag = driver.find_element_by_id('kw') # 定位到百度按钮 submitBtn = driver.find_element_by_id('su') # 实例化 actions = ActionChains(driver) # 把鼠标移动到输入框 actions.move_to_element(inputTag) # 输入内容 actions.send_keys_to_element(inputTag,'胡歌') # # 点击按钮 百度一下 # actions.move_to_element(submitBtn) # actions.click(submitBtn) # 右键 actions.context_click() # 提交行为链上的操作 actions.perform() driver.find_element_by_id('su').click()

不知为何无法实现,问题留存

# # 点击按钮 百度一下 # actions.move_to_element(submitBtn) # actions.click(submitBtn)

还有更多的⿏标相关的操作 click_and_hold(element):点击但不松开⿏标。 context_click(element):右键点击。 double_click(element):双击。 更多⽅法请参考:http://selenium-python.readthedocs.io/api.html

4 Selenium⻚⾯等待

4.1 Cookie操作

获取所有的cookie

from selenium import webdriver import time from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get('https://www.baidu.com/') cookies = driver.get_cookies() # 返回的是个列表 可以遍历 for cookie in cookies: print(cookie) 结果 {'domain': '.baidu.com', 'httpOnly': False, 'name': 'H_PS_PSSID', 'path': '/', 'secure': False, 'value': '7548_32617_1443_31253_32676_32117_31708_32691_26350'} {'domain': '.baidu.com', 'expiry': 1631092481, 'httpOnly': False, 'name': 'BAIDUID', 'path': '/', 'secure': False, 'value': '3F7686E0DBFCA5627AC2F6CD100CD7B5:FG=1'} {'domain': 'www.baidu.com', 'httpOnly': False, 'name': 'BD_HOME', 'path': '/', 'secure': False, 'value': '1'} {'domain': '.baidu.com', 'expiry': 3747040128, 'httpOnly': False, 'name': 'PSTM', 'path': '/', 'secure': False, 'value': '1599556482'} {'domain': 'www.baidu.com', 'expiry': 1600420481, 'httpOnly': False, 'name': 'BD_UPN', 'path': '/', 'secure': False, 'value': '12314753'} {'domain': '.baidu.com', 'expiry': 3747040128, 'httpOnly': False, 'name': 'BIDUPSID', 'path': '/', 'secure': False, 'value': '3F7686E0DBFCA56239CF6807456D803F'}

根据cookie的name获取cookie

print(driver.get_cookie('BIDUPSID')) 结果 {'domain': '.baidu.com', 'expiry': 3747040128, 'httpOnly': False, 'name': 'BIDUPSID', 'path': '/', 'secure': False, 'value': '3F7686E0DBFCA56239CF6807456D803F'}

删除某个cookie

# 删除cookie # 先删除再获取,则获取不到 driver.delete_cookie('BIDUPSID') print('----------------------------') print(driver.get_cookie('BIDUPSID')) 结果 ---------------------------- ---------------------------- None

4.2 ⻚⾯等待

现在的⽹⻚越来越多采⽤了 Ajax 技术,这样程序便不能确定何时某个元素完全加载出来了。如果实际⻚⾯等待时间过⻓导致某个dom元素还没出来,但是你的代码直接使⽤了这个WebElement,那么就会抛出NullPointer的异常。为了解决这个问题。所以 Selenium 提供了两种等待⽅式:⼀种是隐式等待、⼀种是显式等待

隐式等待:调⽤driver.implicitly_wait。那么在获取不可⽤的元素之前,会 先等待几秒中的时间

而time的话获取到没到都要等几秒

driver.implicitly_wait(5) # 获取到了就直接运行,获取不到就等待几秒 driver.find_element_by_id('kwssss').send_keys('胡歌')

显示等待:显示等待是表明某个条件成⽴后才执⾏获取元素的操作。也可以在等待的时候指定⼀个最⼤的时间,如果超过这个时间那么就抛出⼀个异常。显示等待应该使⽤selenium.webdriver.support.excepted_conditions 期望的条件和selenium.webdriver.support.ui.WebDriverWait来配合完成

⼀些其他的等待条件 presence_of_element_located:某个元素已经加载完毕了。 presence_of_all_elements_located:⽹⻚中所有满⾜条件的元素都加载完毕了。 element_to_be_clickable:某个元素是可以点击了。 更多条件请参考:http://selenium-python.readthedocs.io/waits.html

5 打开多窗⼝和切换⻚⾯

有时候窗⼝中有很多⼦tab⻚⾯。这时候肯定是需要进⾏切换的。selenium提供了⼀个叫做switch_to_window来进⾏切换,具体切换到哪个⻚⾯,可以从driver.window_handles中找到

from selenium import webdriver import time from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get('https://www.baidu.com/') driver.execute_script('window.open("https://www.douban.com/")') from selenium import webdriver import time from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get('https://www.baidu.com/') driver.execute_script('window.open("https://www.douban.com/")') # driver.get('https://www.douban.com/') # driver.close() # 百度打开的一瞬间 被关闭 time.sleep(2) driver.quit() # 两个都关闭了 from selenium import webdriver import time from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get('https://www.baidu.com/') driver.execute_script('window.open("https://www.douban.com/")') # 打开豆瓣 # driver.get('https://www.douban.com/') # driver.close() # 百度打开的一瞬间 被关闭 # time.sleep(2) # # # # driver.quit() # 两个都关闭了 driver.find_element_by_id('kw').send_keys('胡歌') # 操作的是百度页面 print(driver.current_url) # 打印网址 # https://www.baidu.com/ # 切换到豆瓣 driver.switch_to_window(driver.window_handles[1]) print(driver.current_url) # 打印网址 https://www.douban.com/
最新回复(0)