可见即可爬:Selenium

Selenium是通过拖放控件的方式设计UI,设计是什么样,运行就是什么样。
一.安装Selenium和WebDriver
1.安装Selenium
pip安装

pip install selenium

离线安装
在该网址中找到https://www.lfd.uci.edu/~gohlke/pythonlibs/#lxmlselenium的包
然后解压到该目录下,cmd命令cd到该目录下,执行如下命令

pip install selenium‑3.141.0‑py3‑none‑any.whl

2.安装WebDriver
2.1Chrome版本的WebDriver称为ChromeDriver
ChromeDriver的官网https://chromedriver.chromium.org/
2.1.1使用ChromeDriver:
下载下来的ChromeDriver.exe是一个可执行文件,要将ChromeDriver.exe文件添加到PATH环境变量中,这样在任何路径下都可以执行ChromeDriver。或者将下载下来的ChromeDriver放到指定目录下,在使用ChromeDriver时指定其路径即可
2.1.2
在python中使用ChromeDriver

from selenium import webdriver
browser = webdriver.Chrome()

执行上述代码会立刻启动一个Chrome浏览器的实例,也可以通过Chrome类的构造方法指定ChromeDriver的路径

from selenium import webdriver
browser = webdriver.Chrome('./webdriver/ChromeDriver')

2.2装Edge WebDriver
下载地址https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
2.2.1在python中使用Edge WebDriver

from selenium import webdriver
browser = webdriver.Edge()

同样也可以指定Web WebDriver路径;可类比Chrome
三.Selenium的基本使用方法
3.1打开浏览器

from selenium import webdriver
browser = webdriver.Chrome('./webdriver/chromedriver')
browser.get('https://www.jd.com')

3.2控制浏览器页面的控件
模拟按键,首先需要找到接收按键动作的节点
Selenium支持多种方式查找节点,如通过id属性,通过class属性。然后可以通过send_keys方法模拟按键的动作

from selenium import webdriver
browser = webdriver.Chrome('./webdriver/chromedriver.exe')
browser.get('https://www.jd.com')
input = browser.find_element_by_id('key')
input.send_keys('Python从菜鸟到高手')
input.send_keys(Keys.ENTER)

完整代码

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
browser = webdriver.Chrome('./webdriver/chromedriver.exe)
try:
    browser.get('https://www.jd.com')
    # 根据id的属性值来查找搜索框
    input = browser.find_element_by_id('key')
    # 使用send_keys方法向搜索框中输入文本
    input.send_keys('Python从菜鸟到高手')
    # 使用send_keys方法按下ENTER键
    input.send_keys(Keys.ENTER)
    # 设置WebDriverWait对象,设置等待时间(4秒)
    wait = WebDriverWait(browser,4)
    # 等待搜索页面显示(通过查找id值为J_goodsList的节点判断搜索页面是否显示)
    wait.until(ec.presence_of_all_elements_located((By.ID,'J_goodsList')))
    # 显示搜索页面的标题
    print(browser.title)
    # 显示搜索页面的URL
    print(browser.current_url)
    # 显示搜索页面的代码
    print(browser.page_source)
    # 关闭浏览器
    browser.close()

except Exception as e:
    print(e)
    browser.close()

在上面代码使用了WebDriverWait类,该类是为了在执行的过程中等待一段时间,这里设置为4秒。这是由于按下ENTER键后,并不一定马上显示搜索结果,需要一定的延长,但python程序不会等待搜索结果出来再往下继续执行下去,就会造成python程序已经运行到处理搜索结果页面的位置时,搜索结果页面还没显示出来。所以使用WebDriverWait类的until方法判断搜索结果页面是否显示完成。
四.查找节点
4.1查找单个节点
find_element开头的方法都是用于查找单个节点的API.
如下图所示
可见即可爬:Selenium
上述API列表可以看到,Selenium支持通过多种方式查找节点,如XPath、CSS选择器、class属性、id属性、标签名等。这些方法使用都一样,只是需要传入不同的参数值
本例通过使用Selenium通过id属性、name属性、和class属性获取表单中特定的input节点,并自动输入表单的内容

from selenium import webdriver
from selenium.webdriver.common.by import By
# 不支持本地网页
browser = webdriver.Chrome('./webdriver/chromedriver')
try:
    browser.get('http://localhost/demo.html')
    input = browser.find_element_by_id('name')
    input.send_keys('王军')
    input = browser.find_element_by_id('age')
    input.send_keys('30')

    input = browser.find_element_by_name('country')
    input.send_keys('中国')

    input = browser.find_element_by_class_name('myclass')
    input.send_keys('4000')

    # 或下面的代码
    input = browser.find_element(By.CLASS_NAME,'myclass')
    input.clear()  # 不清空  追加
    input.send_keys('8000')



except Exception as e:
    print(e)
    browser.close()

4.2查找多个节点
查找多个节点返回的是一个列表,而查找单个节点返回的是一个节点
若没有符合条件的节点,就会返回空列表
这些API都是以find_elements开头的方法
uploading-image-874268.png

本例使用Selenium通过节点名查找所有符合条件的节点,并输入节点本身、符合条件的节点总数以及第一个符合条件的节点的文本

from selenium import webdriver
from selenium.webdriver.common.by import By
# 不支持本地网页
browser = webdriver.Chrome('./webdriver/chromedriver')
try:
    browser.get('https://www.jd.com')
    input = browser.find_elements_by_tag_name('li')

    print(input)
    print(len(input))
    print(input[0].text)
    input = browser.find_elements(By.TAG_NAME,'ul')
    print(input)
    print(input[0].text)
    
    browser.close()

except Exception as e:
    print(e)
    browser.close()

4.5节点交互
例如click方法可以模拟单击节点的动作
本例使用Selenium通过模拟浏览器单击动作循环单击页面上的6个按钮,单击每个按钮后,按钮下方的div就会按照按钮的背景色设置div的背景色

from selenium import webdriver
import time

browser = webdriver.Chrome('./webdriver/chromedriver')
try:
    browser.get('http://localhost/demo1.html')
    buttons = browser.find_elements_by_class_name('mybutton')
    i = 0
    while True:
        buttons[i].click()
        time.sleep(1)
        i += 1
        if i == len(buttons):
            i = 0

except Exception as e:
    print(e)
    browser.close()

4.6动作链

上一篇:使用selenium登录古诗文网,包含验证码识别。


下一篇:Python Selenium — 封装浏览器引擎类