如何使用Selenium遍历JS渲染网站分页实现Python爬虫?
解决JavaScript分页爬虫问题:用Selenium爬取目标网站的所有URL
BeautifulSoup只能解析静态HTML,对付JS动态加载的分页确实没用,你选Selenium是对的,下面给你具体的实现步骤和代码,照着来就能搞定。
步骤1:准备环境
- 安装Selenium:
pip install selenium - 下载对应浏览器的驱动(以Chrome为例):找和你Chrome版本匹配的ChromeDriver,把它放到系统PATH目录里,或者在代码里指定驱动路径。
步骤2:核心代码实现
下面是针对目标网站的爬取代码,关键是模拟点击分页按钮,循环提取所有URL:
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 time # 初始化浏览器(如果驱动没在PATH里,要指定executable_path参数) driver = webdriver.Chrome() # 打开目标页面 driver.get("https://yavapai.arizonataxsale.com/index.cfm?folder=previewitems") all_urls = set() # 用集合避免重复URL while True: # 等待页面加载完成,等待条目元素出现 try: WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, "a[href*='folder=previewdetails']")) ) except: # 超时就退出循环 break # 提取当前页面的所有目标URL links = driver.find_elements(By.CSS_SELECTOR, "a[href*='folder=previewdetails']") for link in links: url = link.get_attribute("href") if url: all_urls.add(url) # 尝试点击下一页按钮 try: # 找到下一页按钮(根据网站实际情况调整,这里假设是带"Next"文本的按钮) next_button = WebDriverWait(driver, 5).until( EC.element_to_be_clickable((By.XPATH, "//a[contains(text(), 'Next')]")) ) # 检查按钮是否可用(有些网站会给不可点击的按钮加disabled类) if "disabled" in next_button.get_attribute("class"): break next_button.click() time.sleep(2) # 给页面加载留时间,也可以用显式等待代替 except: # 找不到下一页按钮,说明到最后一页了 break # 关闭浏览器 driver.quit() # 输出结果 print(f"总共爬取到 {len(all_urls)} 个URL") for url in all_urls: print(url)
关键注意点
- 元素定位要准确:打开网站开发者工具,确认目标链接和分页按钮的选择器——比如目标链接都包含
folder=previewdetails,所以用a[href*='folder=previewdetails']没问题;如果分页按钮文本不是"Next",要换成网站实际的文本,或是用对应的CSS类、XPath定位。 - 优先用显式等待:代码里的
time.sleep(2)可以替换成显式等待(比如等待下一页的条目加载完成),这样程序稳定性更高。 - 规避反爬:如果网站有反爬机制,可以给浏览器添加无头模式(
options.add_argument('--headless=new')),或是自定义User-Agent,模拟真实浏览器请求。 - 异常处理兜底:代码里的try-except逻辑,能避免单个页面加载失败导致整个程序崩溃。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

