python帶你采集桌游、劇本殺游戲店數(shù)據(jù)信息~

前言

嗨嘍~大家好呀,這里是魔王吶 !

又是學(xué)習(xí)的一天,讓我們開始叭~

環(huán)境使用:

  • Python 3.8

  • Pycharm

模塊使用:

  • requests >>> pip install requests

  • re

  • csv

如果安裝python第三方模塊:

  1. win + R 輸入 cmd 點擊確定, 輸入安裝命令 pip install 模塊名 (pip install requests) 回車

  2. 在pycharm中點擊Terminal(終端) 輸入安裝命令

基本流程思路: <通用>

一. 數(shù)據(jù)來源分析

  • 抓包分析我們想要數(shù)據(jù)內(nèi)容, 請求的那個網(wǎng)站 url地址得到

  • F12 或者 鼠標(biāo)右鍵點擊檢查選擇network, 點擊第二頁

  • 選中xhr 第一個數(shù)據(jù)包就是我們想要的內(nèi)容
    用到開發(fā)者工具搜索功能

二. 代碼實現(xiàn)步驟過程: 固定四大步驟

  1. 發(fā)送請求, 對于剛剛分析得到url地址發(fā)送請求

  2. 獲取數(shù)據(jù), 獲取服務(wù)器返回響應(yīng)數(shù)據(jù) ---> 開發(fā)者工具里面response

  3. 解析數(shù)據(jù), 提取我們想要數(shù)據(jù)內(nèi)容 ---> 店鋪基本信息

  4. 保存數(shù)據(jù), 保存數(shù)據(jù), 保存表格里面

  5. 多頁數(shù)據(jù)采集

多頁數(shù)據(jù)采集 ---> 循環(huán) for <目的>

分析請求url地址參數(shù)變化

采集代碼

# 導(dǎo)入數(shù)據(jù)請求模塊 ---> 第三方模塊 需要 pip install requests
import requests
# 導(dǎo)入格式化輸出模塊 --> 內(nèi)置模塊 不需要安裝
from pprint import pprint
# 導(dǎo)入csv模塊 --> 內(nèi)置模塊 不需要安裝
import csv
# 導(dǎo)入時間模塊 --> 內(nèi)置模塊 不需要安裝
import time
# 導(dǎo)入正則模塊 --> 內(nèi)置模塊 不需要安裝
import re

[圖片上傳失敗...(image-a76eee-1662029119125)]

# 3. 發(fā)送請求
html_data = requests.get(url=link, headers=headers).text
# 4. 獲取數(shù)據(jù)print(html_data)
"""
5. 解析數(shù)據(jù), re正則 會用 1 不會 2
re.findall() 找到所有我們想要數(shù)據(jù)
告訴程序: 從什么地方 去找什么數(shù)據(jù)
從 html_data  去找 "address":"(.*?)","phone":"(.*?)","openTime":"(.*?)", 這段內(nèi)容
其中 (.*?) 就是我們要的數(shù)據(jù)
"""
shop_info = re.findall('"address":"(.*?)","phone":"(.*?)","openTime":"(.*?)",', html_data)[0]
print(shop_info)
# shop_info 元組 ---> [0] 根據(jù)索引位置取值 / 計數(shù)從0開始計數(shù)
address = shop_info[0]
# [1] 什么意思?
phone = shop_info[1]
# replace 是什么 字符串替換方法 把 \\n 替換 空的  \<轉(zhuǎn)義字符串> \n 還換行符
openTime = shop_info[2].replace('\\n', '')
print(address, phone, openTime)

# 創(chuàng)建文件 相對路徑 你代碼在哪里 文件就寫在哪里
f = open('男人的小秘密多頁.csv', mode='a', encoding='utf-8', newline='')
# 字典寫入 f ---> 文件對象 fieldnames 字段名 表頭表格第一行內(nèi)容
csv_writer = csv.DictWriter(f, fieldnames=[
    '店鋪',
    '店鋪類型',
    '商圈',
    '人均消費',
    '最低消費',
    '評分',
    '評論',
    '緯度',
    '經(jīng)度',
    '詳情頁',
])
# 寫入表頭
csv_writer.writeheader()
  1. 發(fā)送請求, 模擬瀏覽器發(fā)送請求
    代碼都是可以復(fù)制粘貼
  • 長鏈接可以分段寫入

  • 批量替換 ---> 批量添加引號和逗號
    1.選中替換內(nèi)容
    2.按 ctrl + R
    3.勾選上.* 輸入正則命令

(.*?): (.*)
'$1': '$2',
  • 如果當(dāng)你請求網(wǎng)站, 被反爬的時候

一種最簡單反反爬手段, 用headers請求頭偽裝成瀏覽器去發(fā)送請求

[圖片上傳失敗...(image-79376a-1662029119125)]

    # 發(fā)送請求
    response = requests.get(url=url, params=data, headers=headers)
    # <Response [403]>: 整體表示響應(yīng)對象 403狀態(tài)碼 表示 沒有訪問權(quán)限
    # <Response [200]> 200 狀態(tài)碼表示請求成功 print(response)
    # 2. 獲取數(shù)據(jù), 獲取服務(wù)器返回響應(yīng)數(shù)據(jù) ---> 開發(fā)者工具里面response --> response.json() 獲取響應(yīng)對象json字典數(shù)據(jù) print(response.json())
    # 3. 解析數(shù)據(jù), 提取我們想要的數(shù)據(jù)內(nèi)容 ---> 字典取值: 鍵值對取值 <根據(jù)冒號左邊的內(nèi)容[鍵], 提取冒號右邊的內(nèi)容[值]>
    for index in response.json()['data']['searchResult']:  # for循環(huán)遍歷, 把列表里面元素一個一個提取出來

