Python爬虫实战:Selenium自动化——有些网站,用 requests 真的搞不定

发布时间:2026/7/6 5:38:55
Python爬虫实战:Selenium自动化——有些网站,用 requests 真的搞不定 一、为什么要有这一篇前三篇教的 requests BeautifulSoup 组合能搞定大部分网站。但是有一种网站它们长这样你打开网页 → 按 F12 看源码 → 发现body里面干干净净你要的数据一个都没有。为什么呢因为数据不是写在 HTML 里的而是网页先加载一个空壳子然后跑一段 JavaScript 代码临时把数据填进去的。你 requests 拿到的是 JS 还没跑之前的那个空壳子当然啥也没有。​Selenium 的思路很简单它不去请求那个空壳子而是直接打开一个真正的浏览器让 JS 跑完再把渲染好的页面内容拿给你。​用人话说requests 是派个信使去拿信页面上没有就不管了Selenium 是派人亲自去现场等着等东西贴出来了再抄回来。二、装什么先装 Seleniumpip install selenium然后还需要一个ChromeDriver它是 Selenium 和 Chrome 之间的翻译官——没有它Selenium 就操控不了浏览器。ChromeDriver 下载安装保姆级步骤​第一步查你的 Chrome 版本打开 Chrome 浏览器 → 地址栏输入chrome://version/→ 看到第一行Google Chrome后面那串数字就是版本号。比如126.0.6478.126记下大版本号 126。第二步下载对应的 ChromeDriver打开这个地址Chrome for Testing availability页面往下翻找到Stable稳定版这个区域里面有一张大表格每行对应一个版本号。找到和你刚才查到的版本号大版本一致的那一行比如你的 Chrome 是 126.x.x.x那就在表格里找 126 那一行。找到后点这一行末尾的chromedriver链接下载。第三步解压下载得到一个 zip 压缩包解压。里面有一个chromedriver.exeWindows或chromedriverMac/Linux。第四步放到项目文件夹里最简单的方式​不需要安装不需要配置环境变量。直接把chromedriver.exe放到你写爬虫代码的那个文件夹里就行。这样代码里webdriver.Chrome()会自动在当前文件夹找到它。你的爬虫项目/├── spider.py ← 你的代码├── chromedriver.exe ← 放这里└── requirements.txt其他方式了解即可​也可以把chromedriver.exe放到 Python 安装目录下的Scripts/文件夹里或者安装webdriver-manager自动下载pip install webdriver-manager适合不想手动操作的人三、先跑一个看看from selenium import webdriver from selenium.webdriver.chrome.options import Options # 设置不要弹出浏览器窗口无头模式 options Options() options.add_argument(--headless) # 启动浏览器 driver webdriver.Chrome(optionsoptions) driver.get(https://example.com) # 拿渲染完的页面 print(driver.title) print(driver.page_source[:500]) driver.quit()这段代码做了什么webdriver.Chrome()—— Selenium 帮你在后台打开一个 Chrome 浏览器driver.get(...)—— 输入网址浏览器去加载等 JS 全部跑完driver.page_source—— 取出浏览器渲染完之后的 HTML这时候数据已经有了driver.quit()—— 关掉浏览器--headless的意思是无头模式浏览器在后台跑你看不到窗口。调试的时候可以去掉这行就能看到浏览器真的弹出来跑了。四、怎么在页面上找到想要的元素requests 用find()和select()Selenium 用find_element()。from selenium import webdriver from selenium.webdriver.common.by import By driver webdriver.Chrome() driver.get(http://books.toscrape.com) # 找到页面上所有图书 books driver.find_elements(By.CLASS_NAME, product_pod) print(f找到 {len(books)} 本书) # 每本书取标题和价格 for book in books[:3]: title book.find_element(By.TAG_NAME, h3).text price book.find_element(By.CLASS_NAME, price_color).text print(f{title} —— {price}) driver.quit()常用的查找方式记住前三个就够了​写法意思By.CLASS_NAME按 class 名找By.ID按 id 找By.CSS_SELECTOR按 CSS 选择器找最灵活By.TAG_NAME按标签名找By.XPATH按路径找基本用不上find_element找第一个find_elements找所有返回列表。五、别瞎等用显式等待​新手最容易犯的错加一行time.sleep(5)等着。有时候5秒不够有时候5秒浪费了。正确做法是告诉 Selenium你盯着这个元素它一出现就继续最多等10秒。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 driver webdriver.Chrome() driver.get(http://books.toscrape.com) # 盯着 product_pod 这个元素出现了就继续最多等10秒 wait WebDriverWait(driver, 10) wait.until( EC.presence_of_element_located((By.CLASS_NAME, product_pod)) ) # 到这里元素100%已经在了 books driver.find_elements(By.CLASS_NAME, product_pod) print(f找到 {len(books)} 本书) driver.quit()常见等待条件​写法什么时候用presence_of_element_located元素出现在页面上最常见element_to_be_clickable等按钮可以点了再点visibility_of_element_located等元素可见了再操作一句话用WebDriverWait别用time.sleep。六、聪明人的用法Selenium requests 混合Selenium 有个缺点——慢。打开一个浏览器再关掉比发一个 requests 请求慢几百倍。所以聪明的做法是Selenium 只用来找路找到路之后切回 requests 跑。​# 第一步用 Selenium 打开页面找到数据接口 driver webdriver.Chrome() driver.get(https://目标网站.com) # 打开 F12 → Network → XHR看看页面发了什么请求 # 找到返回 JSON 的那个接口 URL # 第二步关掉浏览器用 requests 批量请求 import requests api_url https://目标网站.com/api/data for page in range(1, 11): resp requests.get(f{api_url}?page{page}) data resp.json() print(f第{page}页{len(data)} 条数据) driver.quit()Selenium 负责探路requests 负责跑量又快又稳。七、总结什么时候用 Selenium​页面源码里找不到数据数据是 JS 动态加载的什么时候切回 requests​找到了背后的数据接口就用 requests 批量拉别用 time.sleep​用WebDriverWait等元素出现配套代码已上传 GitCode仓库地址见文末。技术交流详见主页简介~版权声明本文为CSDN博主「轩hyx」的原创文章遵循 CC 4.0 BY-SA版权协议转载请附上原文出处链接及本声明。