一、Selenium库简介

在开始使用Selenium进行浏览器自动化之前,我们首先需要理解它的核心驱动原理。

1. 浏览器内核与Selenium的关系

浏览器本身是在浏览器内核的基础上开发而成的。内核负责解析HTML、CSS,并渲染出我们看到的网页。例如:

· Google Chrome 和 360安全浏览器 都使用 Chrome内核(Blink)
· QQ浏览器 早期版本使用 IE内核(Trident)
· Safari 使用 Webkit内核

2. WebDriver协议与驱动程序

Selenium要驱动浏览器,必须借助对应浏览器的驱动程序(如 ChromeDriver)。每个浏览器都实现了自己的 WebDriver 协议,Selenium 通过该协议与浏览器进行通信,从而实现自动化控制。

需要做的准备工作:

· 安装 Selenium 库
· 下载与浏览器版本匹配的驱动程序
· 将驱动所在路径添加到系统环境变量,或在代码中直接指定路径

3. Selenium vs. Requests 关键差异

特性 Selenium Requests
数据获取 获取渲染后的完整网页(含JS生成内容) 仅获取初始HTML源码
交互能力 可点击、输入、滚动、验证等 无
适用场景 动态网页、自动化测试、爬取反爬数据 静态接口、简单页面

如果你需要抓取由 JavaScript 动态加载的数据(如滚动加载、图表等),Selenium 是比 Requests 更合适的选择。

二、使用Selenium 

1.下载Selenium 库

下载:在命令提示符或终端中输⼊命令

pip install selenium==4.11.0 -i https://pypi.mirrors.ustc.edu.cn/simple/
 

或在pycharm中安装,打开 PyCharm → 文件 → 设置 → 项目 → Python解释器,点右侧 + 号,搜索 selenium,勾选指定版本,选择 4.11.0,点击安装即可

2.内核驱动配置

360浏览器使用的就是edge的内核
QQ浏览器使用IE
 先确认自己平时用的浏览器是什么内核,再下对应驱动

下载驱动压缩包,解压出 msedgedriver.exe
找到你 Python 安装目录下的 Scripts 文件夹,把 msedgedriver.exe 直接复制粘贴到 Scripts 里

edge驱动下载地址:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/?ch=1&form=MA13LH
chrome驱动下载地址:https://chromedriver.storage.googleapis.com/index.html
firefox驱动下载地址:https://github.com/mozilla/geckodriver/releases

注意:
1.系统存在多个Python版本时,一定要确认代码运行用的那个 Python 环境,环境变量配置的是哪一个,驱动放对应路径

可通过cmd 输入python --version可查看现在绑定的是哪个Python

2.驱动版本 必须和浏览器内核大版本一致
例:浏览器版本 114.0.1823.82 → 驱动也下 114 版本

3.windows系统下载下来的文件解压后放置在python安装地址的Scripts中
  (Linux和Mac系统:同上)
python安装地址可通过命令提示行where python查询

基础使用方法

'''打开一个网页'''
from selenium import webdriver  #从selenium导入 webdriver  (驱动浏览器驱动)
# 导入Edge浏览器的Options类,这个类允许我们配置WebDriver的行为。
from selenium.webdriver.edge.options import Options
# 创建一个Options类的实例,这将用于设置Edge浏览器的启动选项。
edge_options = Options()
# 设置Edge浏览器的文件位置,这样WebDriver知道哪个版本的Edge要启动。
# 这个路径必须指向你的Edge安装目录下的msedge.exe文件。
edge_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
# '''①webdriver具备多种不同浏览器的驱动,
# browser = webdriver.Firefox()
# browser = webdriver.chrome()
# browser = webdriver.PhantomJS()
# browser= webdriver.Safari()
# '''
# 使用上面创建的Options实例来初始化WebDriver。
# WebDriver是与浏览器交互的主要接口,通过它我们可以模拟用户操作。
driver = webdriver.Edge(options=edge_options)
# 使用get方法让WebDriver打开指定的URL,这里是Bilibili的主页。
driver.get('https://www.ptpress.com.cn/')
# driver.get('https://www.baidu.com/')
# input函数在这里用来暂停脚本的执行,直到用户按下回车键。
# 这样做是为了让用户能够观察到浏览器窗口中的结果
input('dengdai')
# time.sleep(999)

使用 get() 方法加载目标 URL,time.sleep() 或 input() 可暂停脚本执行以便观察

