> 技术文档 > 使用Selenium和Python实现Web抓取指南_python selenium抓取网页内容

使用Selenium和Python实现Web抓取指南_python selenium抓取网页内容


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

复制

# 通过IDelement = driver.find_element_by_id(\"element_id\")# 通过类名element = driver.find_element_by_class_name(\"class_name\")# 通过标签名element = driver.find_element_by_tag_name(\"h1\")# 通过XPathelement = 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 Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom 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.alertprint(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 webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECimport 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\").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)