首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >视频号商家电话采集器 微信小店电商导出工具使用说明

视频号商家电话采集器 微信小店电商导出工具使用说明

原创
作者头像
vx-taobao01221
发布于 2026-10-12 09:53:31
发布于 2026-10-12 09:53:31
300
举报
文章被收录于专栏:爬虫使用教程爬虫使用教程

视频号商家电话采集器 微信小店电商导出工具使用说明

声明:本文仅讨论商家主动公开数据的本地整理与导出,不涉及破解登录、验证码识别、风控对抗、非公开接口调用或隐私数据抓取。请遵守微信/视频号/微信小店平台规则。仅分享实现思路与示例代码。

一、背景

在视频号带货、微信小店电商运营、选品对接、商务合作等场景中,有时需要整理商家的公开联系方式。部分商家会在公开页面、公开资料或商品信息中展示客服电话、400 电话或座机。人工复制效率低,容易遗漏,因此可以用脚本对已公开、可访问的页面做本地整理。

本文标题中的“视频号商家电话采集器 / 微信小店电商导出工具”,指的是:把商家主动公开在页面上的联系方式,做本地解析、去重并导出 CSV。它不绕过微信登录,不调用非公开接口,也不处理未公开数据。

二、工具能做什么

一个合规的“视频号商家电话采集器”通常只做以下几件事:

  1. 读取本地保存的公开页面 HTML 或公开文本;
  2. 解析页面中的手机号、400 电话、常见座机号;
  3. 提取 tel: 链接中的电话;
  4. 自动清洗、去重;
  5. 导出 CSV,方便后续人工核对;
  6. 不修改平台数据,不上传数据到第三方服务器;
  7. 遇到登录、验证码或平台禁止时停止,不强行绕过。

再次强调:如果商家没有公开电话,工具无法获取,也不应尝试通过非正常手段获取。

三、使用步骤

1. 安装依赖

需要 Python 3.8+,安装依赖:

代码语言:javascript
复制
pip install beautifulsoup4

2. 准备公开页面

推荐方式:

  1. 在浏览器中打开你确认可以访问、且页面中已经公开电话的商家页面;
  2. 右键“另存为”,保存为 .html 文件;
  3. 或者把公开可见的文本复制到 .txt 文件;
  4. 将文件放入 input 文件夹。

不建议直接高频请求微信/视频号/微信小店页面。手动保存公开页面既能降低平台压力,也能确保数据来源是公开可见的。若页面需要登录,请只保存你自己有权访问、且商家主动公开的信息。

3. 运行脚本

将下方代码保存为 export_video_shop_phones.py,运行:

代码语言:javascript
复制
python export_video_shop_phones.py

4. 查看结果

脚本会在 output 文件夹生成 video_shop_public_phones.csv,包含“来源文件”“电话”“类型”三列。建议导出后人工核对,避免把平台客服电话、无关号码误当成商家电话。

四、核心代码示例

以下代码仅做本地公开页面解析,不包含网络请求,不包含登录、验证码、风控绕过逻辑。

代码语言:javascript
复制
import csv
import os
import re
from bs4 import BeautifulSoup

# 电话匹配规则
PHONE_PATTERNS = [
    ("手机", re.compile(r"(?<!\d)(?:\+?86)?1[3-9]\d{9}(?!\d)")),
    ("400", re.compile(r"(?<!\d)400[-\s]?\d{3}[-\s]?\d{4}(?!\d)")),
    ("座机", re.compile(r"(?<!\d)0\d{2,3}[-\s]?\d{7,8}(?!\d)")),
]

INPUT_DIR = "input"
OUTPUT_CSV = "output/video_shop_public_phones.csv"


def clean_phone(phone: str) -> str:
    """清洗电话字符串"""
    phone = phone.strip()
    phone = re.sub(r"[\s\-()]", "", phone)
    if phone.startswith("+86"):
        phone = phone[3:]
    if phone.startswith("0086"):
        phone = phone[4:]
    return phone


def detect_type(phone: str) -> str:
    """判断电话类型"""
    if re.fullmatch(r"1[3-9]\d{9}", phone):
        return "手机"
    if re.fullmatch(r"400\d{7}", phone):
        return "400"
    if re.fullmatch(r"0\d{9,11}", phone):
        return "座机"
    return "其他"


