Selenium爬虫实战——动态页面数据采集完整教程
前面的两篇文章讲解了 requests XPath/BS4 爬取静态网页。但很多网站的数据是通过JavaScript 动态加载的requests 直接请求拿不到数据这时候就需要Selenium。一、Selenium 是什么Selenium 是一个浏览器自动化工具它可以模拟真实用户操作浏览器——打开网页、点击按钮、滚动加载、翻页然后提取页面数据。适用场景场景requests 能搞定吗需要 Selenium静态 HTML 页面✅ 能❌ 不需要Ajax 异步加载的数据❌ 拿不到✅ 需要必须点击/滚动才显示的内容❌ 拿不到✅ 需要登录后才能看到的页面❌ 需要自己处理 Cookie✅ 自动维持会话反爬严格的网站❌ 容易被封✅ 更像真人操作二、环境准备pipinstallselenium webdriver-managerwebdriver-manager会自动下载对应 Chrome 版本的驱动不用手动配。三、基本用法fromseleniumimportwebdriverfromselenium.webdriver.common.byimportByfromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasEC# 启动浏览器driverwebdriver.Chrome()# 打开网页driver.get(https://example.com)# 等待元素加载waitWebDriverWait(driver,10)elementwait.until(EC.presence_of_element_located((By.CLASS_NAME,title)))# 提取数据print(element.text)# 关闭浏览器driver.quit()常用操作# 查找元素driver.find_element(By.ID,id)# 按 iddriver.find_element(By.CLASS_NAME,c)# 按 classdriver.find_element(By.XPATH,//div)# 按 XPath# 点击driver.find_element(By.ID,btn).click()# 输入文字driver.find_element(By.ID,search).send_keys(Python)# 滚动到页面底部driver.execute_script(window.scrollTo(0, document.body.scrollHeight);)# 等待importtime time.sleep(2)# 强制等待不推荐WebDriverWait(driver,10).until(...)# 智能等待推荐四、实战爬取京东商品列表以京东搜索 “Python” 为例商品信息是动态加载的用 Selenium 才能抓取完整数据。fromseleniumimportwebdriverfromselenium.webdriver.common.byimportByfromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasECfromselenium.webdriver.chrome.serviceimportServicefromwebdriver_manager.chromeimportChromeDriverManagerimporttimeimportcsv# 浏览器配置optionswebdriver.ChromeOptions()options.add_argument(--no-sandbox)options.add_argument(--disable-dev-shm-usage)# 启动driverwebdriver.Chrome(optionsoptions)waitWebDriverWait(driver,15)defscrape_jd(keywordPython):爬取京东商品列表driver.get(fhttps://search.jd.com/Search?keyword{keyword})time.sleep(3)# 等待页面渲染# 获取商品列表itemsdriver.find_elements(By.CSS_SELECTOR,.gl-item)print(f找到{len(items)}个商品)foriteminitems[:10]:# 取前10个try:titleitem.find_element(By.CSS_SELECTOR,.p-name em).text priceitem.find_element(By.CSS_SELECTOR,.p-price i).textprint(f{title[:30]:30s}¥{price})except:continue# 运行scrape_jd(Python)driver.quit()五、进阶处理加载更多 / 翻页很多网站需要滚动到底部加载更多或者点击下一页defscrape_with_scroll():滚动加载适合瀑布流页面driver.get(https://example.com)# 模拟滚动5次每次加载更多foriinrange(5):# 滚动到底部driver.execute_script(window.scrollTo(0, document.body.scrollHeight);)time.sleep(2)# 等待数据加载# 提取当前页数据itemsdriver.find_elements(By.CLASS_NAME,item)print(f第{i1}次滚动当前共{len(items)}条数据)defscrape_with_pagination():点击下一页适合分页网站driver.get(https://example.com)forpageinrange(1,6):print(f正在爬取第{page}页...)# 提取当前页数据itemsdriver.find_elements(By.CLASS_NAME,item)print(f本页{len(items)}条数据)try:# 点击下一页next_btndriver.find_element(By.CLASS_NAME,pn-next)next_btn.click()time.sleep(2)except:print(没有下一页了)break六、无界面模式适合服务器运行在你本地开发时能看到浏览器界面方便调试但部署到服务器时需要无头模式optionswebdriver.ChromeOptions()options.add_argument(--headless)# 无界面模式options.add_argument(--no-sandbox)options.add_argument(--disable-dev-shm-usage)加上--headless后Chrome 在后台运行不会弹出窗口。七、踩坑提醒1. 找不到元素不要用time.sleep(3)等固定时间用WebDriverWait智能等待# 错误time.sleep(3)driver.find_element(By.ID,id)# 正确elementWebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,id)))2. 元素被遮挡无法点击# 用 JavaScript 点击绕过遮挡driver.execute_script(arguments[0].click();,element)3. ChromeDriver 版本不匹配用webdriver-manager自动管理不用手动下载fromwebdriver_manager.chromeimportChromeDriverManager serviceService(ChromeDriverManager().install())总结Selenium 是爬取动态页面的终极武器但速度比 requests 慢一些。建议策略能用 requests 的用 requests必须 Selenium 的再用 Selenium。下篇文章将介绍多线程爬虫大幅提升爬取效率。如果对你有帮助欢迎点赞、评论、关注【张老师技术栈】持续分享 Java/Python/爬虫 实战干货。