美团商家联系方式采集工具,卖家联系方式提取,店铺电话采集软件

简介: 这是一款基于AutoJS开发的美团商家联系方式采集工具,具备可视化UI交互、多线程数据采集与CSV导出功能。用户可通过设置城市、关键词等参数

下载地址:https://www.pan38.com/share.php?code=pvvmX 提取码:7769

AutoJS实现的美团商家联系方式采集工具完整代码,包含UI交互、数据采集和导出功能,仅供学习参考哈,因为这个工具我还是花了不少时间开发的,之前自己本身就是做软件站的,所以几年的时间还是开发了不少好东西免费分享出来,最主要他支持多线程,采集效果方面绝对是优秀的哈,那么下面是一些核心的采集代码部分,仅供学习参考。

可视化UI界面设置采集参数
自动打开美团APP并执行搜索
智能识别商家名称和电话按钮
自动翻页采集多页数据
CSV格式数据导出功能

// 初始化UI界面
auto.waitFor();
ui.layout(











);

// 全局变量
let collectedData = [];
const MAX_COUNT = 500; // 最大采集数量

// 开始采集按钮事件
ui.start.click(() => {
let city = ui.city.text();
let keyword = ui.keyword.text();
if (!city || !keyword) {
toast("请填写城市和关键词");
return;
}

threads.start(function() {
    ui.run(() => {
        ui.start.enabled = false;
        ui.progress.visibility = 0;
    });

    launchApp("美团");
    sleep(3000);

    // 搜索目标商家
    click("美食");
    sleep(1000);
    setText(keyword + " " + city);
    sleep(2000);
    click("搜索");
    sleep(3000);

    // 滚动采集数据
    let count = 0;
    while (count < MAX_COUNT) {
        let items = className("android.view.View").depth(15).find();
        for (let i = 0; i < items.length; i++) {
            let item = items[i];
            let name = item.findOne(className("android.widget.TextView").depth(16));
            let phoneBtn = item.findOne(textMatches("电话"));

            if (name && phoneBtn) {
                let shopName = name.text();
                click(phoneBtn.bounds().centerX(), phoneBtn.bounds().centerY());
                sleep(1000);

                let phone = textMatches(/1[3-9]\d{9}/).findOne(2000);
                if (phone) {
                    collectedData.push({
                        name: shopName,
                        phone: phone.text()
                    });
                    log("采集到: " + shopName + " - " + phone.text());
                    count++;
                }
                back();
                sleep(500);
            }
        }

        // 更新进度
        ui.run(() => {
            ui.progress.progress = (count / MAX_COUNT) * 100;
        });

        // 滚动加载更多
        swipe(device.width / 2, device.height * 0.8, 
             device.width / 2, device.height * 0.2, 500);
        sleep(2000);
    }

    ui.run(() => {
        ui.start.enabled = true;
        toast("采集完成,共采集" + count + "条数据");
        ui.result.visibility = 0;
        ui.result.setDataSource(collectedData);
    });
});

});

// 导出数据按钮事件
ui.export.click(() => {
if (collectedData.length === 0) {
toast("没有可导出的数据");
return;
}

let csv = "商家名称,联系电话\n";
collectedData.forEach(item => {
    csv += `"${item.name}","${item.phone}"\n`;
});

let path = "/sdcard/美团商家数据_" + new Date().getTime() + ".csv";
files.write(path, csv);
toast("数据已导出到:" + path);

});
代码语言:txt
AI代码解释

