一、Selenium概述

Selenium 是一个用于测试 Web 应用程序的框架,该框架测试直接在浏览器中运行,就像真实用户操作一样。它支持多种平台:Windows、Linux、Mac,支持多种语言:Python、Perl、PHP、C# 等,支持多种浏览器:Chrome、IE、Firefox、Safari 等。

二、Selenium下载安装

1.Selenium安装

pip install selenium

2. WebDriver安装

我们安装好了Selenium库,但是它是一个自动化测试工具,需要浏览器来配合使用。我们可以尝试一下Chrome浏览器及ChromeDriver驱动的配置。

pip install webdriver-manager

主要浏览器 WebDriver 地址如下:

Chrome:http://chromedriver.storage.googleapis.com/index.html
Firefox:https://github.com/mozilla/geckodriver/releases/
IE:http://selenium-release.storage.googleapis.com/index.html
  • 1.首先我们打开自己的Chrome浏览器,按照以下图片步骤,查看Chrome浏览器的版本号,我的是86

python selenium 爬虫 selenium做爬虫_chrome

  • 2.http://chromedriver.storage.googleapis.com/index.html,链接进入,查找到自己相关的版本号进行下载

python selenium 爬虫 selenium做爬虫_chrome_02

2.1 WebDriver环境变量配置

  • 1.下载完成后,将ChromeDriver的可执行文件配置到环境变量下
  • 2.在Windows下,建议直接将接将chromedriver.exe 文件拖到 Python Scripts 目录下,也可以单独将其所在路径配置到环境变量
  • 3.Linux/Mac 下,需要将可执行文件配置到环境变量或将文件移动到属于环境变量的目录里。例如,要移动文件到/user/bin目录。首先,需要在命令行模式下进入其所在路径,然后将其移动到/usr/bin:
    sudo mv chromedriver /usr/bin

2.2 WebDriver验证安装

  • 运行成功后,如果弹出一个空白的Chrome浏览器,则证明所有的配置都没有问题。
  • 如果弹出后闪退,可以是Chrome浏览器版本和ChromeDriver版本不兼容,请更换版本。

三、Selenium的使用

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

browser = webdriver.Chrome() #申明一个浏览器对象
try:
    browser.get("https://www.baidu.com")
    input = browser.find_element_by_id("kw")
    input.send_keys("Python")
    input.send_keys(Keys.ENTER)
    wait = WebDriverWait(browser,10)
    wait.until(EC.presence_of_element_located((By.ID,'content_left')))
    print(browser.current_url) #当前url
    print(browser.get_cookies())#获取cookie,列表形式返回
#     print(browser.page_source) #当前网页源代码
finally:
    browser.close() #最后关闭浏览器
  • 1.运行代码后发现,会自动弹出一个Chrome浏览器,浏览器首先浏览器首先会跳转到百度,然后在搜索框中输入 Python 接着跳转到搜索结果页,如下图显示

python selenium 爬虫 selenium做爬虫_Chrome_03

  • 2.搜索结果加载出来后,控制台分别会输出当前的 URL 、当前的 Cookies 和网页源代码
  • 3.可以看到我们得到当前的URL、Cookie和源代码都是浏览器重的真是内容
  • 4.所以说,如果用Selenium来驱动浏览器加载网页的话,就可以直接拿到JavaScript渲染的结果了,不用担心使用什么加密系统

python selenium 爬虫 selenium做爬虫_python selenium 爬虫_04

三、Selenium的用法

3.1声明浏览器对象

  • 1.Selenium支持非常多的浏览器,如Chrome、Firefox、Edge等,还有Android、Black.Berry等手机端的浏览器。另外,也支持无界面浏览器PhantomJS
  • 2.此外,我们可以用如下方式初始化:
from selenium import webdriver 
browser = webdriver.Chrome() 
browser = webdriver.Firefox() 
browser = webdriver.Edge() 
browser = webdriver.PhantomJS() 
browser= webdriver.Safari()

3.2访问页面

  • 1.我们可以用get()方法来请求网页,参数传入链接URL即可。比如,这里用get()方法访问淘宝,然后打印出源代码
  • 2.运行后发现,弹出Chrome浏览器并且自动访问了淘宝,然后控制台输出了淘宝页面的源代码,随后浏览器关闭
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('http://www.taobao.com')
print(browser.page_source)
browser.close()

3.3查找节点

Selenium可以驱动浏览器完成各种操作,比如填充表单、模拟点击等。比如,我们想要完成向某个输入框输入文字的操作,总需要知道这个输入框在哪里吧?而Selenium提供了一系列查找节点的方法,我们可以用这些方法来获取想要的节点,以便下一步执行一些动作或者提取信息。

3.3.1单个节点

比如,想要从淘宝页面中提取搜索框这个节点

  • 1.这里我们使用3种方式获取输入框,分别是根据ID、css 选择器和 XPath 获取,它们返回的结果完全一致。运行结果如下:
# 若只是进行 pip install webdriver-manager的安装,可以使用下列代码
from selenium import webdriver
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

# browser = webdriver.Chrome()
browser = webdriver.Chrome(ChromeDriverManager().install())

browser.get('https://www.taobao.com/')
input_first = browser.find_element_by_id('q')
input_seconde = browser.find_element_by_css_selector('#q')
input_third = browser.find_element_by_xpath('//*[@id="q"]')
print(input_first, input_seconde, input_third)

输出:
<selenium.webdriver.remote.webelement.WebElement (session="3c50944c1eb34a45c54cb3d83d298669", element="ff016174-2a07-4981-8ac7-967007611d87")> 
<selenium.webdriver.remote.webelement.WebElement (session="3c50944c1eb34a45c54cb3d83d298669", element="ff016174-2a07-4981-8ac7-967007611d87")> 
<selenium.webdriver.remote.webelement.WebElement (session="3c50944c1eb34a45c54cb3d83d298669", element="ff016174-2a07-4981-8ac7-967007611d87")>

