2019 年国庆马上就要到来了。。。
今年想着来点新花样吧
玩肯定是要去玩的
不然怎么给祖国庆生
那去哪里好玩 big 还高呢?
咱就用 Python 分析下
看看哪些地方值得我们去
让我们切入正题。。。
项目目标:
使用 Python 分析出各地哪些旅游景点好玩,更值得我们去
数据来源:
马蜂窝旅行网
相关模块:
Flask、json、pymongo、re、lxml、requests
运行方法:
- 直接在 terminal 中运行项目下的 main.py 即可,或者使用 pycharm 直接打开项目使用 Flask 运行
- 用浏览器访问:http://127.0.0.1:5000/
- 注意:本项目要用到MongoDB数据库,请在运行前安装,各平台MongoDB安装教程请点击:安装教程
项目演示:
各地景点数据抓取代码如下:
import requests
from lxml import etree
import re
from db.mongodb import mongo
class MaFengWoSpider(object):
def __init__(self, city):
self.city = city
self.url_pattern = "http://www.mafengwo.cn/search/s.php?q=" + city + "&p={}&t=poi&kt=1"
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36"
}
def get_url_list(self):
"""获取url列表"""
url_list = []
for i in range(1, 21):
url = self.url_pattern.format(i)
url_list.append(url)
return url_list
def get_page_from_url(self, url):
"""根据url, 发送请求, 获取页面数据"""
response = requests.get(url, headers=self.headers)
# 返回响应的字符串数据
return response.content.decode()
def get_datas_from_page(self, page):
"""解析页面数据"""
# 把页面转换为element对象, 就可以使用XPATH提取数据
element = etree.HTML(page)
# 获取包含景点信息的标签列表, xpath返回的是一个列表
lis = element.xpath('//*[@id="_j_search_result_left"]/div/div/ul/li')
# 遍历标签列表, 提取需要的数据
# 定义列表, 用于存储数据
data_list = []
for li in lis:
# 定义一个字典用于储存数据
item = {}
# 获取景点名称
name = ''.join(li.xpath('./div/div[2]/h3/a//text()'))
# 如果标题中, 没有景点就过滤掉
if name.find("景点") == -1:
continue
# 去掉标题中的景点
item['name'] = name.replace('景点 -', '')
# print(item)
# 提取景点地址
item['address'] = li.xpath('./div/div[2]/ul/li[1]/a//text()')[0]
# print(address)
# 获取点评数量 点评(500)
comments_num = li.xpath('./div/div[2]/ul/li[2]/a/text()')[0]
# 提取点评中的数
item['comments_num'] = int(re.findall(r'点评\((\d+)\)', comments_num)[0])
# print(comments_num)
# 获取游记数量 游记(50)
travel_notes_num = li.xpath('./div/div[2]/ul/li[3]/a/text()')[0]
item['travel_notes_num'] = int(re.findall(r'游记\((\d+)\)', travel_notes_num)[0])
# 记录当前景点的城市
item['city'] = self.city
# print(item)
data_list.append(item)
return data_list
def save_data(self, datas):
"""保存数据"""
for data in datas:
# 把景点名称,指定为数据库的主键
data['_id'] = data['name']
# 保存数据到数据库中
mongo.save(data)
def run(self):
"""程序的入口, 核心业务逻辑"""
# 1. 准备url列表
url_list = self.get_url_list()
# print(url_list)
# 2. 遍历url列表, 发送请求, 获取响应数据
for url in url_list:
page = self.get_page_from_url(url)
# 3. 解析数据
datas = self.get_datas_from_page(page)
# 4. 保存数据
self.save_data(datas)
if __name__ == '__main__':
ms = MaFengWoSpider("广州")
ms.run()
main方法代码如下:
from flask import Flask
from flask import render_template
from flask import Response
import json
from db.mongodb import mongo
from spiders.mafengwo import MaFengWoSpider
# 创建Flask对象
app = Flask(__name__)
@app.route('/')
def view():
return render_template('view.html')
# 渲染数据的方法
@app.route('/echarts/<city>')
def chars(city):
# 获取城市的景点数据量
count = mongo.find_scenic_count(city)
print(count)
# 如果没有查到需要的数据, 就开启一个爬虫, 去采集需要的数据
if not count:
# 创建指定城市的爬虫, 抓取需要的数据
MaFengWoSpider(city).run()
# 查询数据
datas = mongo.find_scenics(city)
# 返回json格式的数据
return Response(json.dumps(datas))
if __name__ == '__main__':
# 启动服务
app.run(debug=True)