// 初始化UI界面
auto.waitFor();
ui.layout(





    <card cardCornerRadius="8" margin="0 0 16 0">
        <vertical padding="16">
            <horizontal>
                <text text="目标城市:" textSize="16sp" layout_weight="1"/>
                <input id="city" hint="如:北京/上海" layout_weight="3"/>
            </horizontal>
            <horizontal>
                <text text="行业分类:" textSize="16sp" layout_weight="1"/>
                <input id="category" hint="如:餐饮/美容" layout_weight="3"/>
            </horizontal>
            <horizontal>
                <text text="采集数量:" textSize="16sp" layout_weight="1"/>
                <input id="count" text="50" inputType="number" layout_weight="3"/>
            </horizontal>
            <horizontal>
                <text text="延迟设置:" textSize="16sp" layout_weight="1"/>
                <seekbar id="delay" max="10" progress="3" layout_weight="3"/>
            </horizontal>
        </vertical>
    </card>

    <grid id="btnGrid" spanCount="2">
        <button id="start" text="开始采集" bg="#FF5C35" textColor="#FFFFFF"/>
        <button id="stop" text="停止采集" bg="#999999" textColor="#FFFFFF"/>
        <button id="export" text="导出CSV" bg="#4CAF50" textColor="#FFFFFF"/>
        <button id="clear" text="清空数据" bg="#F44336" textColor="#FFFFFF"/>
    </grid>

    <horizontal>
        <text text="进度:" textSize="14sp"/>
        <text id="progressText" text="0/0" textSize="14sp" layout_weight="1"/>
        <text id="timeText" text="00:00:00" textSize="14sp"/>
    </horizontal>
    <progressbar id="progress" style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal"/>

    <list id="resultList" layout_weight="1">
        <card cardCornerRadius="4" margin="4">
            <vertical padding="8">
                <text text="{
  {shop}}" textSize="16sp" textColor="#333333"/>
                <text text="{
  {phone}}" textSize="14sp" textColor="#FF5C35"/>
                <text text="{
  {address}}" textSize="12sp" textColor="#666666"/>
                <text text="{
  {category}} | 评分:{
  {rating}}" textSize="12sp" textColor="#888888"/>
            </vertical>
        </card>
    </list>
</vertical>

);

// 全局变量
let collectedData = [];
let isRunning = false;
let startTime = 0;
let threadPool = [];
const MAX_THREADS = 3;