以下是所有获取单个节点的方法:

find_element_by_id
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_tab_name
find_element_by_class_name
find_element_by_css_selector

以上方法都可以通过find_element()这个方法,需要传入两个参数:查找方式By和值。实际上,它是find_element_by_id()这种方法的通用函数版本,比如find_element_by_id(id)就等价于find_element(By.ID,id),二者得到的结果完全一致

3.3.2多个节点

  • 1.如果查找的目标在网页中只有一个,你们完全可以用find_element()方法
  • 2.但是如果有多个节点,再用find_element()方法查找,就只能得到第一个节点了
  • 3.如果要查找所有满足条件的节点,需要用find_elements()这样的方法。注意,在这个方法的名称中,element多了一个s,注意区分

python selenium 爬虫 selenium做爬虫_python selenium 爬虫_05

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

browser = webdriver.Chrome()
browser.get("https://www.taobao.com")
lis=browser.find_elements_by_css_selector('.service-bd li') #通过id=q 找到淘宝首页的搜索框
print(lis)
browser.close()

输出:
[<selenium.webdriver.remote.webelement.WebElement (session="263b31eca7b9ba1d082a2765fe96c8af", element="95896e7e-a941-4aa4-af93-3400df807393")>, <selenium.webdriver.remote.webelement.WebElement (session="263b31eca7b9ba1d082a2765fe96c8af", element="978d4a7d-35b5-4ed3-8216-c5ddd07d36e5")>, <selenium.webdriver.remote.webelement.WebElement (session="263b31eca7b9ba1d082a2765fe96c8af", element="ee9d5cc1-0b19-4cc8-ab84-90b00c8f974f")>, <selenium.webdriver.remote.webelement.WebElement (session="263b31eca7b9ba1d082a2765fe96c8af", element="287d52d5-5942-4010-b9db-8fbdc0100cc9")>, <selenium.webdriver.remote.webelement.WebElement (session="263b31eca7b9ba1d082a2765fe96c8af", element="d1b01192-0753-4b30-b74a-6d461944e6a1")>, <selenium.webdriver.remote.webelement.WebElement (session="263b31eca7b9ba1d082a2765fe96c8af", element="c954db88-043a-4e26-943f-1996358cf3ad")>, <selenium.webdriver.remote.webelement.WebElement (session="263b31eca7b9ba1d082a2765fe96c8af", element="7b21b581-556f-4ac2-b20c-9c443f612795")>, <selenium.webdriver.remote.webelement.WebElement (session="263b31eca7b9ba1d082a2765fe96c8af", element="f9b5b013-e6fc-4164-ae6b-eef0deefa8bc")>, <selenium.webdriver.remote.webelement.WebElement (session="263b31eca7b9ba1d082a2765fe96c8af", element="07229cd9-5e4c-49ef-9554-d5e6d7cfd7cd")>, <selenium.webdriver.remote.webelement.WebElement (session="263b31eca7b9ba1d082a2765fe96c8af", element="7ab86c91-2f94-4fae-a473-c49f5cd5c260")>, <selenium.webdriver.remote.webelement.WebElement (session="263b31eca7b9ba1d082a2765fe96c8af", element="cc14824b-ed9a-4f72-b200-de1b1a0184bb")>, <selenium.webdriver.remote.webelement.WebElement (session="263b31eca7b9ba1d082a2765fe96c8af", element="71a514f2-578d-4d28-8284-c8baf16222f8")>, <selenium.webdriver.remote.webelement.WebElement (session="263b31eca7b9ba1d082a2765fe96c8af", element="550c20c8-142e-4bde-ad96-0802a709c832")>, <selenium.webdriver.remote.webelement.WebElement (session="263b31eca7b9ba1d082a2765fe96c8af", element="afd30cca-0de4-4e7a-83bc-6c1381d5e9d3")>, <selenium.webdriver.remote.webelement.WebElement (session="263b31eca7b9ba1d082a2765fe96c8af", element="12630e1c-3fae-402d-ad92-1598dfdab197")>]

以下是获取多个节点的方法:

find_elements_by_id
find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_tab_name
find_elements_by_class_name
find_elements_by_css_selector

3.4异常处理

  • 1.在使用Selenium的过程中,难免会遇到一些异常,例如超时、节点未找到等错误,一旦出现此类错误,程序便不会继续运行了
  • 2.这里我们演示一下节点未找到的异常
from selenium import webdriver

from webdriver_manager.chrome import ChromeDriverManager

# browser = webdriver.Chrome()
browser = webdriver.Chrome(ChromeDriverManager().install())

browser.get('https://www.taobao.com/')
browser.find_element_by_id('hello')

python selenium 爬虫 selenium做爬虫_python_06

  • 3.可以看到,这里抛出NoSuchElementException异常
  • 4.为了防止程序遇到异常中断,我们可以使用try except语句来捕获各种异常
  • 5.这样一旦出现这样的错误,就进行异常处理了,程序也不会中断了
from selenium import webdriver
from selenium.common.exceptions import TimeoutException, NoSuchElementException

from webdriver_manager.chrome import ChromeDriverManager

# browser = webdriver.Chrome()
browser = webdriver.Chrome(ChromeDriverManager().install())
try:

    browser.get('https://www.taobao.com/')
except TimeoutException:
    print('time out')
try:
    browser.find_element_by_id('hello')
except NoSuchElementException:
    print('No Element')
finally:
    browser.close()
  • 6.控制台输出如下:

python selenium 爬虫 selenium做爬虫_python selenium 爬虫_07