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

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/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值