前言
本文将介绍如何使用 Python 编写一个简单的网络爬虫程序,用于采集附近店铺的详细信息。主要涉及使用 requests 库发送 HTTP 请求,利用正则表达式解析返回的数据,提取店铺名称、评分、地址及联系方式等字段,并通过 csv 模块将数据存储到本地文件中。
使用环境
- Python 3.8+ 解释器
- PyCharm 或 VS Code 编辑器
依赖模块
本示例主要使用以下标准库和第三方库:
- requests:用于发送 HTTP 请求。
- csv:用于将数据写入 CSV 文件。
- re:用于正则表达式匹配。
- time:用于控制请求频率。
安装命令:
pip install requests
基本思路
数据来源分析
在开始采集之前,需要明确目标网站的数据结构。通常通过开发者工具(F12)的 Network 面板分析接口请求。
- 确定目标 URL:找到获取店铺列表的 API 接口。
- 分析参数:查看请求所需的参数(如页码、关键词、Token 等)。
- 确认响应格式:通常为 JSON 格式,包含店铺的基本信息和详情页链接。
代码流程步骤
- 构建请求:设置 Headers(User-Agent, Referer 等)以模拟浏览器行为。
- 发送请求:使用
requests.get或requests.post获取响应。 - 解析数据:从响应中提取关键字段(名称、价格、评分等)。
- 详情补充:根据详情页链接进一步获取电话、营业时间等信息。
- 保存数据:将整理好的字典列表写入 CSV 文件。
- 翻页处理:循环修改偏移量(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()
注意事项与优化建议
-
反爬机制应对:
- 定期更换 User-Agent。
- 设置合理的延时(
time.sleep),避免高频访问导致 IP 被封禁。 - 如果接口需要 Cookie 或 Token,需在 Header 中正确携带。
-
异常处理:
- 增加
try-except块捕获网络请求错误,防止程序中断。 - 检查响应状态码是否为 200。
- 增加
-
数据清洗:
- 部分字段可能为空,需进行空值判断。
- 去除字符串中的换行符和多余空格。
-
法律合规:
- 遵守目标网站的 robots.txt 协议。
- 仅采集公开数据,不侵犯个人隐私和商业机密。
- 数据仅用于学习研究,不得用于非法用途。
总结
本文详细讲解了使用 Python 进行基础网络爬虫开发的完整流程。从环境搭建、模块安装到核心代码实现,涵盖了请求发送、数据解析、文件存储及翻页逻辑。在实际应用中,需根据具体目标网站的接口特征调整代码逻辑,并注意合法合规使用。