def extract_phones_from_html(html: str):
    """从 HTML/文本中提取公开电话"""
    soup = BeautifulSoup(html, "html.parser")
    text = soup.get_text(separator=" ", strip=True)

    phones = []

    # 从正文文本提取
    for _, pattern in PHONE_PATTERNS:
        phones.extend(pattern.findall(text))

    # 从 tel: 链接提取
    for a in soup.find_all("a", href=True):
        href = a["href"].strip()
        if href.lower().startswith("tel:"):
            phones.append(href[4:].strip())

    result = set()
    for phone in phones:
        cleaned = clean_phone(phone)
        if cleaned:
            result.add(cleaned)

    return sorted(result)


def read_local_file(path: str) -> str:
    """读取本地公开页面或文本"""
    with open(path, "r", encoding="utf-8", errors="ignore") as f:
        return f.read()


def process_local(input_dir: str):
    """批量处理本地公开页面"""
    rows = []

    if not os.path.isdir(input_dir):
        print(f"[提示] 本地目录不存在:{input_dir}")
        print("请创建 input 文件夹,并放入公开页面 HTML 或 TXT 文件。")
        return rows

    for root, _, files in os.walk(input_dir):
        for name in files:
            if not name.lower().endswith((".html", ".htm", ".txt")):
                continue

            path = os.path.join(root, name)
            try:
                content = read_local_file(path)
            except Exception as e:
                print(f"[读取失败] {path}:{e}")
                continue

            for phone in extract_phones_from_html(content):
                rows.append([path, phone, detect_type(phone)])

    return rows


def deduplicate(rows):
    """按来源文件 + 电话去重"""
    seen = set()
    unique_rows = []

    for source, phone, phone_type in rows:
        key = (source, phone)
        if key not in seen:
            seen.add(key)
            unique_rows.append([source, phone, phone_type])

    return unique_rows


def export_csv(rows, output_csv: str):
    """导出 CSV"""
    out_dir = os.path.dirname(output_csv)
    if out_dir:
        os.makedirs(out_dir, exist_ok=True)

    with open(output_csv, "w", newline="", encoding="utf-8-sig") as f:
        writer = csv.writer(f)
        writer.writerow(["来源文件", "电话", "类型"])
        writer.writerows(rows)

    print(f"[完成] 共导出 {len(rows)} 条记录到 {output_csv}")


def main():
    rows = process_local(INPUT_DIR)
    rows = deduplicate(rows)
    export_csv(rows, OUTPUT_CSV)


if __name__ == "__main__":
    main()

五、代码说明

  1. 只读本地文件:代码不会主动访问微信、视频号或微信小店页面,避免触发平台风控。
  2. 多类型匹配:支持手机号、400 电话、常见座机号。
  3. 清洗与去重:会去掉空格、横线、括号,并处理 +86、0086 前缀。
  4. 导出 CSV:使用 utf-8-sig 编码,Excel 打开不易乱码。
  5. 人工复核:正则匹配可能把平台客服电话、物流电话误识别为商家电话,导出后需人工核对。

如果你的页面是动态渲染的,另存为 HTML 可能拿不到电话。此时不要尝试绕过登录或风控,建议优先联系商家通过正规渠道获取,或使用平台官方授权接口。

六、官方接口优先

如果需要长期、稳定地导出微信小店电商数据,建议优先使用官方开放平台或授权接口。商家授权后,可以通过正规方式获取店铺、订单、商品等数据。公开页面解析只适合小规模、临时性的公开信息整理,不应作为批量采集手段。

七、合规与注意事项

  1. 只处理公开数据:只整理商家主动展示的电话,未公开的数据不要尝试获取。
  2. 遵守平台规则:微信、视频号、微信小店有自身服务条款,批量采集前请确认是否被允许。
  3. 不要绕过登录和验证码:遇到登录、验证码、风控提示应立即停止。
  4. 控制频率:不要使用多线程、代理池高频请求平台。

八、总结

本文分享的“视频号商家电话采集器 / 微信小店电商导出工具”实现思路,核心是:读取本地公开页面 → 解析公开电话 → 清洗去重 → 导出 CSV。它适合小规模、合规的数据整理场景。

技术本身是中性的,关键在于使用方式。希望这篇教程能帮助你在合规前提下提升整理效率。平台页面结构会变化,代码也可能需要根据实际情况调整;若页面需要登录或出现验证码,请立即停止,不要尝试绕过。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 视频号商家电话采集器 微信小店电商导出工具使用说明
    • 一、背景
    • 二、工具能做什么
    • 三、使用步骤
      • 1. 安装依赖
      • 2. 准备公开页面
      • 3. 运行脚本
      • 4. 查看结果
    • 四、核心代码示例
    • 五、代码说明
    • 六、官方接口优先
    • 七、合规与注意事项
    • 八、总结
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档