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

1. 环境准备

安装Selenium库

bash

复制

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

  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 EC

try:
    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 Select

dropdown = 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 csv

with 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 Options
    
    options = 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 time

driver = 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").text
        price = item.find_element_by_class_name("price").text
        products.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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值