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
相关产品推荐
相关产品推荐

