使用python爬虫分析去哪网的景点数据

数据爬取

爬取景点的名称,热度和门票价格,并将数据存储在scenery.csv文件中

import requests
from bs4 import BeautifulSoup
# 正则表达式
import re
import csv

# 用来存储数据的csv
f = open('scenery.csv', 'w', encoding='utf-8', newline='' "")
# 基于文件对象构建 csv写入对象
csv_writer = csv.writer(f)
# 构建列表头
csv_writer.writerow(["name", "heat", "price"])

base_url = "https://piao.qunar.com/ticket/list.htm?keyword=重庆&region=&from=mpl_search_suggest"

# GET类型请求(不允许重定向,以此来判断是否到最后一页)
get_result = requests.get(base_url, allow_redirects=False)
# 获取html页面内容
html = get_result.text
# 使用正则表达式获取分页的总页数
page_size = int(re.search("<a[^<>]*>([^<>]*)</a><a[^<>]*>下一页</a>", html).group(1))

# 爬取所有的页
for i in range(1, page_size):
    print("总页数:" + str(page_size) + "   当前爬取页:" + str(i))
    url = base_url + "&page=" + str(i)
    result = requests.get(url, allow_redirects=False)
    # 指定html解析器,以适应在不同环境下运行
    soup1 = BeautifulSoup(result.text, "html.parser")
    scenery_list = soup1.find_all(name="div", attrs={"class": "sight_item_detail clrfix"})
    for scenery in scenery_list:
        text = str(scenery)
        soup1 = BeautifulSoup(text, "html.parser")
        scenery_name = soup1.find(name="h3", attrs={"class": "sight_item_caption"}).text
        em_list = soup1.find_all(name="em")
        # 获取景区热度
        scenery_heat = em_list[0].text
        scenery_heat = re.sub("热度 ", "", scenery_heat)
        # 景区价格(有些景区可能没有门票价格)
        scenery_price = ""
        if len(em_list) == 2:
            scenery_price = em_list[1].text
        csv_writer.writerow([scenery_name, scenery_heat, scenery_price])
# 关闭文件
f.close()

可视化分析

从scenery.csv文件中获取数据,生成可视化柱状图

import pandas as pd  # pandas是一个强大的分析结构化数据的工具集
import matplotlib.pyplot as plt  # matplotlib数据可视化神器

# 读入数据
Titanic = pd.read_csv('scenery.csv')
# 过滤小于500的数
Titanic = Titanic[Titanic['price'] < 500]
# 显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 绘制直方图
plt.hist(x=Titanic.price,  # 指定绘图数据
         bins=100,  # 指定直方图中条块的个数
         color='steelblue',  # 指定直方图的填充色
         edgecolor='black'  # 指定直方图的边框色
         )
plt.title('景点票价分布')
# 显示图例
plt.xlabel('票价')
plt.ylabel('数量')
# 显示图形
plt.show()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值