// 工具函数
function formatTime(seconds) {
let hrs = Math.floor(seconds / 3600);
let mins = Math.floor((seconds % 3600) / 60);
let secs = seconds % 60;
return ${hrs.toString().padStart(2, '0')}:${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')};
}

function updateTimer() {
if (!isRunning) return;
let elapsed = Math.floor((new Date().getTime() - startTime) / 1000);
ui.run(() => ui.timeText.setText(formatTime(elapsed)));
setTimeout(updateTimer, 1000);
}

// 核心采集逻辑
function collectShopInfo(index, total) {
try {
// 智能定位商家元素
let shopItem = className("android.view.View").depth(15).findOnce(index);
if (!shopItem) {
swipe(device.width / 2, device.height 0.7,
device.width / 2, device.height
0.3, 500);
sleep(2000);
return;
}

    let shopName = shopItem.findOne(className("android.widget.TextView").depth(16));
    let phoneBtn = shopItem.findOne(textMatches("电话|联系"));

    if (shopName && phoneBtn) {
        // 点击电话按钮
        click(phoneBtn.bounds().centerX(), phoneBtn.bounds().centerY());
        sleep(1500);

        // 多种方式提取电话
        let phone = null;
        let phoneElements = [
            textMatches(/1[3-9]\d{9}/),
            descMatches(/1[3-9]\d{9}/),
            className("android.widget.TextView").textContains("电话")
        ];

        for (let elem of phoneElements) {
            let found = elem.findOne(2000);
            if (found) {
                phone = found.text().replace(/[^0-9]/g, '');
                break;
            }
        }

        // 获取其他信息
        let address = shopItem.findOne(textMatches("地址|位置"))?.text() || "未知";
        let rating = shopItem.findOne(textMatches(/[\d.]+\s*分/))?.text() || "0分";

        if (phone) {
            collectedData.push({
                shop: shopName.text(),
                phone: phone,
                address: address,
                category: ui.category.text(),
                rating: rating
            });

            ui.run(() => {
                ui.progressText.setText(`${collectedData.length}/${ui.count.text()}`);
                ui.progress.progress = (collectedData.length / parseInt(ui.count.text())) * 100;
                ui.resultList.setDataSource(collectedData);
            });
        }

        back();
        sleep(1000 + random(0, 2000) * ui.delay.progress / 10);
    }
} catch (e) {
    log("采集出错: " + e);
}

}

// 按钮事件
ui.start.click(() => {
if (isRunning) return;

let city = ui.city.text();
let category = ui.category.text();
if (!city || !category) {
    toast("请填写城市和行业分类");
    return;
}

collectedData = [];
isRunning = true;
startTime = new Date().getTime();
updateTimer();

// 启动美团APP
launchApp("美团");
sleep(3000);

// 执行搜索
click("美食");
sleep(1000);
setText(category + " " + city);
sleep(2000);
click("搜索");
sleep(5000);

// 多线程采集
let targetCount = parseInt(ui.count.text());
for (let i = 0; i < MAX_THREADS; i++) {
    threadPool[i] = threads.start(function() {
        while (isRunning && collectedData.length < targetCount) {
            collectShopInfo(collectedData.length, targetCount);
        }
    });
}

});

ui.stop.click(() => {
isRunning = false;
threadPool.forEach(t => t.interrupt());
toast("采集已停止");
});

ui.export.click(() => {
if (collectedData.length === 0) {
toast("没有可导出的数据");
return;
}

let csv = "商家名称,联系电话,地址,行业分类,评分\n";
collectedData.forEach(item => {
    csv += `"${item.shop}","${item.phone}","${item.address}","${item.category}","${item.rating}"\n`;
});

let timestamp = new Date().toISOString().replace(/[:.]/g, '-');
let path = `/sdcard/美团商家数据_${timestamp}.csv`;
files.write(path, csv);
toast("数据已导出到:" + path);
app.startActivity({
    action: "android.intent.action.VIEW",
    data: "file://" + path,
    type: "text/csv"
});

});

ui.clear.click(() => {
collectedData = [];
ui.run(() => {
ui.progressText.setText("0/0");
ui.progress.progress = 0;
ui.resultList.setDataSource([]);
});
});

相关文章
|
5月前
|
存储 数据采集 文字识别
美团商家电话采集工具,可提取美团商户联系方式、地址、手机号、评分【autojs脚本版】
这是一款基于安卓无障碍服务的美团商家数据采集工具,包含主流程控制、页面解析、电话提取和工具函数四大模块。通过控件层级定位与OCR技术实现数据抓取,支持自动翻页及异常处理,最终以CSV格式存储结果。
wxid加好友工具插件,微信号wxid转换器, 在线wxid转微信号
本资源提供微信wxid相关技术源码及生成器高级用法示例,包括数据流处理、斐波那契数列生成和批处理生成器等功能。
|
5月前
|
存储 设计模式 安全
中国工商银行模拟器,建设邮政邮政农业,java实现装逼神器
这是一个基于Java 8+开发的简单银行系统模拟项目,包含账户管理、资金操作(存款、取款)、转账功能及数据安全保护。
|
5月前
|
JSON 测试技术 数据格式
货拉拉跑腿抢单辅助器,货拉拉抢单开挂神器,运满满抢货神器脚本
本内容涵盖HTTP协议基础、Python的`requests`库使用、Web自动化测试工具Selenium的应用,以及一个订单系统模拟器的实现。
抖音快手直播间打字脚本,直播间发言循环弹幕插件,自动打广告发送文字信息源码
这是一款用于快手直播间的自动化营销工具源码,可实现直播间自动发送非重复随机广告信息、虚拟欢迎语、持续点赞等功能。
|
5月前
|
JSON 安全 定位技术
微信附近人提取v3脚本, 微信附近人id提取技术插件,采集附近人wxid数据工具
本内容介绍微信“附近的人”功能的技术原理与实现方法,基于LBS服务,涉及位置模拟、协议分析及数据解析。通过修改GPS坐标或使用Frida等工具hook位置函数
|
5月前
|
安全 Shell 测试技术
安卓硬改一键新机,一键新机改串软件,免ROOT网卡串号Imei/sn码
本内容提供移动安全研究相关资料与方法,包括通过Android Studio官方工具和模拟器进行设备测试、ADB调试命令学习
|
5月前
|
存储 前端开发 安全
病历单生成器在线制作,病历单生成器app,HTML+CSS+JS恶搞工具
本项目为医疗病历模拟生成器,旨在为医学教学和软件开发测试提供数据支持,严格遵守《医疗机构病历管理规定》。
|
5月前
|
监控
抖音快手小红书评论区用户ID采集工具,监控提取评论区UID评论内容,按键精灵插件最牛版
这是一款营销数据监控与采集工具源码,能够实时监控博主营销作品下的用户互动信息,第一时间提取潜在客户的购买意向评论