使用Selenium和Python实现Web抓取指南
1. 环境准备
安装Selenium库
bash
复制
pip install selenium
下载浏览器驱动(以Chrome为例)
-
下载对应浏览器版本的驱动:
-
ChromeDriver: https://chromedriver.chromium.org/downloads
-
-
将驱动文件(如
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. 优化与注意事项
-
无头模式(不显示浏览器界面):
python
复制
from selenium.webdriver.chrome.options import Optionsoptions = Options() options.add_argument("--headless") driver = webdriver.Chrome(options=options)
-
反爬虫策略:
-
设置随机User-Agent。
-
使用代理IP。
-
避免频繁请求(添加
time.sleep()
)。
-
-
资源释放:
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)