当前位置: 首页 > news >正文

使用Selenium和Python实现Web抓取指南

1. 环境准备

安装Selenium库

bash

复制

pip install selenium
下载浏览器驱动(以Chrome为例)
  1. 下载对应浏览器版本的驱动:

    • ChromeDriver: https://chromedriver.chromium.org/downloads

  2. 将驱动文件(如chromedriver.exe)添加到系统环境变量,或直接在代码中指定路径。


2. 基础用法

启动浏览器并访问页面

python

复制

from selenium import webdriver# 指定驱动路径(若未添加到环境变量)
driver = webdriver.Chrome(executable_path='path/to/chromedriver')# 打开网页
driver.get("https://example.com")# 打印页面标题
print(driver.title)# 关闭浏览器
driver.quit()

3. 定位元素

Selenium提供多种元素定位方式:

常用定位方法

python

复制

# 通过ID
element = driver.find_element_by_id("element_id")# 通过类名
element = driver.find_element_by_class_name("class_name")# 通过标签名
element = driver.find_element_by_tag_name("h1")# 通过XPath
element = driver.find_element_by_xpath("//div[@class='content']")# 通过CSS选择器
element = driver.find_element_by_css_selector("div.content > p")
查找多个元素

python

复制

elements = driver.find_elements_by_class_name("item")
for item in elements:print(item.text)

4. 处理动态加载内容

显式等待(推荐)

python

复制

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECtry:element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "dynamic_element"))print(element.text)
except:print("元素未找到")
隐式等待

python

复制

driver.implicitly_wait(10)  # 全局等待时间(单位:秒)

5. 页面交互

输入文本与点击按钮

python

复制

# 定位输入框并输入内容
search_box = driver.find_element_by_name("q")
search_box.send_keys("Python Selenium")# 定位按钮并点击
search_button = driver.find_element_by_css_selector("button[type='submit']")
search_button.click()
执行JavaScript

python

复制

# 滚动到页面底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")# 点击隐藏元素
driver.execute_script("arguments[0].click();", element)

6. 处理复杂场景

切换iframe

python

复制

iframe = driver.find_element_by_tag_name("iframe")
driver.switch_to.frame(iframe)
# 操作iframe内元素
driver.switch_to.default_content()  # 切换回主页面
处理弹窗

python

复制

alert = driver.switch_to.alert
print(alert.text)
alert.accept()  # 确认弹窗
# alert.dismiss()  # 取消弹窗
下拉菜单选择

python

复制

from selenium.webdriver.support.ui import Selectdropdown = Select(driver.find_element_by_id("dropdown"))
dropdown.select_by_value("option_value")
# 或通过索引:dropdown.select_by_index(0)

7. 数据提取

python

复制

# 获取文本
title = driver.find_element_by_tag_name("h1").text# 获取属性
link = driver.find_element_by_link_text("More Info").get_attribute("href")# 提取表格数据
rows = driver.find_elements_by_css_selector("table tr")
for row in rows:cells = row.find_elements_by_tag_name("td")data = [cell.text for cell in cells]print(data)

8. 数据存储

保存到CSV

python

复制

import csvwith open('data.csv', 'w', newline='', encoding='utf-8') as f:writer = csv.writer(f)writer.writerow(["Header1", "Header2"])writer.writerow(["Data1", "Data2"])

9. 优化与注意事项

  1. 无头模式(不显示浏览器界面):

    python

    复制

    from selenium.webdriver.chrome.options import Optionsoptions = Options()
    options.add_argument("--headless")
    driver = webdriver.Chrome(options=options)
  2. 反爬虫策略

    • 设置随机User-Agent。

    • 使用代理IP。

    • 避免频繁请求(添加time.sleep())。

  3. 资源释放

    python

    复制

    driver.quit()  # 彻底关闭浏览器进程

10. 完整示例:抓取动态商品列表

python

复制

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import timedriver = webdriver.Chrome()
driver.get("https://example-ecommerce.com/products")products = []while True:# 等待商品加载WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "product-item")))# 提取当前页商品items = driver.find_elements_by_class_name("product-item")for item in items:name = item.find_element_by_class_name("name").textprice = item.find_element_by_class_name("price").textproducts.append({"name": name, "price": price})# 翻页try:next_button = driver.find_element_by_css_selector("a.next-page")next_button.click()time.sleep(2)  # 防止过快被拦截except:break  # 无下一页时退出driver.quit()# 保存数据
print(products)

相关文章:

  • vscode按Ctrl+Shift+B无法编译no build to run found,没有catkin_make build怎么办
  • ESP32 搭建IDF+Vscode环境(详细教程)
  • 深度学习中的概念——元素积(哈达玛积)
  • C++学习:六个月从基础到就业——内存管理:堆与栈
  • RHCE的简单配置
  • 设计模式从入门到精通之(五)观察者模式
  • 使用 Axios 进行 API 请求与接口封装:打造高效稳定的前端数据交互
  • Hexo+Github+gitee图床零成本搭建自己的专属博客
  • Google澄清:元描述标签不会直接提升网站排名
  • 一键模仿图片风格,图生生APP,实现随时随地“生图自由“
  • WPF常用技巧汇总
  • 旅游资源网站登录(jsp+ssm+mysql5.x)
  • 数字信号处理技术架构与功能演进
  • 【2025-泛计算机类-保研/考研经验帖征集】
  • 在排序数组中查找元素的第一个和最后一个位置--LeetCode
  • 计算机网络 - 在浏览器中输入 URL 地址到显示主页的过程?
  • 深入理解C++中string的深浅拷贝
  • 4.3 熟悉字符串处理函数
  • Python 写生成 应用商店(2025版) 网页 方便收集应用 ,局域网使用
  • PLOS ONE:VR 游戏扫描揭示了 ADHD 儿童独特的大脑活动
  • 庆祝中国印尼建交75周年招待会暨万隆会议70周年纪念活动在京举行
  • 中共中央、国务院印发《关于实施自由贸易试验区提升战略的意见》
  • 商务部:新一轮服务业扩大开放一次性向11个试点省市全面铺开
  • 2025年度“沪惠保”将于4月22日开售,保费不变
  • 大理州工业投资(集团)有限公司党委副书记、副总经理赵云接受审查调查
  • 沈辛成评《主动出击》丨科学普及,究竟需要靠谁主动出击