09 Python网络爬虫 Selenium模块

1. Selenium模块简介

Selenium是一个自动化测试工具,用于模拟用户在网页上的行为并进行测试。它提供了一组API,可以用多种编程语言(如Python,Java,C#等)编写测试脚本。使用Selenium可以模拟用户在浏览器中的交互,例如点击、输入、滚动、切换窗口等,也可以对网页进行截图、验证元素属性和内容等。

Selenium可以与多种浏览器(如Chrome,Firefox,IE等)进行集成,并支持多种操作系统(如Windows,Linux,Mac等)。它还可以与其他测试框架(如JUnit和TestNG)进行集成,以实现更复杂的测试。

Selenium的主要优点是其强大的自动化能力和灵活性。它可以用于测试各种Web应用程序,包括单页面应用程序和响应式设计网站。

2. 自动化测试

  1. 使用Chrome浏览器驱动程序创建一个WebDriver对象,即创建了一个Chrome浏览器的实例。
  2. 调用WebDriver对象的get()方法,发送请求并打开百度首页。
  3. 调用WebDriver对象的save_screenshot()方法,将当前页面保存为一张名为"baidu.png"的图片。
  4. 输出百度首页的title标签的文本内容。
  5. 关闭Chrome浏览器。
from selenium import webdriver

# 1.设置chrome浏览器驱动调用
# 1.1 没有设置到python.exe的目录中则需要指定驱动的位置
# driver = webdriver.Chrome(executable_path="E:\Anaconda3\chromedriver.exe")
# 1.2 设置位置
driver = webdriver.Chrome()

# 2.发送请求url
driver.get("https://www.baidu.com/")

# 3.将网页保存图片,截图
driver.save_screenshot("baidu.png")

# 4.输出百度网页的title标签
print(driver.title)

# 5.关闭谷歌浏览器
driver.quit()

3. 无界面运行

  1. 使用PhantomJS浏览器驱动程序创建一个WebDriver对象,即创建了一个PhantomJS浏览器的实例。
  2. 调用WebDriver对象的get()方法,发送请求并打开百度首页。
  3. 调用WebDriver对象的save_screenshot()方法,将当前页面保存为一张名为"baidu2.png"的图片。
  4. 关闭PhantomJS浏览器。

总的来说,下面代码的功能和上面提到的例子类似,只是使用了PhantomJS浏览器代替了Chrome浏览器,实现了打开百度首页,保存截图并关闭浏览器的功能。不同的是,PhantomJS是一个无界面浏览器,可以在后台运行,因此不会打开浏览器窗口,适用于一些需要自动化执行的任务。

from  selenium import webdriver

# 1.指定phantomJS的路径
driver = webdriver.PhantomJS(executable_path="E:\phantomjs-2.1.1-windows\bin\phantomjs.exe")

# 2.指定url
driver.get("https://www.baidu.com/")

# 3.网页保存为图片
driver.save_screenshot("baidu2.png")

# 4.关闭
driver.quit()

4. 点击事件

  1. 使用Chrome浏览器驱动程序创建一个WebDriver对象,即创建一个Chrome浏览器的实例。
  2. 调用WebDriver对象的get()方法,发送请求并打开智联招聘首页。
  3. 查找id值为"k"的搜索框,并在其中输入关键字"工程师"。
  4. 查找class值为"searchBtn"的搜索按钮,并点击它。
  5. 延时10秒,等待搜索结果页面加载完成。
  6. 关闭Chrome浏览器。

下面代码的功能是打开智联招聘首页,输入关键字"工程师"并搜索,等待搜索结果页面加载完成,最后关闭Chrome浏览器。

通过By类中的ID和CLASS_NAME方法实现对元素的定位

通过send_keys()和click()方法实现对元素的操作

通过time模块的sleep()方法实现等待时间。

from selenium import webdriver
import time
from selenium.webdriver.common.by import  By

# 1.调用浏览器的webdriver的驱动
driver = webdriver.Chrome()

# 2.指定url
driver.get("https://gree.zhiye.com/")

# 3.设置搜索框的内容(查找标签的id值)
driver.find_element(By.ID,'k').send_keys("工程师")

# 4.点击搜索按钮(查找class的值)
driver.find_element(By.CLASS_NAME,'searchBtn').click()

# 5.延时关闭
time.sleep(10)

# 6.关闭浏览器
driver.quit()

5. 常用属性和方法

* driver.page_source 当前标签页浏览器渲染之后的网页源代码
* driver.currrent_url 当前标签页的url
* driver.close() 关闭当前标签页,如果只有一个则关闭整个浏览器
* driver.quit() 关闭浏览器
* driver.forward() 页面的前进
* driver.back() 页面的后退
* driver.screen_shot(img_name)页面截图
from selenium import webdriver
import time
from selenium.webdriver.common.by import  By

# 1.调用驱动
driver =webdriver.Chrome()

# 2.设置请求的内容
driver.get("https://www.baidu.com")

# 3.渲染后的网页源代码
# print(driver.page_source)

# 4.获取当前页的标签url
# print(driver.current_url)

# 5.关闭当前页
# 5.1 再打开一个标签页
driver.get("https://gree.zhiye.com/")
# 5.2 延时
time.sleep(2)
# 5.3  关闭当前页
driver.close()

# 6.页面的后退
driver.find_element(By.ID,"kw").send_keys("python")
driver.find_element(By.ID,'su').click()
time.sleep(4)
# 6.1 返回百度首页
driver.back()
# 6.2 前进一页 python搜索页
time.sleep(4)
driver.forward()
time.sleep(4)

# 7.页面的截图
driver.save_screenshot("python.png")

# 8.延时关闭
time.sleep(4)

6.定位标签获取标签对象的方法

* find_element(By.ID,"") 返回一个元素
* find_element(By.CLASS_NAME,"") 返回类名获取元素列表
* find_element(By.Name,"") 根据标签的name属性值返回包含标签对象元素的列表
* find_element(By.XPATH,'') 返回一个包含元素的列表
* find_element(By.PARTIAL_LINK_TEXT,"")根据链接包含的 文本获取元素列表
* find_element(By.LINK_TEXT,"")根据链接文本获取元素列表
* find_element(By.TAG_NAME,"") 根据标签名称获取元素列表
* find_element(By.CSS_SELECTOR,"") 根据CSS选择器来获取元素列表

注意事项:
   1.find_element和find_elements区别
      *有s代表返回列表,没有s返回匹配到第一个标签对象
      * find_element匹配不到则抛出异常,find_elements匹配不到则返回空列表
   2.LINK_TEXT和PARTIAL_LINK_TEXT区别:
      全部文本和包含某个文本
import time
from selenium import webdriver
from selenium.webdriver.common.by import By

# 1.获取webdriver
driver = webdriver.Chrome()

# 2.设置url
driver.get("https://www.xbqg88.net/243_243094/2.html")

# 3.1返回一个元素
print(driver.find_element(By.ID,"play"))

# 3.2 根据类名获取元素列表
print(driver.find_element(By.CLASS_NAME,'con_top'))

# 3.3 根据标签名name获取元素列表
print(driver.find_element(By.NAME,"keywords"))

# 3.4 根据xpath语法返回元素列表
print(driver.find_element(By.XPATH,"//h1"))

# 3.5 根据链接文本全部获取元素列表
print(driver.find_element(By.LINK_TEXT,"下一页"))

# 3.6 根据链接文本包含获取元素列表
'''
[<selenium.webdriver.remote.webelement.WebElement (session="58cb1ac5a6d87d0cffe51e9c4a9f88bc", element="D57BF99CCBEB1D339363D2980540B411_element_19")>,
 <selenium.webdriver.remote.webelement.WebElement (session="58cb1ac5a6d87d0cffe51e9c4a9f88bc", element="D57BF99CCBEB1D339363D2980540B411_element_20")>, 
 <selenium.webdriver.remote.webelement.WebElement (session="58cb1ac5a6d87d0cffe51e9c4a9f88bc", element="D57BF99CCBEB1D339363D2980540B411_element_21")>, 
 <selenium.webdriver.remote.webelement.WebElement (session="58cb1ac5a6d87d0cffe51e9c4a9f88bc", element="D57BF99CCBEB1D339363D2980540B411_element_22")>, 
 <selenium.webdriver.remote.webelement.WebElement (session="58cb1ac5a6d87d0cffe51e9c4a9f88bc", element="D57BF99CCBEB1D339363D2980540B411_element_23")>, 
 <selenium.webdriver.remote.webelement.WebElement (session="58cb1ac5a6d87d0cffe51e9c4a9f88bc", element="D57BF99CCBEB1D339363D2980540B411_element_24")>, 
 <selenium.webdriver.remote.webelement.WebElement (session="58cb1ac5a6d87d0cffe51e9c4a9f88bc", element="D57BF99CCBEB1D339363D2980540B411_element_25")>, 
 selenium.webdriver.remote.webelement.WebElement (session="58cb1ac5a6d87d0cffe51e9c4a9f88bc", element="D57BF99CCBEB1D339363D2980540B411_element_26")>, <selenium.webdriver.remote.webelement.WebElement (session="58cb1ac5a6d87d0cffe51e9c4a9f88bc", element="D57BF99CCBEB1D339363D2980540B411_element_27")>, <selenium.webdriver.remote.webelement.WebElement (session="58cb1ac5a6d87d0cffe51e9c4a9f88bc", element="D57BF99CCBEB1D339363D2980540B411_element_28")>, <selenium.webdriver.remote.webelement.WebElement (session="58cb1ac5a6d87d0cffe51e9c4a9f88bc", element="D57BF99CCBEB1D339363D2980540B411_element_29")>, <selenium.webdriver.remote.webelement.WebElement (session="58cb1ac5a6d87d0cffe51e9c4a9f88bc", element="D57BF99CCBEB1D339363D2980540B411_element_30")>, <selenium.webdriver.remote.webelement.WebElement (session="58cb1ac5a6d87d0cffe51e9c4a9f88bc", element="D57BF99CCBEB1D339363D2980540B411_element_31")>]

'''
print(driver.find_elements(By.PARTIAL_LINK_TEXT,"章"))

# 3.7 根据标签名获取元素列表
print(driver.find_element(By.TAG_NAME,'a'))

# 3.8 根据CSS选择器获取元素列表
print(driver.find_element(By.CSS_SELECTOR,"div#content"))
driver.quit()

7.标签对象文本内容和属性值

* element.click()  对元素执行点击操作
* element.send_keys(data) 对输入框输入数据
* element.text 获取标签对象的文本内容
* element.get_attribute("属性名") 获取属性值
from selenium  import webdriver
import time
from selenium.webdriver.common.by import By

# 1.调用
driver = webdriver.Chrome()

# 2.设置url地址
driver.get("https://www.xbqg88.net/243_243094/2.html")

# 3.1 定位第一个a标签点击操作
driver.find_element(By.TAG_NAME,'a').click()

# 3.2 定位wd的标签输入 一念永恒
driver.find_element(By.ID,"wd").clear()
driver.find_element(By.ID,"wd").send_keys("一念永恒")

# 3.3 获取element对象文本内容
data = driver.find_element(By.XPATH,"//h1")
print(data.text)

# 3.4 获取element对象属性值
attrList = driver.find_elements(By.LINK_TEXT,'下一页')
print(attrList[0].get_attribute('href'))

time.sleep(4)
driver.quit()

8.  标签页切换

  1. 使用Chrome浏览器驱动程序创建一个WebDriver对象,即创建了一个Chrome浏览器的实例。
  2. 调用WebDriver对象的get()方法,打开百度首页。
  3. 查找id值为"kw"的搜索框,并在其中输入关键字"python"。
  4. 查找id值为"su"的搜索按钮,并点击它。
  5. 使用execute_script()方法执行JavaScript代码,在浏览器中打开一个新的标签页并跳转到搜狗搜索。
  6. 使用window_handles属性获取当前浏览器的所有窗口句柄列表,通过switch_to.window()方法切换到不同的标签页。首先切换回百度首页,然后再切换到搜狗搜索。
  7. 延时6秒,关闭Chrome浏览器。

下面段代码的功能是在百度上搜索关键字"python",然后打开搜狗搜索页面,最后再切换回百度首页。

通过By类中的ID方法实现了对元素的定位

通过send_keys()和click()方法实现了对元素的操作

通过execute_script()方法实现了在浏览器中执行JavaScript代码

通过window_handles属性和switch_to.window()方法实现了标签页的切换

通过time模块的sleep()方法实现了等待时间。

from selenium import webdriver
import time
from selenium.webdriver.common.by import By

# 1.获取浏览器驱动
driver = webdriver.Chrome()

# 2.打开第一个标签页
driver.get("https://www.baidu.com")
time.sleep(1)

# 3.设置搜索框
driver.find_element(By.ID,"kw").send_keys("python")
time.sleep(1)

# 4.点击按钮
driver.find_element(By.ID,'su').click()
time.sleep(1)

#  5.通过执行js代码打开一个新的 标签页
js = "window.open('http://www.sogou.com')"
driver.execute_script(js)
time.sleep(1)

# 6.标签页的切换
# 6.1 获取当前浏览器的所有窗口标签页 列表
windows = driver.window_handles

# 6.2 根据窗口索引进行切换 切换到百度
driver.switch_to.window(windows[0])
time.sleep(2)

# 6.3 切换搜狗
driver.switch_to.window(windows[1])

# 7.关闭浏览器
time.sleep(6)
driver.quit()

9. iframe标签切换

使用Selenium模块在QQ邮箱登录界面中,用iframe标签进行账户登录和页面切换

from selenium import webdriver
from selenium.webdriver.common.by import  By
import time

# 1.获取浏览器的驱动
driver = webdriver.Chrome()

# 2.打开标签页
driver.get("https://mail.qq.com/")
time.sleep(2)

# 3.根据id定位iframe的标签对象
login_frame = driver.find_element(By.ID,
            "ptlogin_iframe")

# 4.切换到iframe的标签对象
driver.switch_to.frame(login_frame)

# 5.定位到邮箱账户
driver.find_element(By.XPATH,"//*[@id='u']")\
    .send_keys("1561940378@qq.com")
time.sleep(2)

# 6.定位到密码框
driver.find_element(By.XPATH,"//*[@id='p']")\
    .send_keys("***********")
time.sleep(2)

# 7.定位登录按钮
driver.find_element(By.XPATH,"//*[@id='login_button']").click()
time.sleep(2)

# 8.切换iframe
# 8.1 获取所有的标签页
windows = driver.window_handles
# 8.2 切换到第一个标签页
driver.switch_to.frame(windows[0])

# 8.3 获取content 值
content = driver.find_element(By.ID,'useraddr').text
print(content)

time.sleep(6)

driver.quit()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值