首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >中国制造英文站采集器 跨境电商电话导出教程

中国制造英文站采集器 跨境电商电话导出教程

原创
作者头像
vx-taobao01221
发布于 2026-10-14 10:37:52
发布于 2026-10-14 10:37:52
1180
举报
文章被收录于专栏:爬虫使用教程爬虫使用教程

中国制造英文站采集器 跨境电商电话导出教程

声明:本文仅讨论商家主动公开数据的本地整理与导出,不涉及破解登录、验证码识别、风控对抗、非公开接口调用或隐私数据抓取。请遵守 Made-in-China.com 服务条款、robots.txt。本文仅分享实现思路与示例代码。

一、背景

在跨境电商选品、供应链对接、外贸客户开发等场景中,有时需要整理中国制造英文站(Made-in-China.com)上供应商公开的联系方式。很多供应商会在公开商品页、公司页或联系页展示电话、邮箱、公司名等信息。人工复制效率低,容易遗漏,因此可以用脚本对已公开、可访问的页面做本地整理。

本文标题中的“中国制造英文站采集器 / 跨境电商电话导出教程”,核心是:把商家主动公开在页面上的联系方式,做本地解析、去重并导出 CSV。它不绕过登录,不调用非公开接口,也不处理未公开数据。

二、工具能做什么

一个合规的“中国制造英文站采集器”通常只做以下几件事:

  1. 读取本地保存的公开页面 HTML,或访问 robots.txt 允许的公开 URL;
  2. 解析页面中的公司名、邮箱、电话;
  3. 提取 mailto:、tel: 链接中的联系方式;
  4. 自动清洗、去重;
  5. 导出 CSV,方便后续人工核对;
  6. 不修改平台数据,不上传数据到第三方服务器;
  7. 遇到登录、验证码或 robots.txt 禁止时停止,不强行绕过。

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

三、使用步骤

1. 安装依赖

需要 Python 3.8+,安装依赖:

代码语言:javascript
复制
pip install requests beautifulsoup4

2. 准备公开页面

推荐方式:

  1. 在浏览器中打开你确认可以访问、且页面中已经公开联系方式的供应商页面;
  2. 右键“另存为”,保存为 .html 文件;
  3. 将文件放入 input 文件夹。

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

3. 运行脚本

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

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

4. 查看结果

脚本会在 output 文件夹生成 made_in_china_public_contacts.csv,包含“来源”“公司/标题”“邮箱”“电话”等列。建议导出后人工核对,避免把平台客服电话、物流电话误当成供应商电话。

四、核心代码示例

以下代码演示了从公开页面中提取联系方式并导出 CSV 的基本思路。中国制造英文站页面结构可能变化,代码不保证对所有页面有效,请勿用于违规批量抓取。

代码语言:javascript
复制
import csv
import os
import re
import time
from urllib.parse import urlparse
from urllib.robotparser import RobotFileParser

import requests
from bs4 import BeautifulSoup

HEADERS = {
    "User-Agent": (
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
        "AppleWebKit/537.36 (KHTML, like Gecko) "
        "Chrome/124.0.0.0 Safari/537.36"
    ),
    "Accept-Language": "en-US,en;q=0.9,zh-CN;q=0.8",
}

EMAIL_RE = re.compile(r"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}")

# 国际电话简单匹配:支持 +86、0086、1-xxx、44 20 xxxx 等
PHONE_RE = re.compile(
    r"(?:(?:\+|00)\d{1,3}[\s\-]?)?(?:\(?\d{2,4}\)?[\s\-]?)?\d{3,4}[\s\-]?\d{4}"
)


def can_fetch(url: str) -> bool:
    """检查 robots.txt 是否允许抓取"""
    parsed = urlparse(url)
    robots_url = f"{parsed.scheme}://{parsed.netloc}/robots.txt"
    rp = RobotFileParser()
    rp.set_url(robots_url)
    try:
        rp.read()
    except Exception as e:
        print(f"[robots] 读取失败:{e}")
        return False

    allowed = rp.can_fetch(HEADERS["User-Agent"], url)
    if not allowed:
        print(f"[robots] 不允许抓取:{url}")
    return allowed


def fetch_public_html(url: str):
    """获取公开页面 HTML,单线程、限速、超时"""
    if not can_fetch(url):
        return None

    try:
        resp = requests.get(url, headers=HEADERS, timeout=15)
        if resp.status_code != 200:
            print(f"[HTTP] 状态码 {resp.status_code},URL:{url}")
            return None

        text = resp.text
        low = text.lower()

        # 遇到登录、验证码等页面立即停止,不尝试绕过
        if "captcha" in low or "验证码" in text or "sign in" in low:
            print(f"[停止] 页面可能需要登录或验证,不继续处理:{url}")
            return None

        return text
    except Exception as e:
        print(f"[请求异常] {e},URL:{url}")
        return None


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