'''打开多个新标签页'''
from selenium import webdriver     #导入从selenimwebdriver  (驱动浏览器驱动)
from selenium.webdriver.edge.options import Options  #(Options类允许你配置和自定义 WebDriver 的行为)
edge_options = Options()   #类,类创建实例化对象
edge_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"   #浏览器地址
driver = webdriver.Edge(options=edge_options)
driver.get('https://www.baidu.com/')
# driver.get('https://www.csdn.net/')
#execute_script用于浏览器中执行JavaScript代码。
#window.open是表示在当前的窗口中打开一个新的标签页
#'_blank' 表示在新的标签页中打开链接,而不是在当前标签页或者新的窗口中打开。
driver.execute_script("window.open('https://www.bilibili.com/','_blank');")
driver.execute_script("window.open('https://www.shuyishe.com/','_blank');")
driver.execute_script("window.open('https://www.shuyishe.com/course','_blank');")
input('dengdai')
# 在这里,代码执行到这一步后会暂停,并且等待用户输入任意内容(比如输入回车键),然后程序才会继续执行下去。
# 这样做的目的是为了在执行完打开链接的操作后,让程序暂停以便观察网页的变化或者调试代码。

execute_script方法可以执行任意JavaScript代码,window.open是浏览器原生方法。

_blank参数确保在新标签页打开链接,而不是新窗口。

用 Selenium 命令浏览器执行 JS,实现新开标签页

获取渲染后的网页代码

'''获取渲染后的网页代码'''
from selenium import webdriver
from selenium.webdriver.edge.options import Options
edge_options = Options()
edge_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
driver = webdriver.Edge(options=edge_options)
driver.get('https://www.baidu.com')
print(driver.page_source)
#        做对比
# 获取当前网页的源代码,也就是 HTML 结构。
# 这个信息对于网页内容的抓取、数据提取以及页面分析非常有用。具体来说,你可以从页面源代码中获取以下信息:
# 网页内容:包括文本、图像、链接等。
# HTML 结构:了解网页的布局、各个元素的位置和属性等。
# 元数据:如页面标题、描述、关键词等。

driver.page_source 就是获取浏览器渲染之后、最终完整的网页 HTML 代码

普通查看源代码只有初始静态 HTML,没有 JS 渲染内容,driver.page_source 可以拿到最终完整页面,和F12 看到的 DOM 一模一样,这就是 Selenium 最强大的地方,能抓动态网页

练习

爬取图片

 https://10wallpaper.com

import requests
import fake_useragent
from lxml import etree
import os

n=0
def count():
    global n
    n+=1
    return n

if not os.path.exists("./Picture"):
    os.mkdir("./Picture")
head={
    "User-Agent":fake_useragent.UserAgent().random
}
for i in range(1,4):
    url= f'https://10wallpaper.com/List_wallpapers/page/{i}'
    resp = requests.get(url, headers=head)
    result = resp.text
    tree = etree.HTML(result)
    p_list = tree.xpath("//div[@id='pics-list']/p")
    for p in p_list:
        img_url = p.xpath("./a/img/@src")[0]
        img_url2 = 'https://10wallpaper.com' + img_url
        print(img_url2)
        img_name = count()
        print(img_name)
        img_resp = requests.get(img_url2, headers=head)
        img_content = img_resp.content
        with open(f"./Picture/{img_name}.jpg", "wb") as fp:
            fp.write(img_resp.content)

结果展示

爬取豆瓣电影信息

import fake_useragent
import requests
from lxml import etree
import re

url = 'https://movie.douban.com/top250'
header={"User-Agent":fake_useragent.UserAgent().random}
resp = requests.get(url, headers=header)
result = resp.text
fp = open("doubanFilm1.txt","w",encoding="utf8")
tree = etree.HTML(result)
li_list = tree.xpath("//ol[@class='grid_view']/li")
for li in li_list:
    try:
        film_name = li.xpath("./div/div[2]/div[1]/a/span[1]/text()")[0]
        film_actor = li.xpath("./div/div[2]/div[2]/p[1]/text()")
        film_daoyan = re.match("导演: (.+?) (.+)主演: (.+)", film_actor[0].strip()).group(1)
        film_zhuyan = re.match("导演: (.+?) (.+)主演: (.+)", film_actor[0].strip()).group(3)
        film_year = re.match(".*?(\d+).*", film_actor[1].strip()).group(1)
        film_quote = li.xpath("./div/div[2]/div[2]/p[2]/span/text()")[0]
        film_star = li.xpath("./div/div[2]/div[2]/div/span[2]/text()")[0]
        print(film_name, film_quote, film_star, film_daoyan, film_zhuyan, film_year)
        fp.write(film_name+'#'+film_quote+'#'+film_star+'#'+film_daoyan+'#'+film_zhuyan+'#'+film_year+'\n')
    except Exception as e:
        print(e)
        pass

fp.close()

结果展示

作业

爬取以下网页任意页数图片

https://www.gamewallpapers.com/index.php?start=0&page=

 

 

更多推荐