下载地址:https://www.pan38.com/share.php?code=pvvmX 提取码:8888
该实现包含4个模块:主流程控制、页面解析、电话提取和工具函数。采用控件层级定位结合OCR技术,支持自动翻页和异常处理。使用时需开启无障碍服务,数据存储为CSV格式。
// 配置参数
const CONFIG = {
SCROLL_DELAY: 2000,
MAX_PAGE: 10,
OUTPUT_PATH: "/sdcard/meituan_data.csv"
};
// 主采集流程
function main() {
if(!requestScreenCapture()) {
toast("请授予屏幕截图权限");
return;
}
launchApp("美团");
sleep(5000);
let results = [];
for(let i=0; i<CONFIG.MAX_PAGE; i++) {
let items = parseCurrentPage();
if(items.length === 0) break;
results = results.concat(items);
swipeToNextPage();
}
exportToCSV(results);
toast("采集完成,共获取" + results.length + "条数据");
}
解析当前页商家数据
function parseCurrentPage() {
let items = [];
let root = className("android.view.View").depth(12).findOne(3000);
if(!root) return items;
let shops = root.children();
for(let shop of shops) {
try {
let item = {
name: parseName(shop),
score: parseScore(shop),
address: parseAddress(shop),
phone: parsePhone(shop)
};
items.push(item);
} catch(e) {
console.error("解析失败: " + e);
}
}
return items;
}
function parseName(node) {
return node.findOne(className("TextView").depth(15)).text();
}
// 提取联系电话(含点击展开逻辑)
function parsePhone(shopNode) {
let phoneBtn = shopNode.findOne(textMatches(/(电话|拨打)/));
if(!phoneBtn) return "";
phoneBtn.click();
sleep(1500);
// 两种号码格式匹配
let phone = textMatches(/(1[3-9]\d{9}|[0-9]{3,4}-[0-9]{7,8})/)
.findOne(2000)?.text() || "";
back();
sleep(800);
return phone;
}
数据导出CSV
function exportToCSV(data) {
let header = "商家名称,评分,地址,联系电话\n";
let content = data.map(item =>
"${item.name}",${item.score},"${item.address}","${item.phone}"
).join("\n");
files.write(CONFIG.OUTPUT_PATH, header + content);
}
// 页面滚动控制
function swipeToNextPage() {
swipe(device.width/2, device.height0.7,
device.width/2, device.height0.3, 800);
sleep(CONFIG.SCROLL_DELAY);
}