基于Selenium的自动化Web数据采集实践

文章目录

    • [1. 环境配置与浏览器启动](#1. 环境配置与浏览器启动)
    • [2. 文件上传操作](#2. 文件上传操作)
    • [3. 搜索框交互](#3. 搜索框交互)
    • [4. 图片批量下载](#4. 图片批量下载)
    • [5. 分页数据抓取](#5. 分页数据抓取)
    • [6. 商品信息抓取](#6. 商品信息抓取)

1. 环境配置与浏览器启动

首先需要配置 Selenium 环境并启动浏览器。以下是使用 Microsoft Edge 浏览器的基本设置:

python 复制代码
import os.path
import time
import requests
from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

edge_options = Options()
edge_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
driver = webdriver.Edge(options=edge_options)

2. 文件上传操作

Selenium 可以模拟用户上传文件的操作。以下代码展示了如何通过文件输入框上传本地图片:

python 复制代码
driver.get("https://graph.baidu.com/pcpage/index?tpl_from=pc")

input_element = driver.find_element(by=By.NAME, value="file")
input_element.send_keys(r"D:\Code\PythonTest\Picture1\1.jpg")

time.sleep(5)
element = driver.find_element(by=By.CLASS_NAME, value="graph-guess-word")
print(element.text)

分析

  • send_keys() 方法用来向文件输入框传递本地文件路径

3. 搜索框交互

自动化搜索是常见的 Web 交互场景。以下示例展示了如何在 B 站搜索内容:

python 复制代码
driver.get('http://www.bilibili.com')
driver.find_element(by=By.TAG_NAME,value="input").send_keys("python"+ Keys.RETURN)
time.sleep(5)

分析

  • 使用 By.TAG_NAME 定位器找到第一个 <input> 元素
  • send_keys() 方法不仅发送文本,还可以发送特殊按键
  • Keys.RETURN 模拟回车键,提交搜索表单

4. 图片批量下载

自动化下载网页图片是数据抓取的常见需求。以下代码展示了如何从百度图片批量下载图片:

python 复制代码
if not os.path.exists("./Picture2"):
    os.mkdir("./Picture2")

driver.get('https://image.baidu.com/search/index?tn=baiduimage&ie=utf-8&word=迪丽热巴')

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

time.sleep(8)

img_list = driver.find_elements(By.XPATH, value="//img[@class='img_7rRSL']")

i = 1
for img in img_list:
    img_url = img.get_attribute("src")
    img_data = requests.get(img_url)
    with open(f"./Picture2/{i}.png",'wb') as f:
        f.write(img_data.content)
    i += 1

分析

  • driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")使用 JavaScript 执行器滚动页面到底部

  • document.body.scrollHeight 获取文档总高度,确保滚动到底部

5. 分页数据抓取

处理分页内容是 Web 抓取中的常见操作。以下代码展示了如何抓取苏宁易购的商品评价:

python 复制代码
driver.get("https://review.suning.com/cluster_cmmdty_review/cluster-38249278-000000012389328846-0000000000-1-good.htm?originalCmmdtyType=general&safp=d488778a.10004.loverRight.166")

hp_file = open('好评1.txt', 'w', encoding="utf-8")

def get_py_content(file):
    pj_elements_content = driver.find_elements(by=By.CLASS_NAME, value="body-content")
    for element in pj_elements_content:
        file.write(element.text + "\n")

get_py_content(hp_file)

next_elements = driver.find_elements(by=By.XPATH, value='//*[@class="next rv-maidian "]')
print(next_elements)

while next_elements != []:
    next_elements = next_elements[0]
    time.sleep(1)
    next_elements.click()
    get_py_content(hp_file)
    next_elements = driver.find_elements(by=By.XPATH, value='//*[@class="next rv-maidian "]')

hp_file.close()

关键方法分析

  • 使用 XPath 定位器精确查找下一页按钮://*[@class="next rv-maidian "]
  • find_elements()(复数)返回元素列表,即使没有找到元素也不会抛出异常
  • next_elements[0].click() 点击第一个符合条件的元素
  • 循环条件 next_elements != [] 检查是否还有下一页

6. 商品信息抓取

综合示例-抓取苏宁易购上医用口罩的商品信息:

python 复制代码
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("http://www.suning.com")

element = driver.find_element(by=By.ID, value="searchKeywords")
element.send_keys("医用口罩"+ Keys.RETURN)
time.sleep(10)

driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
time.sleep(10)
price_elements = driver.find_elements(by=By.CLASS_NAME, value='def-price')
title_elements = driver.find_elements(by=By.CLASS_NAME,value='title-selling-point')
evaluate_elements = driver.find_elements(by=By.CLASS_NAME,value='info-evaluate')
store_elements = driver.find_elements(by=By.CLASS_NAME ,value='store-stock')

a = time.strftime('%Y-%m-%d')
f = open(a + '医用口罩.txt', 'w', encoding='utf-8')
for i in range(len(price_elements)):
    f.write(price_elements[i].text + '\t')
    f.write(title_elements[i].text + '\t')
    f.write(evaluate_elements[i].text + '\t')
    f.write(store_elements[i].text + '\n')
f.close()
相关推荐
纳米软件8 小时前
电源模块纹波与噪声测试:从原理到自动化实现
自动化·labview·电源测试系统·atecloud·零代码软件开发
卷福同学9 小时前
【养虾日记】QClaw操作浏览器自动化发文
运维·人工智能·程序人生·自动化
智_永无止境9 小时前
AI时代,一个Skill如何让Java项目结构自动化?
自动化·skills
新新学长搞科研11 小时前
第五届电子、集成电路与通信技术国际学术会议(EICCT 2026)
运维·人工智能·自动化·集成测试·信号处理·集成学习·电气自动化
阿达_优阅达11 小时前
告别手工对账:xSuite 如何帮助 SAP 企业实现财务全流程自动化?
服务器·数据库·人工智能·自动化·sap·企业数字化转型·xsuite
renhongxia112 小时前
多模态融合驱动下的具身学习机制研究
运维·学习·机器人·自动化·知识图谱
Chengbei1113 小时前
Chrome浏览器渗透利器支持原生扫描!JS 端点 + 敏感目录 + 原型污染自动化检测|VulnRadar
javascript·chrome·安全·web安全·网络安全·自动化·系统安全
qq_5260991315 小时前
工业视觉时代,图像采集卡如何重构数据采集
图像处理·数码相机·计算机视觉·自动化
彷徨的蜗牛15 小时前
智能AI自动化协同发文系统架构设计:从理论到实践的完整指南
人工智能·系统架构·自动化
国冶机电安装15 小时前
自动化工程:推动工业智能化与效率提升的核心技术
运维·自动化