如何抓取滚动加载的JustDial医生数据?仅需姓名、地址、电话
最优抓取方案分析与实现思路
方案一:破解AJAX请求参数规律(推荐)
JustDial的滚动加载本质是触发AJAX POST请求,参数看似动态变化但大多存在固定规律,你可以按以下步骤拆解:
- 打开浏览器开发者工具(F12),切换到Network标签,筛选XHR/fetch请求。
- 滚动页面加载新数据,定位加载列表的POST请求(通常URL包含
search_result.php类关键词)。 - 拆解请求参数:
- 固定参数:
city(Mumbai)、cat_id(对应nct-10892680的分类ID)、limit(固定为10)这类参数不会变化。 - 动态参数:
start(起始条目索引,第一次为0,第二次为10,第三次为20……)、page(对应start/limit的页码)是核心动态参数;部分如session_id的参数,可在首次请求后复用,无需频繁更换。
- 固定参数:
- 验证规律:手动修改
start参数值(比如设为20)发送请求,确认是否返回第21-30条数据,验证规律后即可批量构造请求。 - 代码实现逻辑:
- 先发送初始请求,获取必要的Cookie或会话信息。
- 循环构造
start参数(0、10、20……),发送POST请求,解析返回的JSON/HTML数据,提取姓名、地址、电话。 - 当请求返回数据为空或条目数不足10条时,停止循环。
方案二:优化Selenium滚动加载(备选)
如果AJAX参数破解遇到阻碍,可通过优化Selenium逻辑降低耗时:
- 直接执行JS脚本滚动到页面底部,替代手动逐次滚动:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") - 用WebDriverWait等待新元素加载,替代固定sleep,减少无效等待时间:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By last_height = driver.execute_script("return document.body.scrollHeight") while True: driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 等待页面高度变化,确认新数据加载完成 WebDriverWait(driver, 10).until( lambda d: d.execute_script("return document.body.scrollHeight") > last_height ) last_height = driver.execute_script("return document.body.scrollHeight") # 提取当前页面所有已加载的医生数据 # 若滚动后页面高度不再变化,判定为加载完成,退出循环 - 提取数据时,用集合存储已抓取的电话或姓名,避免重复采集。
关键注意事项
- 两种方案都需设置1-2秒的请求间隔,避免触发网站反爬机制。
- 抓取电话号码时,若遇到图片格式的号码,需配合OCR工具识别;若为JS动态渲染,需提取对应JS变量或解析渲染后的文本。
- 遵守网站
robots.txt规则,避免过度请求。
内容的提问来源于stack exchange,提问作者juan
相关产品推荐
相关产品推荐