[圖片上傳失敗...(image-eb4f50-1662029119125)]

        # 寫入數(shù)據(jù)
        csv_writer.writerow(dit)
        print(dit)

可視化代碼

import pandas as pd
import numpy as np
from pyecharts.charts import *
from pyecharts import options as opts
from pyecharts.globals import ThemeType  #引入主題
df = pd.read_csv('武漢桌游多頁.csv',encoding='utf-8',engine="python")
df.sample(5)
df.info()



df = df.fillna('暫無數(shù)據(jù)')



cut = lambda x : '一般' if x <= 3.5 else ('不錯' if x <= 4.0 else('好' if x <= 4.5 else '很好'))
df['評分類型'] = df['評分'].map(cut)



df.describe()



import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
plt.rcParams['font.sans-serif'] = ['SimHei']  # 設(shè)置加載的字體名
plt.rcParams['axes.unicode_minus'] = False   # 解決保存圖像是負(fù)號'-'顯示為方塊的問題
fig,axes=plt.subplots(2,1,figsize=(12,12))
sns.regplot(x='人均消費',y='評分',data=df,color='r',marker='+',ax=axes[0])
sns.regplot(x='評論',y='評分',data=df,color='g',marker='*',ax=axes[1])



df2 = df.groupby('商圈')['店名'].count()
df2 = df2.sort_values(ascending=True)[-10:]
df2 = df2.round(2)
c = (
    Bar(init_opts=opts.InitOpts(theme=ThemeType.WONDERLAND))
    .add_xaxis(df2.index.tolist())
    .add_yaxis("",df2.tolist()).reversal_axis() #X軸與y軸調(diào)換順序
    .set_global_opts(title_opts=opts.TitleOpts(title="武漢桌游商圈數(shù)量top10",subtitle="數(shù)據(jù)來源:美團",pos_left = 'center'),
                       xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=16)), #更改橫坐標(biāo)字體大小
                       yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=16)), #更改縱坐標(biāo)字體大小
                       )
    .set_series_opts(label_opts=opts.LabelOpts(font_size=16,position='right'))
    )
c.render_notebook()



df4 = df.groupby('評分')['店名'].count()
df4 = df4.sort_values(ascending=False)
regions = df4.index.tolist()
values = df4.tolist()
c = (
        Pie(init_opts=opts.InitOpts(theme=ThemeType.WONDERLAND))
        .add("", [z for z in zip(regions,values)])
        .set_global_opts(title_opts=opts.TitleOpts(title="不同評分類型店鋪數(shù)量",subtitle="數(shù)據(jù)來源:美團",pos_top="-1%",pos_left = 'center'))
        .set_series_opts(label_opts=opts.LabelOpts(formatter=":u0z1t8os%",font_size=18))
    )
c.render_notebook()



df6 = df.groupby('店鋪類型')['店名'].count()
df6 = df6.sort_values(ascending=False)[:10]
df6 = df6.round(2)
regions = df6.index.tolist()
values = df6.tolist()
c = (
        Pie(init_opts=opts.InitOpts(theme=ThemeType.WONDERLAND))
        .add("", [i for i in zip(regions,values)],radius=["40%", "75%"])
        .set_global_opts(title_opts=opts.TitleOpts(title="不同店鋪類型店鋪數(shù)量",pos_top="-1%",pos_left = 'center'))
        .set_series_opts(label_opts=opts.LabelOpts(formatter=": {c}",font_size=18))
    )
c.render_notebook()



df6 = df.groupby('店鋪類型')['評分'].mean()
df6 = df6.sort_values(ascending=True)
df6 = df6.round(2)
df6 = df6.tail(10)
c = (
    Bar(init_opts=opts.InitOpts(theme=ThemeType.WONDERLAND))
    .add_xaxis(df6.index.tolist())
    .add_yaxis("",df6.tolist()).reversal_axis() #X軸與y軸調(diào)換順序
    .set_global_opts(title_opts=opts.TitleOpts(title="不同店鋪類型評分",subtitle="數(shù)據(jù)來源:美團",pos_left = 'center'),
                       xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=16)), #更改橫坐標(biāo)字體大小
                       yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=16)), #更改縱坐標(biāo)字體大小
                       )
    .set_series_opts(label_opts=opts.LabelOpts(font_size=16,position='right'))
    )
c.render_notebook()


df7 = df.groupby('店鋪類型')['評論'].sum()
df7 = df7.sort_values(ascending=True)
df7 = df7.tail(10)
c = (
    Bar(init_opts=opts.InitOpts(theme=ThemeType.WONDERLAND))
    .add_xaxis(df7.index.tolist())
    .add_yaxis("",df7.tolist()).reversal_axis() #X軸與y軸調(diào)換順序
    .set_global_opts(title_opts=opts.TitleOpts(title="不同店鋪類型評論人數(shù)",subtitle="數(shù)據(jù)來源:美團",pos_left = 'center'),
                       xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=16)), #更改橫坐標(biāo)字體大小
                       yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=16)), #更改縱坐標(biāo)字體大小
                       )
    .set_series_opts(label_opts=opts.LabelOpts(font_size=16,position='right'))
    )
c.render_notebook()

尾語

要成功,先發(fā)瘋,下定決心往前沖!

學(xué)習(xí)是需要長期堅持的,一步一個腳印地走向未來!

未來的你一定會感謝今天學(xué)習(xí)的你。

—— 心靈雞湯

本文章到這里就結(jié)束啦~感興趣的小伙伴可以復(fù)制代碼去試試哦 ??

對啦!!記得三連哦~ ?? 另外,歡迎大家閱讀我往期的文章呀~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容