爬虫類の戦闘:爬虫類とデータ分析、重慶エレクトリックブラザーの記事では、重慶のすべての観光名所を分析することができます

冬休みが来たので、遊びたいです。本物の重慶電網建設の兄弟として、Pythonクローラーとデータ分析を使用して、重慶のどの場所が楽しいかを教えてあげたいと思います。

最初に最後の景勝地の場所の最後の地図

データソース:旅行先

ウェブサイト:旅行先-重慶

リクエストを使用してjsonデータをリクエストします

パート1:クローラー

データ検索:小規模テスト

import requests
keyword = "重庆"
page=1#打印第一页

headers = {
    
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36"}
url = f'http://piao.qunar.com/ticket/list.json?keyword={keyword}&region=&from=mpl_search_suggest&page={page}'
res = requests.request("GET", url, headers=headers)

try:
    res_json = res.json()
    data = res_json['data']
    print(data)
except:
    pass

結果

jsonから返されるデータ形式は辞書タイプであり、興味のあるキーワードを見つける必要があります。
検索結果
sightListに興味があることがわかりました。

したがって、コードを次のように変更できます

import requests
keyword = "重庆"
page=1

headers = {
    
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36"}
url = f'http://piao.qunar.com/ticket/list.json?keyword={keyword}&region=&from=mpl_search_suggest&page={page}'
res = requests.request("GET", url, headers=headers)


res_json = res.json()
sightLists = res_json['data']['sightList']#sightList是感兴趣的
for  sight in sightLists:
    print(sight)

情報を再度抽出し、コードを次のように変更します

import requests
import pandas as pd
keyword = "重庆"
page=1#查看第一页

headers = {
    
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36"}
url = f'http://piao.qunar.com/ticket/list.json?keyword={keyword}&region=&from=mpl_search_suggest&page={page}'
res = requests.request("GET", url, headers=headers)


res_json = res.json()
sightLists = res_json['data']['sightList']#sightList是感兴趣的
for  sight in sightLists:
    name=(sight['sightName'] if 'sightName' in sight.keys() else None)#名称
    districts=(sight['districts'] if 'districts' in sight.keys() else None)#地址
    star=(sight['star'] if 'star' in sight.keys() else None) #星级
    qunarPrice=(sight['qunarPrice'] if 'qunarPrice' in sight.keys() else None)#最低价格
    saleCount=(sight['saleCount'] if 'saleCount' in sight.keys() else None)#购买人数
    score=(sight['score'] if 'score' in sight.keys() else None )#评分
    point=(sight['point'] if 'point' in sight.keys() else None )#坐标位置
    intro=(sight['intro'] if 'intro' in sight.keys() else None)#介绍
    print('名称:{0},地址:{1},星级:{2},价格:{3},saleCount:{4},评分:{5},坐标:{6},介绍:{7}'.format(name,districts,star,qunarPrice,saleCount,score,point,intro))

テーブルにデータを書き込む必要があります。

import requests
import pandas as pd
import numpy as np
keyword = "重庆"
page=1#查看第一页

headers = {
    
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36"}
url = f'http://piao.qunar.com/ticket/list.json?keyword={keyword}&region=&from=mpl_search_suggest&page={page}'
res = requests.request("GET", url, headers=headers)


res_json = res.json()
sightLists = res_json['data']['sightList']#sightList是感兴趣的
for  sight in sightLists:
    name=(sight['sightName'] if 'sightName' in sight.keys() else None)#名称
    districts=(sight['districts'] if 'districts' in sight.keys() else None)#地址
    star=(sight['star'] if 'star' in sight.keys() else None) #星级
    qunarPrice=(sight['qunarPrice'] if 'qunarPrice' in sight.keys() else None)#最低价格
    saleCount=(sight['saleCount'] if 'saleCount' in sight.keys() else None)#购买人数
    score=(sight['score'] if 'score' in sight.keys() else None )#评分
    point=(sight['point'] if 'point' in sight.keys() else None )#坐标位置
    intro=(sight['intro'] if 'intro' in sight.keys() else None)#介绍
    #print('名称:{0},地址:{1},星级:{2},价格:{3},saleCount:{4},评分:{5},坐标:{6},介绍:{7}'.format(name,districts,star,qunarPrice,saleCount,score,point,intro))

    shuju=np.array((name,districts,star,qunarPrice,saleCount,score,point,intro))
    shuju=shuju.reshape(-1,8)
    shuju=pd.DataFrame(shuju,columns=['名称','地址','星级','最低价格','购买人数','评分','坐标位置','介绍'])
    #print(shuju)

    shuju.to_csv('重庆景点数据.csv', mode='a+', index=False,header=False)  # mode='a+'追加写入

複数ページのクロール
例として1ページのデータを取り上げ、おおよそのコードを整理します。次に、複数のページをクロールする必要があります。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Author: yudengwu 余登武
# @Date  : 2021/1/30
import requests
import pandas as pd
import numpy as np
import random
from time import sleep
def get_data(keyword, page):
    headers = {
    
    
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36"}
    url = f'http://piao.qunar.com/ticket/list.json?keyword={keyword}&region=&from=mpl_search_suggest&page={page}'
    res = requests.request("GET", url, headers=headers)
    sleep(random.uniform(1, 2))
    try:
        res_json = res.json()
        sightLists = res_json['data']['sightList']  # sightList是感兴趣的
        for sight in sightLists:
            name = (sight['sightName'] if 'sightName' in sight.keys() else None)  # 名称
            districts = (sight['districts'] if 'districts' in sight.keys() else None)  # 地址
            star = (sight['star'] if 'star' in sight.keys() else None)  # 星级
            qunarPrice = (sight['qunarPrice'] if 'qunarPrice' in sight.keys() else None)  # 最低价格
            saleCount = (sight['saleCount'] if 'saleCount' in sight.keys() else None)  # 购买人数
            score = (sight['score'] if 'score' in sight.keys() else None)  # 评分
            point = (sight['point'] if 'point' in sight.keys() else None)  # 坐标位置
            intro = (sight['intro'] if 'intro' in sight.keys() else None)  # 介绍
            # print('名称:{0},地址:{1},星级:{2},价格:{3},saleCount:{4},评分:{5},坐标:{6},介绍:{7}'.format(name,districts,star,qunarPrice,saleCount,score,point,intro))

            shuju = np.array((name, districts, star, qunarPrice, saleCount, score, point, intro))
            shuju = shuju.reshape(-1, 8)
            shuju = pd.DataFrame(shuju, columns=['名称', '地址', '星级', '最低价格', '购买人数', '评分', '坐标位置', '介绍'])
            # print(shuju)

            shuju.to_csv('重庆景点数据.csv', mode='a+', index=False, header=False)  # mode='a+'追加写入
    except:
        pass


if __name__ == '__main__':
    keyword = "重庆"
    for page in range(1, 75):  # 控制页数
        print(f"正在提取第{page}页")
        sleep(random.uniform(1, 2))
        get_data(keyword, page)

1,000を超えるデータ、重慶には非常に多くの興味深いもの

パート2:データ分析

以前にデータをクロールしたので、分析してみましょう。

1.データを読み取ります

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置加载的字体名
plt.rcParams['axes.unicode_minus'] = False#

df=pd.read_csv('重庆景点数据.csv',header=None,names=list(['名称', '地址', '星级', '最低价格', '购买人数', '评分', '坐标位置', '介绍']))
df = df.drop_duplicates()#删除重复数据。得到470行数据
print(df.head())

重複データを削除すると、重慶には470の景勝地があることがわかります。

2.景勝地の価格分析
トップ20

df_qunarPrice = df.pivot_table(index='名称',values='最低价格')
df_qunarPrice.sort_values('最低价格',inplace=True,ascending=False)#降序
#print(df_qunarPrice[:20])#最高价格top20
df_qunarPrice[:20].plot(kind='barh')
plt.title('价格最高Top20')
plt.show()

最下位のTop20

df_qunarPrice = df.pivot_table(index='名称',values='最低价格')
df_qunarPrice.sort_values('最低价格',inplace=True,ascending=True)
#print(df_qunarPrice[:20])#最高价格top20
df_qunarPrice[:20].plot(kind='barh')
plt.title('最低Top20')
plt.show()

3.景勝地スコアの分析
最高スコアのトップ20

#评分TOP20景点
df_score = df.pivot_table(index='名称',values='评分')
df_score.sort_values('评分',inplace=True,ascending=False)
df_score[:20].plot(kind='barh',color='red')#barh横条形图
plt.title('评分最高Top20')
plt.show()

最低評価のTop20
df_score = df.pivot_table(index='名称',values='评分')
df_score.sort_values('评分',inplace=True,ascending=True )
df_score[:20].plot(kind='barh',color='red')#barh横条形图
plt.title('评分最低Top20')
plt.show()

評価なし(サイトにはまだこの場所の評価が含まれていない可能性があります...)

4.月次売上分析
トップ20

df_saleCount = df.pivot_table(index='名称',values='购买人数')
df_saleCount.sort_values('购买人数',inplace=True,ascending=False)
df_saleCount[:20].plot(kind='barh',color='green')#barh横条形图
plt.title('月销售额最高Top20')
plt.show()

最も低いTop20(この場所のデータが含まれていない可能性があります。この場所は無料である可能性があります)

5.アトラクションレベルの分布

from pyecharts.charts import *
from pyecharts import options as opts
from pyecharts.globals import ThemeType

df_star = df["星级"].value_counts()
df_star = df_star.sort_values(ascending=False)
print(df_star)

3つ星以上の評価のある景勝地の名前を見つけます

print(df[df["星级"]!='无'].sort_values("星级",ascending=False)['名称'])

いくつかの写真を表示します、多すぎます

6.景勝地アドレスの地図描画は
最初にテキストファイルを保存します

df["lon"] = df["坐标位置"].str.split(",",expand=True)[0]#经度
df["lat"] = df["坐标位置"].str.split(",",expand=True)[1]#纬度
df.to_csv("data重庆.csv")

地図を描く

import pandas as pd

stations = pd.read_csv('data重庆.csv',delimiter=',')

from pyecharts.charts import Geo
from pyecharts import options
from pyecharts.globals import GeoType

g = Geo().add_schema(maptype="重庆")

# 给所有点附上标签 'StationID'
for i in stations.index:
    s = stations.iloc[i]
    g.add_coordinate(s['名称'],s['lon'],s['lat'])#地区名称,经度,纬度

# 给每个点的值赋为 1
data_pair = [(stations.iloc[i]['名称'],1) for i in stations.index]

# 画图
g.add('',data_pair, type_=GeoType.EFFECT_SCATTER, symbol_size=2)
g.set_series_opts(label_opts=options.LabelOpts(is_show=False))
g.set_global_opts(title_opts=options.TitleOpts(title="重庆景点分布图by-yudengwu"))

# 保存结果到 html
result = g.render('stations.html')

主要都市ではるかに楽しい

ここに画像の説明を挿入します

著者:電気-YudengWu。書くのは簡単ではありません。良いと思うなら、親指を立ててそのままにしてください。

おすすめ

転載: blog.csdn.net/kobeyu652453/article/details/113417002