跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python算法

Python 网络爬虫实战:采集附近店铺信息并保存至 CSV

演示如何使用 Python 编写一个简单的网络爬虫程序,用于采集附近店铺的详细信息。主要涉及使用 requests 库发送 HTTP 请求,利用正则表达式解析返回的 JSON 或 HTML 数据,提取店铺名称、评分、地址等关键信息,并通过 csv 模块将结果保存为本地文件。文章涵盖环境配置、核心代码逻辑分析及多页数据采集流程,同时提供了异常处理和合规性建议。

二进制发布于 2025/2/6更新于 2026/10/2494 浏览
Python 网络爬虫实战:采集附近店铺信息并保存至 CSV

前言

本文将介绍如何使用 Python 编写一个简单的网络爬虫程序,用于采集附近店铺的详细信息。主要涉及使用 requests 库发送 HTTP 请求,利用正则表达式解析返回的数据,提取店铺名称、评分、地址及联系方式等字段,并通过 csv 模块将数据存储到本地文件中。

使用环境

  • Python 3.8+ 解释器
  • PyCharm 或 VS Code 编辑器

依赖模块

本示例主要使用以下标准库和第三方库:

  1. requests:用于发送 HTTP 请求。
  2. csv:用于将数据写入 CSV 文件。
  3. re:用于正则表达式匹配。
  4. time:用于控制请求频率。

安装命令:

pip install requests

基本思路

数据来源分析

在开始采集之前,需要明确目标网站的数据结构。通常通过开发者工具(F12)的 Network 面板分析接口请求。

  1. 确定目标 URL:找到获取店铺列表的 API 接口。
  2. 分析参数:查看请求所需的参数(如页码、关键词、Token 等)。
  3. 确认响应格式:通常为 JSON 格式,包含店铺的基本信息和详情页链接。
代码流程步骤
  1. 构建请求:设置 Headers(User-Agent, Referer 等)以模拟浏览器行为。
  2. 发送请求:使用 requests.get 或 requests.post 获取响应。
  3. 解析数据:从响应中提取关键字段(名称、价格、评分等)。
  4. 详情补充:根据详情页链接进一步获取电话、营业时间等信息。
  5. 保存数据:将整理好的字典列表写入 CSV 文件。
  6. 翻页处理:循环修改偏移量(offset)或页码,实现多页数据采集。

代码展示

以下是一个完整的示例代码,展示了如何采集店铺列表并保存为 CSV 文件。

import requests
import re
import csv
import time
import os

def get_shop_info(html_url):
    """
    获取单个店铺的详细信息(电话、地址、营业时间)
    :param html_url: 店铺详情页 URL
    :return: 包含信息的列表 [address, phone, openTime]
    """
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36',
        'Referer': 'https://www.example.com/', # 请替换为目标网站的真实域名
    }
    try:
        response = requests.get(url=html_url, headers=headers, timeout=10)
        response.encoding = response.apparent_encoding
        text = response.text
        
        # 注意:实际项目中需根据具体网页源码调整正则表达式
        # 此处仅为示例逻辑
        phone = re.findall(r'"phone":"(.*?)"', text)
        open_time = re.findall(r'"openTime":"(.*?)"', text)
        address = re.findall(r'"address":"(.*?)"', text)
        
        if phone and open_time and address:
            return [address[0], phone[0], open_time[0].replace('\\n', '')]
        else:
            return ['', '', '']
    except Exception as e:
        print(f"获取详情失败:{e}")
        return ['', '', '']

