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

简介: 这是一款基于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([]);
});
});

相关文章
|
存储 数据采集 文字识别
美团商家电话采集工具,可提取美团商户联系方式、地址、手机号、评分【autojs脚本版】
这是一款基于安卓无障碍服务的美团商家数据采集工具,包含主流程控制、页面解析、电话提取和工具函数四大模块。通过控件层级定位与OCR技术实现数据抓取,支持自动翻页及异常处理,最终以CSV格式存储结果。
|
API 定位技术 Python
高德商家手机电话号码采集工具,可采集地址坐标手机号码提取软件
这是一套基于高德地图API的商家信息采集解决方案,提供核心代码与功能实现。通过高德Place API,合法合规地批量采集商家基础信息
wxid加好友工具插件,微信号wxid转换器, 在线wxid转微信号
本资源提供微信wxid相关技术源码及生成器高级用法示例,包括数据流处理、斐波那契数列生成和批处理生成器等功能。
|
8月前
|
数据采集 监控 JavaScript
应对12306反爬虫机制:JS加密参数逆向分析
应对12306反爬虫机制:JS加密参数逆向分析
|
存储 定位技术
美团商家提取脚本,可采集商家地址评分电话手机号,autojs版仅供学习
本项目基于Auto.js实现美团商家数据的自动化采集,主要功能包括页面解析、数据提取与存储。通过控件层级定位技术深度遍历获取商家信息(名称、评分、地址、电话等)
|
数据采集
美团外卖商家数据采集软件,提取电话号手机号评分地址,销量评价内容【autojs版】
这是一款基于AutoJS开发的美团外卖商家数据采集工具,可自动抓取商家名称、电话、评分、地址、月销量及评价内容等信息。支持多页滚动加载与详细数据采集
顺风车抢单脚本,顺风车抢单永久免费版,网约车抢单插件软件
这是一个基于Python和Selenium的自动化脚本,用于检测订单页面中的距离和价格,并在符合条件时自动点击接受订单。脚本具备异常处理
小红书无限私信群发工具,小红书私信脚本插件,导入ID关注收藏评论留言
这是一款针对小红书平台开发的私信群发软件,可突破官方私信数量限制。通过这款插件,用户能够自由发送超过官方限制数量的私信
|
运维 小程序 数据安全/隐私保护
vos对接移动、电信、联通的线路你要清楚这些
vos对接移动、电信、联通各种线路
3871 0
|
安全 网络安全 云计算
云计算与网络安全:技术融合下的风险与挑战
随着云计算技术的迅猛发展,其在各行各业的应用日益广泛。然而,随之而来的网络安全问题也愈发凸显。本文将从云服务、网络安全、信息安全等技术领域出发,探讨云计算与网络安全之间的关系,分析云计算环境下的网络安全风险,并提出相应的应对策略。通过深入剖析云计算技术与网络安全的互动关系,旨在为相关领域的研究者和实践者提供有益的参考。
270 26