使用Selenium抓取网页动态内容
Selenium 介绍
Selenium 是一个自动化测试工具,支持多种浏览器,包括 Chrome、Firefox、Edge 等,具有强大的浏览器自动化能力,可以用于Web应用程序的自动化测试、数据挖掘等领域。Selenium的主要特点有以下。
支持多种浏览器
Selenium支持多种浏览器,包括Chrome、Firefox、Edge、Safari等,可以满足不同用户的需求。
多种编程语言支持
Selenium支持多种编程语言,如Python、Java、Ruby等,用户可以选择自己熟悉的编程语言进行开发。
自动化表单填写、模拟点击、页面滚动等操作
使用Selenium,用户可以自动化进行表单填写、模拟点击、页面滚动等操作,可以大大提高工作效率。
处理JavaScript、Ajax、动态页面等特殊情况
Selenium可以处理JavaScript、Ajax、动态页面等特殊情况,可以更好地模拟用户行为。
模拟用户行为,处理弹窗、Alert等特殊情况
Selenium可以模拟用户行为,如鼠标移动、键盘输入等,并可以处理弹窗、Alert等特殊情况,可以更加贴近真实用户的使用情况。
使用 Selenium
安装
如果你使用的是 Python,可以通过 pip 安装 Selenium:
pip install selenium
同时还需要安装浏览器驱动,比如 Chrome 驱动,可以从官方网站下载。下载后解压缩,把 chromedriver.exe 文件放到 Python 的安装目录下即可,例如 C:\Python39。
基本操作
通过 Selenium 可以模拟用户在浏览器中的行为,例如打开指定的网页、填写表单、点击按钮等。下面的代码演示了如何使用 Selenium 打开百度首页,并在搜索框中输入“Python”,然后点击“百度一下”按钮,最后截屏保存结果。
from selenium import webdriver
# 创建 Chrome 浏览器对象
browser = webdriver.Chrome()
# 加载页面
browser.get('<https://www.baidu.com>')
# 找到搜索框并输入关键字
kw_input = browser.find_element_by_id('kw')
kw_input.send_keys('Python')
# 找到“百度一下”按钮并点击
su_button = browser.find_element_by_id('su')
su_button.click()
# 截屏并保存结果
browser.get_screenshot_as_file('baidu_result.png')
# 关闭浏览器
browser.quit()
等待页面元素
在使用 Selenium 时,我们需要注意网页中的元素可能是动态生成的,在我们使用find_element
或find_elements
方法获取的时候,可能还没有完成渲染,这时会引发NoSuchElementException
错误。为了解决这个问题,我们可以使用隐式等待的方式,通过设置等待时间让浏览器完成对页面元素的渲染。除此之外,我们还可以使用显示等待,通过创建WebDriverWait
对象,并设置等待时间和条件,当条件没有满足时,我们可以先等待再尝试进行后续的操作,具体的代码如下所示。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
# 创建 Chrome 浏览器对象
browser = webdriver.Chrome()
# 加载页面
browser.get('<https://www.baidu.com>')
# 设置隐式等待时间为10秒
browser.implicitly_wait(10)
# 找到搜索框并输入
元素定位
在使用Selenium时,元素定位是非常重要的操作。通过元素定位,可以找到需要操作的元素,并进行后续的操作。Selenium支持多种元素定位方式,如下所示:
ID
elem = driver.find_element_by_id("id")
Name
elem = driver.find_element_by_name("name")
Class Name
elem = driver.find_element_by_class_name("class")
Tag Name
elem = driver.find_element_by_tag_name("tag")
Link Text
elem = driver.find_element_by_link_text("text")
Partial Link Text
elem = driver.find_element_by_partial_link_text("text")
CSS Selector
elem = driver.find_element_by_css_selector("selector")
XPath
elem = driver.find_element_by_xpath("xpath")
API参考
Selenium提供了丰富的API,使得用户可以灵活地进行自动化测试和数据挖掘等操作。下面是一些常用的API:
WebDriver API
WebDriver API是Selenium的核心API,提供了浏览器控制相关的操作。常用方法如下所示:
get(url)
加载指定的URL。
browser.get('<http://www.baidu.com>')
back()
返回上一页。
browser.back()
forward()
前进到下一页。
browser.forward()
refresh()
刷新当前页面。
browser.refresh()
close()
关闭当前窗口。
browser.close()
quit()
退出浏览器。
browser.quit()
WebElement API
WebElement API提供了对页面元素的操作。常用方法如下所示:
click()
点击元素。
elem = browser.find_element_by_id('button')
elem.click()
send_keys()
向元素发送文本。
elem = browser.find_element_by_id('input')
elem.send_keys('Hello, World!')
clear()
清空元素文本。
elem = browser.find_element_by_id('input')
elem.clear()
get_attribute(name)
获取元素的属性值。
elem = browser.find_element_by_id('input')
attr_value = elem.get_attribute('name')
is_displayed()
判断元素是否对于用户可见。
elem = browser.find_element_by_id('input')
is_visible = elem.is_displayed()
is_enabled()
判断元素是否处于可用状态。
elem = browser.find_element_by_id('button')
is_enabled = elem.is_enabled()
is_selected()
判断元素(单选框和复选框)是否被选中。
elem = browser.find_element_by_id('checkbox')
is_selected = elem.is_selected()
value_of_css_property(property_name)
获取指定的CSS属性值。
elem = browser.find_element_by_id('button')
color = elem.value_of_css_property('color')
find_element(by=By.ID, value=None)
获取单个子元素。
elem = browser.find_element(By.CSS_SELECTOR, '.item')
find_elements(by=By.ID, value=None)
获取一系列子元素。
elems = browser.find_elements(By.CSS_SELECTOR, '.items')
screenshot(filename)
为元素生成快照。
elem = browser.find_element_by_id('input')
elem.screenshot('input.png')
简单案例
下面的例子演示了如何使用 Selenium 从“360图片”网站搜索和下载图片。
import os
import time
from concurrent.futures import ThreadPoolExecutor
import requests
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
DOWNLOAD_PATH = 'images/'
def download_picture(picture_url: str):
"""
下载保存图片
:param picture_url: 图片的URL
"""
filename = picture_url[picture_url.rfind('/') + 1:]
resp = requests.get(picture_url)
with open(os.path.join(DOWNLOAD_PATH, filename), 'wb') as file:
file.write(resp.content)
if not os.path.exists(DOWNLOAD_PATH):
os.makedirs(DOWNLOAD_PATH)
browser = webdriver.Chrome()
browser.get('<https://image.so.com/z?ch=beauty>')
browser.implicitly_wait(10)
kw_input = browser.find_element(By.CSS_SELECTOR, 'input[name=q]')
kw_input.send_keys('苍老师')
kw_input.send_keys(Keys.ENTER)
for _ in range(10):
browser.execute_script(
'document.documentElement.scrollTop = document.documentElement.scrollHeight'
)
time.sleep(1)
imgs = browser.find_elements(By.CSS_SELECTOR, 'div.waterfall img')
with ThreadPoolExecutor(max_workers=32) as pool:
for img in imgs:
pic_url = img.get_attribute('src')
pool.submit(download_picture, pic_url)
运行上面的代码,检查指定的目录下是否下载了根据关键词搜索到的图片。
综上所述,Selenium是一款强大的自动化测试工具,可以用于Web应用程序的自动化测试、数据挖掘等领域。通过掌握Selenium的使用方法和API参考,你可以更加高效地进行自动化测试和数据挖掘等操作,提高工作效率。