下载地址: https://www.pan38.com/share.php?code=pvvmX 提取码:5589
基于AutoJS的美团外卖商家数据采集脚本实现,包含商家信息、评分、地址、销量和评价内容的抓取功能,刚试了一下还能继续采集,因为我开发的时候是上个月,目前对于最新版美团客户端还能正常采集,如果采集不了的话请下载旧版美团客户端绝对就可以了,然后他采集的数据就包括上面那些信息,当然还有其他的我这边就没办法一个个给你打出来,仅供学习。
核心代码:
// 美团外卖商家数据采集工具 - AutoJS版
// 功能:自动采集商家信息、电话、评分、地址、销量和评价内容
"ui";
ui.layout(
);
// 全局变量
let isRunning = false;
let collectedData = [];
const MAX_PAGES = 5; // 最大采集页数
// 主采集函数
function mainCrawler() {
if (!requestScreenCapture()) {
log("请求截图权限失败");
return;
}
launchApp("美团外卖");
sleep(3000);
// 处理可能的弹窗
handlePopup();
// 执行搜索
performSearch();
// 采集商家列表
collectShopList();
// 保存数据
saveData();
}
// 处理弹窗
function handlePopup() {
// 关闭青少年模式弹窗
if (text("我知道了").exists()) {
text("我知道了").click();
sleep(1000);
}
// 关闭位置授权弹窗
if (text("允许").exists()) {
text("允许").click();
sleep(1000);
}
}
// 执行搜索
function performSearch() {
let keyword = ui.keyword.getText();
let location = ui.location.getText();
// 点击搜索框
let searchBox = id("com.sankuai.meituan.takeoutnew:id/search_edit").findOne(3000);
if (searchBox) {
searchBox.click();
sleep(1000);
// 输入关键词
setText(0, keyword);
sleep(1000);
// 点击搜索按钮
let searchBtn = text("搜索").findOne(3000);
if (searchBtn) {
searchBtn.click();
sleep(3000);
}
}
}
// 采集商家列表
function collectShopList() {
for (let page = 0; page < MAX_PAGES && isRunning; page++) {
log("正在采集第 " + (page + 1) + " 页商家...");
// 滑动到底部加载更多
scrollDown();
sleep(3000);
// 获取当前页商家元素
let shops = className("android.view.View").depth(15).find();
if (shops.empty()) {
log("未找到商家列表");
break;
}
// 遍历商家
for (let i = 0; i < shops.length && isRunning; i++) {
let shop = shops[i];
let bounds = shop.bounds();
// 点击进入商家详情
click(bounds.centerX(), bounds.centerY());
sleep(3000);
// 采集商家详情
let shopData = collectShopDetail();
if (shopData) {
collectedData.push(shopData);
log("成功采集: " + shopData.name);
}
// 返回列表
back();
sleep(2000);
}
// 滑动到下一页
swipe(device.width / 2, device.height * 0.8,
device.width / 2, device.height * 0.2, 500);
sleep(3000);
}
}
// 采集商家详情
function collectShopDetail() {
let shopData = {
name: "",
phone: "",
score: "",
address: "",
monthlySales: "",
reviews: []
};
// 获取商家名称
let nameElem = id("com.sankuai.meituan.takeoutnew:id/shop_name").findOne(3000);
if (nameElem) shopData.name = nameElem.text();
// 获取评分
let scoreElem = id("com.sankuai.meituan.takeoutnew:id/score").findOne(3000);
if (scoreElem) shopData.score = scoreElem.text();
// 获取月售
let salesElem = id("com.sankuai.meituan.takeoutnew:id/month_sale_num").findOne(3000);
if (salesElem) shopData.monthlySales = salesElem.text();
// 点击查看商家信息
let infoBtn = textContains("商家信息").findOne(3000);
if (infoBtn) {
infoBtn.click();
sleep(2000);
// 获取地址
let addressElem = textMatches(/地址[::].+/).findOne(3000);
if (addressElem) shopData.address = addressElem.text().replace(/地址[::]/, "").trim();
// 获取电话
let phoneElem = textMatches(/(\d{3}-\d{8}|\d{4}-\d{7}|\d{11})/).findOne(3000);
if (phoneElem) shopData.phone = phoneElem.text();
// 返回详情页
back();
sleep(2000);
}
// 采集评价
collectReviews(shopData);
return shopData;
}
// 采集评价内容
function collectReviews(shopData) {
// 点击评价标签
let reviewTab = textContains("评价").findOne(3000);
if (reviewTab) {
reviewTab.click();
sleep(3000);
// 滑动加载更多评价
for (let i = 0; i < 3; i++) {
scrollDown();
sleep(2000);
}
// 获取评价元素
let reviewItems = className("android.view.View").depth(18).find();
for (let i = 0; i < reviewItems.length; i++) {
let review = {
user: "",
rating: "",
content: "",
time
// 数据采集核心功能
function collectShopDetail() {
let shopData = {
name: getShopName(),
phone: getPhoneNumber(),
score: getShopScore(),
address: getShopAddress(),
monthlySales: getMonthlySales(),
reviews: collectReviews()
};
return shopData;
}
function getShopName() {
let elem = id("com.sankuai.meituan.takeoutnew:id/shop_name").findOne(3000);
return elem ? elem.text() : "未知商家";
}
function getPhoneNumber() {
clickShopInfo();
let phone = textMatches(/(\d{3}-\d{8}|\d{4}-\d{7}|\d{11})/).findOne(3000);
back();
return phone ? phone.text() : "未获取";
}
滚动加载实现
function loadMoreReviews() {
let lastPos = 0;
while (true) {
let currentPos = getScrollY();
if (currentPos === lastPos) break;
lastPos = currentPos;
scrollDown();
sleep(2000);
}
}
function getScrollY() {
return className("android.widget.ScrollView").findOne().bounds().top;
}
function scrollDown() {
swipe(device.width/2, device.height0.8,
device.width/2, device.height0.2, 500);
}