Python爬虫核心库Selenium实用笔记

编程 · 2023-08-03 · 484 人浏览

要从经过动态渲染的网页中爬取数据,需要使用Selenium库打开一个模拟浏览器访问网页,然后获取渲染后的网页源代码。

实战中通常和Requests库结合使用,实现优势互补。如果用Requests库能获取到需要的网页源代码,那么优先使用Requests库进行爬取;如果用Requests库获取不到,再使用Selenium库进行爬取。

Selenium安装

谷歌浏览器

首先查看谷歌浏览器的版本号。单击谷歌浏览器右上角的 ⋮ 按钮,在弹出的菜单中执行 帮助 -> 关于Google Chrome,在弹出的页面中查看所安装的谷歌浏览器的版本号。

接着下载安装包:

找到与自己谷歌浏览器最接近的的版本,下载对应当前操作系统的安装包。

注意:Chrome推送新版本更新要小心,因为一不小心点了升级,再运行之前写的程序,就会出现Chrome与chromedriver版本不一致的问题,导致程序无法正常运行。

最后,安装ChromeDriver:将下载好的文件解压缩,得到可执行文件“chromedriver.exe”,将其复制到Python安装路径下的“Scripts”文件夹中。建议把ChromeDriver安装到Python的安装路径下,从而让Python能更容易地调用ChromeDriver。

Python安装路径查询:在命令行窗口中输入where python后回车,即可看到Python的安装路径。

在命令行窗口中输入chromedriver后回车,没有报错就说明ChromeDriver安装成功了。

火狐浏览器

geckodriver下载地址:https://github.com/mozilla/geckodriver/releases/

安装geckodriver:将下载好的文件解压缩,得到可执行文件“geckodriver.exe”,将其复制到Python安装路径下的“Scripts”文件夹中。建议把geckodriver安装到Python的安装路径下,从而让Python能更容易地调用geckodriver。

验证安装

运行以下代码,能够打开浏览器,就说明安装成功了:

from selenium.webdriver import Chrome

browser = Chrome()
url = "https://www.xinpianchang.com/a12867560"
browser.get(url)

浏览器选项设置

在上面验证安装的时候,我们发现Selenium打开谷歌浏览器运行完后,浏览器就自动关闭了,都没看清楚。

这时,需要进行浏览器选项设置,向浏览器添加一些实验性功能选项。

from selenium import webdriver

# 打开自定义配置
options = webdriver.ChromeOptions()

# 设置浏览器不会关闭
options.add_experimental_option("detach", True)

# 禁用浏览器扩展
options.add_argument("--disable-extensions")

# 禁用浏览器弹窗
options.add_argument("--disable-popup-blocking")

# 设置浏览器UA
options.add_argument(
    "--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
)

browser = webdriver.Chrome(options=options)
browser.maximize_window()

url = "https://www.xinpianchang.com/a12867560"
browser.get(url)

常用API

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as ec  # 该模块收集了一系列的场景判断方法
from selenium.webdriver.support.wait import WebDriverWait  # 显示等待

# 打开自定义配置
options = webdriver.ChromeOptions()
# 设置浏览器不会关闭
options.add_experimental_option("detach", True)
browser = webdriver.Chrome(options=options)

url = "https://www.xinpianchang.com/a12867560"
browser.get(url)  # 打开页面

url2 = "https://www.baidu.com/"
browser.get(url2)

browser.back()  # 后退
browser.forward()  # 前进

element = browser.find_element("id", "kw")  # 找到页面中的元素
element.send_keys("爬虫")  # 向输入框发送值

element2 = browser.find_element("id", "su")
element2.click()  # 点击按钮

wait = WebDriverWait(browser, 30)  # 最长等待时间为 30 秒
# 判断某个元素是否被加到了dom树里,并不代表该元素一定可见
wait.until(ec.presence_of_element_located(("id", "content_left")))

content = browser.page_source  # 获取页面内容

browser.close()  # 关闭页面

Cookie

from selenium import webdriver
import json

# 打开自定义配置
options = webdriver.ChromeOptions()
# 设置浏览器不会关闭
options.add_experimental_option("detach", True)
browser = webdriver.Chrome(options=options)

url = "https://www.baidu.com/"
browser.get(url)

# 手动登录,登录后提取cookie
cookies = browser.get_cookies()
cookies_str = json.dumps(cookies)  # 序列化

with open("cookies.txt", "w", encoding="utf-8") as f:
    f.write(cookies_str)

with open("cookies.txt", "r", encoding="utf-8") as f:
    cookies_str = f.read()

cookies = json.loads(cookies_str)

# 向浏览器注入cookie
for cookie in cookies:
    try:
        browser.add_cookie(cookie)
    except Exception as e:
        print(e)

browser.get(url)
Python
Theme Jasmine by Kent Liao