去哪儿旅行,景点热度排行爬取案例

本案例对旅游景点的热度,点评数量,排行等进行了爬取,后期数据处理部分还有提高空间,请读者自行编写。

# -*- coding: utf-8 -*-
"""
Created on Wed Apr  3 17:48:21 2019

@author: iHJX_Alienware
"""

import requests
from bs4 import BeautifulSoup

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

print('导入模块')

import matplotlib.pyplot as plt
import seaborn as sns

plt.rcParams['font.sans-serif'] = ['SimHei']  
# Matplotlib中设置字体-黑体,解决Matplotlib中文乱码问题
plt.rcParams['axes.unicode_minus'] = False    
# 解决Matplotlib坐标轴负号'-'显示为方块的问题

#获取连接网页数据
def get_urls(n):
    return ['https://travel.qunar.com/p-cs300153-rizhao-jingdian-1-' + str(i+1) for i in range(n)]
    # 创建函数,获取分页网址
#获取具体需要的参数
def get_informations(u):
    ri = requests.get(u)
        # requests访问网站
    soupi = BeautifulSoup(ri.text,'lxml')
        # bs解析页面
    infori = soupi.find('ul',class_="list_item clrfix").find_all('li')
        # 获取列表内容
    
    datai = []
    n=0
    for i in infori:
        n+=1
        #print(i.text)
        dic = {}
        dic['lat'] = i['data-lat']
        dic['lng'] = i['data-lng']
        dic['景点名称'] = i.find('span',class_="cn_tit").text
        dic['攻略提到数量'] = i.find('div',class_="strategy_sum").text
        dic['点评数量'] = i.find('div',class_="comment_sum").text
        dic['景点排名'] = i.find('span',class_="ranking_sum").text
        dic['星级'] = i.find('span',class_="total_star").find('span')['style'].split(':')[1]
        datai.append(dic) #列表包字典
        # 分别获取字段内容
        #print('已采集%s条数据' %(n*10))
    return datai
    
    # 构建页面爬虫
#标准化某一指标便于对比
def normalization(dfi, col):
    dfi[col + "_nor"] = (dfi[col] - dfi[col].min())/(dfi[col].max() - dfi[col].min())


if __name__ == '__main__':
    #获取多页网页数据
    url_lst = get_urls(20)

    #将数据转化为dataframe格式便于处理
    df = pd.DataFrame()
    for u in url_lst:
        dfi = pd.DataFrame(get_informations(u))
        df = pd.concat([df,dfi])
        df.reset_index(inplace = True,drop = True)
        # 采集数据


    #对dataframe中的数据格式进行调整
    df['lng'] = df['lng'].astype(np.float)
    df['lat'] = df['lat'].astype(np.float)
    df['点评数量'] = df['点评数量'].astype(np.int)
    df['攻略提到数量'] = df['攻略提到数量'].astype(np.int)
        # 字段类型处理
    df['星级'] = df['星级'].str.replace('%','').astype(np.float)
        # 星级字段处理
    df['景点排名'] = df['景点排名'].str.split('第').str[1]
    df['景点排名'].fillna(value = 0,inplace = True)

    normalization(df, '点评数量')
    #输出为excel形式
    df.to_excel("./result.xlsx")

   
    

效果图,有什么地方看不懂,可以留言给我

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/hot7732788/article/details/89225855
今日推荐