def extract_contacts(html: str):
    """从公开 HTML 中提取公司名、邮箱、电话"""
    soup = BeautifulSoup(html, "html.parser")
    text = soup.get_text(separator=" ", strip=True)

    # 公司名 / 页面标题
    company = ""
    if soup.title:
        company = soup.title.get_text(strip=True)
    h1 = soup.find("h1")
    if h1:
        company = h1.get_text(" ", strip=True)

    emails = set(EMAIL_RE.findall(text))
    phones = set(PHONE_RE.findall(text))

    # 提取 mailto: 和 tel: 链接
    for a in soup.find_all("a", href=True):
        href = a["href"].strip()
        if href.lower().startswith("mailto:"):
            emails.add(href[7:].split("?")[0])
        if href.lower().startswith("tel:"):
            phones.add(href[4:])

    emails = {e.strip().lower() for e in emails if e.strip()}
    phones = {clean_phone(p) for p in phones if clean_phone(p)}

    return company, sorted(emails), sorted(phones)


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:
                html = read_local_file(path)
            except Exception as e:
                print(f"[读取失败] {path}:{e}")
                continue

            company, emails, phones = extract_contacts(html)

            if not emails and not phones:
                rows.append([path, company, "", ""])
            else:
                max_len = max(len(emails), len(phones), 1)
                for i in range(max_len):
                    rows.append([
                        path,
                        company,
                        emails[i] if i < len(emails) else "",
                        phones[i] if i < len(phones) else "",
                    ])

    return rows


def process_urls(urls):
    """处理公开且 robots.txt 允许的 URL,谨慎使用"""
    rows = []

    for url in urls:
        print(f"[处理] {url}")
        html = fetch_public_html(url)
        if not html:
            continue

        company, emails, phones = extract_contacts(html)

        if not emails and not phones:
            rows.append([url, company, "", ""])
        else:
            max_len = max(len(emails), len(phones), 1)
            for i in range(max_len):
                rows.append([
                    url,
                    company,
                    emails[i] if i < len(emails) else "",
                    phones[i] if i < len(phones) else "",
                ])

        # 单线程限速,避免对平台造成压力
        time.sleep(8)

    return rows


def deduplicate(rows):
    """按来源 + 公司 + 邮箱 + 电话去重"""
    seen = set()
    unique_rows = []

    for row in rows:
        key = tuple(row)
        if key not in seen:
            seen.add(key)
            unique_rows.append(row)

    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():
    # 推荐:手动保存公开页面到 input 目录
    local_rows = process_local("input")

    # 可选:公开且 robots.txt 允许的 URL。
    # Made-in-China.com 多数页面可能禁止直接抓取,请谨慎使用,不要绕过登录和验证码。
    urls = [
        # "https://www.made-in-china.com/...",
    ]
    url_rows = process_urls(urls)

    all_rows = local_rows + url_rows
    unique_rows = deduplicate(all_rows)

    export_csv(unique_rows, "output/made_in_china_public_contacts.csv")


if __name__ == "__main__":
    main()

如果你只做本地整理,也可以把公开页面手动保存为 HTML,然后用 BeautifulSoup 读取本地文件:

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

def extract_from_local(file_path):
    with open(file_path, "r", encoding="utf-8", errors="ignore") as f:
        html = f.read()

    soup = BeautifulSoup(html, "html.parser")
    text = soup.get_text(" ", strip=True)

    emails = set(re.findall(r"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}", text))
    phones = set(re.findall(
        r"(?:(?:\+|00)\d{1,3}[\s\-]?)?(?:\(?\d{2,4}\)?[\s\-]?)?\d{3,4}[\s\-]?\d{4}",
        text,
    ))

    cleaned = set()
    for p in phones:
        p = re.sub(r"[\s\-()]", "", p)
        if p.startswith("00"):
            p = "+" + p[2:]
        cleaned.add(p)

    return {
        "emails": sorted(emails),
        "phones": sorted(cleaned),
    }

print(extract_from_local("public_page.html"))

五、代码说明

  1. 本地优先:代码默认读取 input 文件夹中的公开页面,不主动请求平台,降低合规风险。
  2. 检查 robots.txt:如果使用 URL 模式,会先检查 robots.txt,不允许就停止。
  3. 多类型匹配:支持邮箱、国际电话、tel: 和 mailto: 链接。
  4. 清洗与去重:会去掉空格、横线、括号,并处理 00 前缀。
  5. 导出 CSV:使用 utf-8-sig 编码,Excel 打开不易乱码。
  6. 人工复核:正则匹配可能把平台客服电话、物流电话误识别为供应商电话,导出后需人工核对。

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

六、官方接口优先

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

七、合规与注意事项

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

八、总结

本文分享的“中国制造英文站采集器 / 跨境电商电话导出教程”实现思路,核心是:读取公开页面 → 解析公开联系方式 → 清洗去重 → 导出 CSV。它适合小规模、合规的数据整理场景,不能也不应被用于非法抓取或骚扰营销。

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

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

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

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