爬虫中Load More按钮处理:返回页面加载丢失与动态JSON接口获取
解决爬虫返回搜索页丢失加载状态的方案
针对你遇到的「加载全部产品后进入详情页返回,搜索页丢失加载状态」的问题,给你三个可行的解决方案:
1. 在新标签页打开产品链接
不用driver.back()返回搜索页,直接在新标签页打开产品链接,处理完后关闭标签页切回原搜索页,这样搜索页的加载状态会完全保留。
示例代码:
from selenium.webdriver.common.by import By import time # 先完成Load More加载全部产品(原逻辑保留) while True: try: load_more_btn = driver.find_element(By.CSS_SELECTOR, "your-load-more-button-selector") load_more_btn.click() time.sleep(2) # 替换为显式等待更可靠 except: break # 提取所有产品链接 product_links = [elem.get_attribute("href") for elem in driver.find_elements(By.CSS_SELECTOR, "your-product-link-selector")] # 逐个处理产品页 for link in product_links: # 打开新标签页 driver.execute_script(f"window.open('{link}', '_blank');") # 切换到新标签页 driver.switch_to.window(driver.window_handles[1]) # 这里添加产品页的爬取逻辑 # 比如:product_name = driver.find_element(By.CSS_SELECTOR, "your-name-selector").text # 关闭当前标签页并切回搜索页 driver.close() driver.switch_to.window(driver.window_handles[0])
2. 预缓存所有产品链接
先一次性加载完所有产品,把所有产品的链接提取到列表中缓存,之后直接遍历这个列表访问产品页,不需要依赖搜索页的状态。
示例代码:
from selenium.webdriver.common.by import By import time # 加载全部产品 while True: try: load_more_btn = driver.find_element(By.CSS_SELECTOR, "your-load-more-button-selector") load_more_btn.click() time.sleep(2) except: break # 缓存所有产品链接 product_links = [elem.get_attribute("href") for elem in driver.find_elements(By.CSS_SELECTOR, "your-product-link-selector")] # 遍历链接访问产品页 for link in product_links: driver.get(link) # 产品页爬取逻辑 # ... # 可选:返回搜索页(如果需要后续操作,但缓存链接后其实不需要) # driver.get("your-original-search-url")
3. 用滚动加载替代点击Load More
如果网站的「Load More」是滚动触底触发的,可以通过JS滚动页面自动加载全部内容,避免点击按钮可能出现的问题,之后同样缓存链接处理。
示例代码:
from selenium.webdriver.common.by import By import time # 滚动加载全部产品 last_scroll_height = driver.execute_script("return document.body.scrollHeight") while True: # 滚动到页面底部 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(2) # 检查是否加载了新内容 new_scroll_height = driver.execute_script("return document.body.scrollHeight") if new_scroll_height == last_scroll_height: break last_scroll_height = new_scroll_height # 提取链接并处理,同方案2 product_links = [elem.get_attribute("href") for elem in driver.find_elements(By.CSS_SELECTOR, "your-product-link-selector")] for link in product_links: driver.get(link) # 产品页爬取逻辑 # ...
方案对比
- 新标签页方案:完全保留搜索页状态,适合需要在搜索页继续操作的场景,但产品过多时可能导致浏览器卡顿。
- 缓存链接方案:逻辑最简单,无需处理多标签页,适合大多数场景。
- 滚动加载方案:适配滚动触发加载的网站,避免按钮点击失效的问题。
内容的提问来源于stack exchange,提问作者André
相关产品推荐
相关产品推荐

