数据爬取
爬取景点的名称,热度和门票价格,并将数据存储在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=重庆®ion=&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()