在旅游行业和城市规划中,热门景点的数据分析具有重要意义。通过爬取景点数据并生成热力图,可以直观展示游客分布、热门区域及人流趋势,为商业决策、景区管理及智慧城市建设提供数据支持。
然而,单机爬虫在面对大规模数据采集时可能面临效率瓶颈。Scrapy-Redis 作为Scrapy的分布式扩展,能够利用多台机器协同爬取数据,大幅提升采集速度和稳定性。本文将介绍如何基于Scrapy-Redis构建分布式爬虫,爬取热门景点数据,并使用 Folium 和 Heatmap.js 生成交互式热力图。
Scrapy-Redis 是 Scrapy 的分布式扩展,利用 Redis 作为任务队列和去重存储,实现多台爬虫节点的协同工作。其核心优势包括:
整个系统分为三个模块:
安装依赖:
修改 settings.py
:
# 启用 Scrapy-Redis 调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# Redis 连接配置
REDIS_URL = 'redis://localhost:6379/0'
# 数据存储到 MongoDB
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 300,
'scenic_spider.pipelines.MongoPipeline': 400,
}
MONGO_URI = 'mongodb://localhost:27017'
MONGO_DB = 'scenic_data'
以美团景点为例(meituan_spider.py
):
import scrapy
from scenic_spider.items import ScenicItem
from urllib.parse import urlencode
# 代理配置
proxyHost = "www.16yun.cn"
proxyPort = "5445"
proxyUser = "16QMSOML"
proxyPass = "280651"
class MeituanSpider(scrapy.Spider):
name = 'meituan_spider'
redis_key = 'meituan:start_urls' # Redis 初始任务队列
# 自定义请求头(可选)
custom_headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
def start_requests(self):
# 从Redis获取初始URL时添加代理
for url in self.get_start_urls():
yield scrapy.Request(
url=url,
callback=self.parse,
headers=self.custom_headers,
meta={
'proxy': f'http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}'
}
)
def parse(self, response):
for scenic in response.css('.scenic-item'):
item = ScenicItem()
item['name'] = scenic.css('.title::text').get()
item['rating'] = scenic.css('.score::text').get()
item['reviews'] = scenic.css('.review-num::text').get()
item['location'] = scenic.css('.address::text').get()
yield item
# 翻页逻辑(同样添加代理)
next_page = response.css('.next-page::attr(href)').get()
if next_page:
yield scrapy.Request(
url=next_page,
callback=self.parse,
headers=self.custom_headers,
meta={
'proxy': f'http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}'
}
)
import pymongo
class MongoPipeline:
def __init__(self, mongo_uri, mongo_db):
self.mongo_uri = mongo_uri
self.mongo_db = mongo_db
@classmethod
def from_crawler(cls, crawler):
return cls(
mongo_uri=crawler.settings.get('MONGO_URI'),
mongo_db=crawler.settings.get('MONGO_DB')
)
def open_spider(self, spider):
self.client = pymongo.MongoClient(self.mongo_uri)
self.db = self.client[self.mongo_db]
def close_spider(self, spider):
self.client.close()
def process_item(self, item, spider):
self.db['scenic_spots'].insert_one(dict(item))
return item
启动多个爬虫节点(不同机器或进程):
Redis 会自动分配任务,确保数据不重复爬取。
从 MongoDB 提取数据并解析经纬度(使用 Geocoding API):
import pandas as pd
from pymongo import MongoClient
import requests
client = MongoClient('mongodb://localhost:27017')
db = client['scenic_data']
collection = db['scenic_spots']
# 获取数据并转为 DataFrame
data = list(collection.find())
df = pd.DataFrame(data)
# 调用高德地图API获取经纬度
def get_geocode(address):
url = f"https://restapi.amap.com/v3/geocode/geo?key=YOUR_AMAP_KEY&address={address}"
res = requests.get(url).json()
if res['status'] == '1' and res['geocodes']:
lng, lat = res['geocodes'][0]['location'].split(',')
return float(lng), float(lat)
return None, None
df['lng'], df['lat'] = zip(*df['location'].apply(get_geocode))
df.to_csv('scenic_data.csv', index=False)
使用 Folium + Heatmap.js 渲染热力图:
import folium
from folium.plugins import HeatMap
df = pd.read_csv('scenic_data.csv')
df = df.dropna(subset=['lat', 'lng'])
# 创建地图
m = folium.Map(location=[df['lat'].mean(), df['lng'].mean()], zoom_start=12)
# 生成热力图
heat_data = [[row['lat'], row['lng'], row['reviews']] for _, row in df.iterrows()]
HeatMap(heat_data, radius=15).add_to(m)
# 保存为HTML
m.save('heatmap.html')
打开 heatmap.html 即可看到交互式热力图。
5. 优化与扩展 ●动态数据更新:结合 Celery 定时爬取最新数据。 ●3D 热力图:使用 Kepler.gl 进行更高级的可视化。 ●反爬策略:使用代理池(如 Scrapy-ProxyPool)应对封禁。
6. 结论 本文介绍了基于 Scrapy-Redis 的分布式爬虫系统,从数据采集、存储到热力图生成的完整流程。该方案适用于旅游数据分析、城市规划等领域,并可扩展至其他垂直行业(如餐饮、房产)。未来可结合机器学习预测人流趋势,进一步提升商业价值。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有