声明:本文仅讨论商家主动公开数据的本地整理与导出,不涉及破解登录、验证码识别、风控对抗、非公开接口调用或隐私数据抓取。请遵守微信/视频号/微信小店平台规则。仅分享实现思路与示例代码。
在视频号带货、微信小店电商运营、选品对接、商务合作等场景中,有时需要整理商家的公开联系方式。部分商家会在公开页面、公开资料或商品信息中展示客服电话、400 电话或座机。人工复制效率低,容易遗漏,因此可以用脚本对已公开、可访问的页面做本地整理。
本文标题中的“视频号商家电话采集器 / 微信小店电商导出工具”,指的是:把商家主动公开在页面上的联系方式,做本地解析、去重并导出 CSV。它不绕过微信登录,不调用非公开接口,也不处理未公开数据。
一个合规的“视频号商家电话采集器”通常只做以下几件事:
tel: 链接中的电话;再次强调:如果商家没有公开电话,工具无法获取,也不应尝试通过非正常手段获取。
需要 Python 3.8+,安装依赖:
pip install beautifulsoup4推荐方式:
.html 文件;.txt 文件;input 文件夹。不建议直接高频请求微信/视频号/微信小店页面。手动保存公开页面既能降低平台压力,也能确保数据来源是公开可见的。若页面需要登录,请只保存你自己有权访问、且商家主动公开的信息。
将下方代码保存为 export_video_shop_phones.py,运行:
python export_video_shop_phones.py脚本会在 output 文件夹生成 video_shop_public_phones.csv,包含“来源文件”“电话”“类型”三列。建议导出后人工核对,避免把平台客服电话、无关号码误当成商家电话。
以下代码仅做本地公开页面解析,不包含网络请求,不包含登录、验证码、风控绕过逻辑。
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()+86、0086 前缀。utf-8-sig 编码,Excel 打开不易乱码。如果你的页面是动态渲染的,另存为 HTML 可能拿不到电话。此时不要尝试绕过登录或风控,建议优先联系商家通过正规渠道获取,或使用平台官方授权接口。
如果需要长期、稳定地导出微信小店电商数据,建议优先使用官方开放平台或授权接口。商家授权后,可以通过正规方式获取店铺、订单、商品等数据。公开页面解析只适合小规模、临时性的公开信息整理,不应作为批量采集手段。
本文分享的“视频号商家电话采集器 / 微信小店电商导出工具”实现思路,核心是:读取本地公开页面 → 解析公开电话 → 清洗去重 → 导出 CSV。它适合小规模、合规的数据整理场景。
技术本身是中性的,关键在于使用方式。希望这篇教程能帮助你在合规前提下提升整理效率。平台页面结构会变化,代码也可能需要根据实际情况调整;若页面需要登录或出现验证码,请立即停止,不要尝试绕过。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。