def main():
    # 配置基础 URL 和参数
    base_url = 'https://api.example.com/search' # 请替换为目标搜索接口 URL
    output_file = 'shop_data.csv'
    
    # 初始化 CSV 写入器
    fieldnames = [
        '店铺名称', '人均消费', '店铺评分', '评论人数', 
        '所在商圈', '店铺类型', '店铺地址', '联系方式', 
        '营业时间', '详情页'
    ]
    
    with open(output_file, mode='a', encoding='utf-8-sig', newline='') as f:
        csv_writer = csv.DictWriter(f, fieldnames=fieldnames)
        
        # 仅当文件为空时才写入表头
        if os.path.getsize(output_file) == 0:
            csv_writer.writeheader()
        
        # 模拟分页循环
        for page in range(0, 100, 32): # 假设每页 32 条,共 3 页演示
            time.sleep(2) # 控制频率,避免被封 IP
            
            params = {
                'uuid': 'demo_uuid_12345',
                'userid': 'demo_user_id',
                'limit': '32',
                'offset': page,
                'cateId': '-1',
                'q': '按摩',
                'token': 'demo_token_string'
            }
            
            headers = {
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
                'Referer': 'https://www.example.com/'
            }
            
            try:
                response = requests.get(url=base_url, params=params, headers=headers)
                result = response.json().get('data', {}).get('searchResult', [])
                
                for index in result:
                    shop_id = index.get('id')
                    detail_url = f'https://www.example.com/shop/{shop_id}/' # 请替换为真实详情页格式
                    
                    # 获取详情信息
                    shop_detail = get_shop_info(detail_url)
                    
                    data_dict = {
                        '店铺名称': index.get('title'),
                        '人均消费': index.get('avgprice'),
                        '店铺评分': index.get('avgscore'),
                        '评论人数': index.get('comments'),
                        '所在商圈': index.get('areaname'),
                        '店铺类型': index.get('backCateName'),
                        '店铺地址': shop_detail[0],
                        '联系方式': shop_detail[1],
                        '营业时间': shop_detail[2],
                        '详情页': detail_url,
                    }
                    
                    csv_writer.writerow(data_dict)
                    print(f"已保存:{data_dict['店铺名称']}")
                    
            except Exception as e:
                print(f"第 {page} 页请求失败:{e}")
                continue

if __name__ == '__main__':
    main()

注意事项与优化建议

  1. 反爬机制应对:

    • 定期更换 User-Agent。
    • 设置合理的延时(time.sleep),避免高频访问导致 IP 被封禁。
    • 如果接口需要 Cookie 或 Token,需在 Header 中正确携带。
  2. 异常处理:

    • 增加 try-except 块捕获网络请求错误,防止程序中断。
    • 检查响应状态码是否为 200。
  3. 数据清洗:

    • 部分字段可能为空,需进行空值判断。
    • 去除字符串中的换行符和多余空格。
  4. 法律合规:

    • 遵守目标网站的 robots.txt 协议。
    • 仅采集公开数据,不侵犯个人隐私和商业机密。
    • 数据仅用于学习研究,不得用于非法用途。

总结

本文详细讲解了使用 Python 进行基础网络爬虫开发的完整流程。从环境搭建、模块安装到核心代码实现,涵盖了请求发送、数据解析、文件存储及翻页逻辑。在实际应用中,需根据具体目标网站的接口特征调整代码逻辑,并注意合法合规使用。

目录

  1. 前言
  2. 使用环境
  3. 依赖模块
  4. 基本思路
  5. 数据来源分析
  6. 代码流程步骤
  7. 代码展示
  8. 注意事项与优化建议
  9. 总结

更多推荐文章

查看全部
  • C++ 笔试刷题:排序子序列、消减整数与最长上升子序列
  • VSCode Copilot 配置文件提示未知工具警告解析
  • CentOS 7 安装 JDK 1.8 及修复 wget 缺失问题
  • Google NotebookLM:基于文档的 AI 研究与笔记助手
  • Python JSON Logger 完整指南:如何实现结构化日志记录
  • WebPShop 插件实战指南:Photoshop 原生支持 WebP 格式
  • Python ORM 框架:SQLAlchemy 完全指南
  • C++十大核心应用领域:技术栈与代码示例详解
  • 红黑树深入剖析及 Java 实现
  • 宇树科技机器人核心技术
  • Python 布尔类型详解:真值规则与逻辑运算实战
  • 论文解读:利用人类反馈训练语言模型遵循指令
  • JavaScript 集合 (Set、WeakSet) 与映射 (Map、WeakMap)
  • AI 大模型应用开发初探:基于 Semantic Kernel 构建简易 Agent
  • Python Django Web 框架实战:构建产品管理系统
  • 大模型基础面试知识全解析:架构、训练与微调策略
  • 2026 年:技术人如何用 AI 前瞻性思维应对职业变革
  • LFM2.5-1.2B-Thinking 模型:打造个人 AI 写作助手
  • AI 工作流实战:基于 Dify 构建日报生成器
  • WebAssembly反编译技术:WABT wasm-decompile完全指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online