You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现CSV多URL爬取提取电话邮编并导出CSV求助

实现方案

你的现有代码存在几个核心问题,修正后即可完成需求:

  • 方法名拼写错误:Scrapy框架默认读取start_requests(复数形式)作为请求入口,你写的单数方法不会被框架调用
  • 请求逻辑错误:不能把整个URL列表传给单个Request对象,需要遍历列表逐个发起请求
  • 匹配逻辑问题:直接在原始HTML源码上做正则匹配,会把脚本、注释、标签属性里的无效内容匹配出来,结果准确率低
  • 缺失结果绑定、去重、导出逻辑:提取到的内容没有和来源URL绑定,重复内容没有过滤,也没有配置结果输出规则

完整可运行代码

基于Scrapy实现,自动处理请求、解析、去重、CSV导出全流程:

import re
from scrapy import Spider, Request
from bs4 import BeautifulSoup

class ContactInfoSpider(Spider):
    name = "contact_crawler"
    # 读取并清洗URL列表
    with open('urls.csv', 'r', encoding='utf-8') as f:
        start_urls = []
        for line in f:
            url = line.strip()
            if not url:
                continue
            # 自动补全缺失的协议头,避免请求报错
            if not url.startswith(("http://", "https://")):
                url = "https://" + url
            start_urls.append(url)

    def start_requests(self):
        # 逐个URL发起请求,传递来源URL用于结果绑定
        for url in self.start_urls:
            yield Request(
                url=url,
                callback=self.parse,
                cb_kwargs={"source_url": url}
            )

    def parse(self, response, source_url):
        soup = BeautifulSoup(response.body, "lxml")
        # 移除不显示的标签内容,避免无效匹配
        for tag in soup(["script", "style", "meta", "link", "noscript"]):
            tag.decompose()
        page_text = soup.get_text()

        # 正则匹配并去重
        phone_matches = list(set(re.findall(r"\d{3}-\d{3}-\d{4}", page_text)))
        zip_matches = list(set(re.findall(r"(?<=, [A-Z]{2} )\d{5}", page_text)))

        # 返回结构化结果,由框架自动写入CSV
        yield {
            "page_url": source_url,
            "phone_numbers": "; ".join(phone_matches),
            "zip_codes": "; ".join(zip_matches)
        }

使用步骤
  • 安装依赖:执行命令pip install scrapy lxml
  • 把待爬取的URL逐行放在脚本同目录的urls.csv文件中,一行一个URL
  • 把上述代码保存为contact_spider.py,运行爬虫:执行命令scrapy runspider contact_spider.py -o result.csv -s FEED_EXPORT_ENCODING=utf-8-sig
  • 运行完成后,同目录下的result.csv就是最终结果,包含页面URL、提取到的电话号码、邮政编码三个字段,同个页面提取到多个号码/邮编时用分号分隔

如果需要适配其他格式的电话号码、邮政编码,直接修改代码中对应的正则规则即可。如果需要处理请求失败、反爬的场景,可以在Scrapy配置中添加重试、UA轮换等中间件。

内容的提问来源于stack exchange,提问作者user19233490

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 21:24:20