Python+Selenium无法加载JustDial无限滚动页面获取数据
解决方案:JustDial无限滚动数据抓取问题
1. 修正滚动触发逻辑
很多无限滚动网站不会在一次性滚动到底时触发加载,需要滚动到页面底部附近的位置,同时等待新元素加载完成。单纯直接滚动到底可能无法触发网站的加载机制。
基于Selenium的修正示例代码:
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 driver = webdriver.Chrome() driver.get("https://www.justdial.com/Sangli/Car-Dealers/") target_count = 100 current_count = len(driver.find_elements(By.CSS_SELECTOR, ".resultbox")) while current_count < target_count: # 滚动到当前页面底部上方500px位置,触发加载 driver.execute_script("window.scrollTo(0, document.body.scrollHeight - 500);") # 等待新元素加载,超时10秒则停止 try: WebDriverWait(driver, 10).until( lambda d: len(d.find_elements(By.CSS_SELECTOR, ".resultbox")) > current_count ) except: break current_count = len(driver.find_elements(By.CSS_SELECTOR, ".resultbox")) time.sleep(1) # 避免频繁滚动触发反爬 # 提取数据 dealers = driver.find_elements(By.CSS_SELECTOR, ".resultbox") for dealer in dealers: name = dealer.find_element(By.CSS_SELECTOR, ".lng_cont_name").text print(name) driver.quit()
2. 直接调用AJAX接口(更高效)
JustDial的无限滚动本质是通过AJAX请求加载数据,你可以跳过模拟滚动,直接抓包获取加载接口,循环请求分页数据:
- 打开浏览器开发者工具(F12)→ Network标签
- 滚动页面,找到XHR类型的请求(通常是
ajxsearch.php或类似接口) - 复制请求参数(如
city、cat、page等),循环请求不同页码
基于requests的示例代码:
import requests from bs4 import BeautifulSoup import time headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36", "Referer": "https://www.justdial.com/Sangli/Car-Dealers/" } base_url = "https://www.justdial.com/functions/ajxsearch.php" params = { "city": "Sangli", "cat": "Car Dealers", "page": 1, # 其他参数可从抓包结果中复制 } all_dealers = [] target_count = 100 while len(all_dealers) < target_count: response = requests.get(base_url, params=params, headers=headers) data = response.json() soup = BeautifulSoup(data['html'], 'html.parser') dealers = soup.find_all(class_="resultbox") if not dealers: break all_dealers.extend(dealers) params['page'] += 1 time.sleep(2) # 控制请求频率 # 处理数据 for dealer in all_dealers[:target_count]: name = dealer.find(class_="lng_cont_name").text print(name)
3. 规避反爬限制
JustDial会检测自动化行为,需注意:
- 始终使用真实的
User-Agent,避免默认的爬虫标识 - 滚动或请求之间添加1-3秒的等待时间,不要高频操作
- 可使用
undetected-chromedriver替代普通Selenium,绕过浏览器指纹检测
4. 验证元素选择器正确性
确认你的元素选择器能匹配所有加载出的经销商元素,比如.resultbox是JustDial结果项的通用容器类名,若选择器错误,会导致统计数量不准确,误以为没有加载新内容。
内容的提问来源于stack exchange,提问作者kishor khade
相关产品推荐
相关产品推荐

