这个项目是一个基于Django框架的海南省旅游信息采集与可视化分析系统,核心功能是通过爬虫(代号33jp9bx5)采集海南省各类旅游相关数据,经过处理后进行可视化展示。作为一名有多年爬虫开发经验的工程师,我认为这个项目的技术选型和架构设计非常典型,涵盖了数据采集、存储、处理和展示的全流程。
系统主要包含三大模块:
提示:在实际开发中,海南旅游数据的采集需要特别注意各平台的爬取频率控制,我曾遇到过因频繁访问被文旅厅官网封禁IP的情况,建议初始设置请求间隔不低于2秒。
海南省文旅厅官网(http://w.hainan.gov.cn/)是最权威的数据源,但也是最难爬取的目标。经过实际测试,我发现这些特点:
解决方案代码示例:
python复制def parse_attractions(self, response):
# 提取隐藏在页面中的API请求参数
api_token = response.css('meta[name="api-token"]::attr(content)').get()
headers = {'X-Requested-With': 'XMLHttpRequest'}
api_url = f'http://w.hainan.gov.cn/api/attractions?token={api_token}'
yield scrapy.Request(
api_url,
headers=headers,
callback=self.parse_api_data
)
def parse_api_data(self, response):
data = json.loads(response.text)
for item in data['result']['items']:
yield {
'name': item['scenicName'],
'level': item['aLevel'],
'price': float(item['ticketPrice']),
'location': {
'lng': item['longitude'],
'lat': item['latitude']
}
}
携程、美团等平台的反爬机制更为严格,我的经验是:
建议采用的技术组合:
项目采用Scrapy框架作为爬虫基础,整体架构如下:
code复制HainanTourSpider/
├── spiders/
│ ├── official.py # 官网爬虫
│ ├── ctrip.py # 携程爬虫
│ └── weibo.py # 微博爬虫
├── middlewares.py # 自定义中间件
├── pipelines.py # 数据处理管道
└── items.py # 数据模型定义
核心中间件配置示例:
python复制class CustomProxyMiddleware(object):
def process_request(self, request, spider):
proxy = get_random_proxy() # 从代理池获取
request.meta['proxy'] = f"http://{proxy.ip}:{proxy.port}"
class RandomDelayMiddleware(object):
def process_request(self, request, spider):
delay = random.uniform(1.5, 3.5)
time.sleep(delay)
采集到的原始数据需要经过严格清洗:
清洗代码示例:
python复制def clean_data(df):
# 价格异常值处理
df = df[(df['price'] > 0) & (df['price'] < 1000)]
# 评分标准化
df['score'] = df['score'].apply(
lambda x: x/20 if x > 10 else x # 处理5分制与100分制的差异
)
# 地址解析
df['address'] = df['address'].apply(parse_address)
return df
系统采用混合存储方案:
景点基础信息表:
sql复制CREATE TABLE `scenic_spot` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL COMMENT '景点名称',
`level` varchar(10) DEFAULT NULL COMMENT 'A级等级',
`price` decimal(10,2) DEFAULT NULL COMMENT '门票价格',
`longitude` decimal(10,6) DEFAULT NULL COMMENT '经度',
`latitude` decimal(10,6) DEFAULT NULL COMMENT '纬度',
`address` varchar(255) DEFAULT NULL COMMENT '详细地址',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_location` (`longitude`,`latitude`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
用户评论存储结构:
json复制{
"spot_id": "12345",
"platform": "ctrip",
"content": "景色很美,但门票有点贵",
"rating": 4.5,
"tags": ["风景优美", "门票贵"],
"publish_date": ISODate("2023-05-20T00:00:00Z"),
"user_info": {
"name": "traveler123",
"level": "钻石会员"
}
}
根据我的实战经验,有效的IP代理方案应包含:
代理池管理代码片段:
python复制class ProxyPool:
def __init__(self):
self.proxies = []
self.blacklist = set()
def refresh(self):
"""从API获取最新代理列表"""
resp = requests.get('https://proxy-provider.com/api/get')
self.proxies = [Proxy(**item) for item in resp.json()]
def get_random(self):
"""获取随机可用代理"""
while True:
proxy = random.choice(self.proxies)
if proxy.ip not in self.blacklist:
if self._test_proxy(proxy):
return proxy
else:
self.blacklist.add(proxy.ip)
对于不同类型的验证码,我的应对策略:
滑块验证码破解示例:
python复制def handle_slide_captcha(driver):
slider = driver.find_element(By.CLASS_NAME, 'slider')
track = generate_slide_track() # 生成模拟人类滑动轨迹
action = ActionChains(driver)
action.click_and_hold(slider)
for step in track:
action.move_by_offset(step, 0)
action.release().perform()
基于高德地图API的热力图实现关键代码:
javascript复制// 初始化地图
const map = new AMap.Map('map-container', {
zoom: 10,
center: [110.19989, 20.04422] // 海南中心坐标
});
// 加载热力图插件
AMap.plugin('AMap.Heatmap', () => {
const heatmap = new AMap.Heatmap(map, {
radius: 25,
opacity: [0, 0.8]
});
// 从API获取数据
axios.get('/api/heatmap-data').then(resp => {
heatmap.setDataSet({
data: resp.data,
max: 100
});
});
});
基于用户行为的推荐算法实现思路:
Python实现示例:
python复制from surprise import Dataset, KNNBasic
def train_recommend_model():
# 加载用户-景点评分数据
data = Dataset.load_from_df(ratings_df, reader)
trainset = data.build_full_trainset()
# 使用KNN算法
sim_options = {
'name': 'cosine',
'user_based': False # 基于物品的协同过滤
}
algo = KNNBasic(sim_options=sim_options)
algo.fit(trainset)
return algo
根据我的部署经验,推荐配置:
基础配置(小型项目):
高性能配置(百万级数据):
Scrapy配置优化示例:
python复制# settings.py
CONCURRENT_REQUESTS = 30
DOWNLOAD_DELAY = 0.5
RETRY_TIMES = 3
# 启用内存缓存
HTTPCACHE_ENABLED = True
HTTPCACHE_EXPIRATION_SECS = 3600
问题1:网站结构变更导致爬取失败
解决方案:
问题2:数据加载不全
解决方案:
问题1:中文地址解析不准确
解决方案:
问题2:评论情感分析效果差
解决方案:
在实际应用中,这个系统还可以进一步扩展:
我曾在一个类似项目中尝试过实时客流预测,通过LSTM模型可以达到85%以上的准确率。关键是要收集足够的历史数据,并考虑节假日等特殊因素。