You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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请求加载数据,你可以跳过模拟滚动,直接抓包获取加载接口,循环请求分页数据:

  1. 打开浏览器开发者工具(F12)→ Network标签
  2. 滚动页面,找到XHR类型的请求(通常是ajxsearch.php或类似接口)
  3. 复制请求参数(如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 19:12:15