国庆节去哪浪?让 Python 帮你分析分析

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/PY0312/article/details/101770838

     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)

项目地址:

https://github.com/NickyangPeng/Travel_analysis_mafengwo

猜你喜欢

转载自blog.csdn.net/PY0312/article/details/101770838