Skip to content

Latest commit

 

History

History
344 lines (252 loc) · 8.06 KB

File metadata and controls

344 lines (252 loc) · 8.06 KB
Error in user YAML: (<unknown>): could not find expected ':' while scanning a simple key at line 3 column 1
---
- oeasy Python 0559
- 这是 oeasy 系统化 Python 教程,从基础一步步讲,扎实、完整、不跳步。愿意花时间学,就能真正学会。
本教程同步发布在: 

     个人网站: `https://oeasy.org` 
     蓝桥云课: `https://www.lanqiao.cn/courses/3584` 
     GitHub: `https://github.com/overmind1980/oeasy-python-tutorial` 
     Gitee: `https://gitee.com/overmind1980/oeasypython` 
---

安装环境

回忆

  • 上次我们尝试用selenium访问了一个网页
    • 原理上 selenium 和 requests发请求 差不多
    • 都是发送请求
    • 只不过requests是直接发送请求
    • selenium用真实的浏览器发送请求
      • 可以动态加载一些后台的一些数据
  • 得到网页源文件之后
    • 都可以xpath进行筛选提取

图片描述

  • 用selenium还可以做些
    • 什么独特的东西么?🤔

先复现环境

pip3 install selenium
cd Code
wget https://labfile.oss.aliyuncs.com/courses/3584/geckodriver-v0.35.0-linux64.tar.gz
tar xf geckodriver-v0.35.0-linux64.tar.gz
echo $PATH
sudo cp ./geckodriver /usr/bin
geckodriver
  • 安装驱动和类库

图片描述

  • ctrl + c
    • 结束进程

查看文档

  • 可以通过selenium直接找到元素
    • 然后填写表单

图片描述

  • 最后点击按钮

观察网页

图片描述

找到文本框的name

  • 找到有一个name为my-text的input文本框
    • 稍后要在这个文本框框里面写字

图片描述

模拟键盘输入

import time

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

driver = webdriver.Firefox()
driver.get("https://www.selenium.dev/selenium/web/web-form.html")
text_box = driver.find_element(by=By.NAME, value="my-text")
text_box.send_keys("Selenium")
time.sleep(5)
driver.quit()
  • 本机执行可以成功

图片描述

  • 我们试试蓝桥

找到提交按钮标签

  • 提交按钮的标签是button

图片描述

模拟按钮点击

  • 使用css的选择器
    • 选择元素button
      • 提交表单
import time

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

driver = webdriver.Firefox()
driver.get("https://www.selenium.dev/selenium/web/web-form.html")
text_box = driver.find_element(by=By.NAME, value="my-text")
text_box.send_keys("Selenium")
submit_button = driver.find_element(by=By.CSS_SELECTOR, value="button")
submit_button.click()
time.sleep(15)
driver.quit()
  • 确实可以提交

提交之后的结果页

图片描述

  • 源代码如下

图片描述

  • 提交之后可以对返回页进行判断么?

返回页判断

import time

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

driver = webdriver.Firefox()
driver.get("https://www.selenium.dev/selenium/web/web-form.html")
text_box = driver.find_element(by=By.NAME, value="my-text")
text_box.send_keys("Selenium")
submit_button = driver.find_element(by=By.CSS_SELECTOR, value="button")
submit_button.click()
time.sleep(15)
message = driver.find_element(by=By.ID, value="message")
value = message.text
print(value == "Received!")
driver.quit()
  • 提交表单后
    • driver再去查找元素
    • 就在新页面面查找了

图片描述

  • 可以不点击按钮
  • 而按照回车的方式提交么?

回车提交

import time

from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium import webdriver

driver = webdriver.Firefox()
driver.get("https://www.selenium.dev/selenium/web/web-form.html")
text_box = driver.find_element(by=By.NAME, value="my-text")
text_box.send_keys("Selenium")
text_box.send_keys(Keys.ENTER)
time.sleep(15)#延迟时间等待响应
message = driver.find_element(by=By.ID, value="message")
value = message.text
print(value == "Received!")
time.sleep(5)
driver.quit()
  • 需要导入一个Keys
    • 确实可以发送回车到文本框
    • 然后提交
  • 我想得到整个提交后的网页生成的元素树可以吗?

得到元素树

import time

from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
from lxml import etree

driver = webdriver.Firefox()
driver.get("https://www.selenium.dev/selenium/web/web-form.html")
text_box = driver.find_element(by=By.NAME, value="my-text")
text_box.send_keys("Selenium")
text_box.send_keys(Keys.ENTER)
time.sleep(15)
# 获取页面源代码
source = driver.page_source
et_html = etree.HTML(source)
str_html = etree.tostring(et_html,pretty_print=True).decode()
print(str_html)
driver.quit()
  • 生成结果

图片描述

  • 我们可以那这一套用到百度上么?

询问ai

图片描述

  • ai给出了代码
    • 代码可以执行
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

# 创建Firefox浏览器实例
driver = webdriver.Firefox()

# 打开百度首页
driver.get('https://www.baidu.com')

# 找到搜索框元素
search_box = driver.find_element('name', 'wd')

# 在搜索框中输入'oeasy'
search_box.send_keys('oeasy')

# 模拟按下回车键进行搜索
search_box.send_keys(Keys.ENTER)

# 可以添加一些等待时间,以便查看搜索结果(这里等待5秒)
time.sleep(5)

# 关闭浏览器
driver.quit()
  • name为wd的元素究竟指的是什么?

找到位置

图片描述

  • 想要搜索之后
    • 获得搜索记录的标题

再问ai

图片描述

编写代码

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

# 创建Chrome浏览器实例
driver = webdriver.Firefox()
driver.get('https://www.baidu.com')
search_box = driver.find_element('name', 'wd')
search_box.send_keys('oeasy')
search_box.send_keys(Keys.ENTER)
time.sleep(2)
title_elements = driver.find_elements(By.CSS_SELECTOR, 'h3.t')
for title_element in title_elements:
    print(title_element.text)
driver.quit()
  • 确实可以搜索到

图片描述

延时控制

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 创建 Firefox 浏览器实例
driver = webdriver.Firefox()

# 打开百度首页
driver.get('https://www.baidu.com')

# 定位搜索框并输入搜索词
search_box = driver.find_element(By.NAME, 'wd')
search_box.send_keys('oeasy')
search_box.send_keys(Keys.ENTER)

try:
    # 等待搜索结果的相关元素出现
    wait = WebDriverWait(driver, 10)  # 最多等待 10 秒
    title_elements = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'h3.t')))

    # 打印每个标题元素的文本内容
    for title_element in title_elements:
        print(title_element.text)
finally:
    # 关闭浏览器
    driver.quit()
  • 实现

图片描述

总结

  • 这次 使用selenium模拟了浏览器的行为
    • 模拟了填写表单的过程
    • 有两种方式可以填写表单
      • 可以 填写表单 + 加回车
      • 也可以 填写表单 + 点击按钮
  • selenium 和 其他爬虫工具相比
    • 可以利用deckodriver
      • 驱动firefox和网页做出
        • 交互动作
        • interaction
  • 还有什么交互动作可以做吗?🤔
  • 下次再说👋

  • 本文来自 oeasy Python 系统教程。
  • 想完整、扎实学 Python,
  • 搜索 oeasy 即可。