使用Selenium和Python实现Web抓取指南_python selenium抓取网页内容
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
复制
# 通过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. 优化与注意事项
-
无头模式(不显示浏览器界面):
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 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)