python帶你採集桌游、劇本殺游戲店數據信息~

来源:https://www.cnblogs.com/Qqun261823976/archive/2022/09/01/16647527.html
-Advertisement-
Play Games

前言 嗨嘍~大家好呀,這裡是魔王吶 ! 又是學習的一天,讓我們開始叭~ 環境使用: Python 3.8 Pycharm 模塊使用: requests >>> pip install requests re csv 如果安裝python第三方模塊: win + R 輸入 cmd 點擊確定, 輸入安裝 ...


前言

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

又是學習的一天,讓我們開始叭~

環境使用:

  • Python 3.8

  • Pycharm

模塊使用:

  • requests >>> pip install requests

  • re

  • csv

如果安裝python第三方模塊:

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

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

基本流程思路: <通用>

一. 數據來源分析

  • 抓包分析我們想要數據內容, 請求的那個網站 url地址得到

  • F12 或者 滑鼠右鍵點擊檢查選擇network, 點擊第二頁

  • 選中xhr 第一個數據包就是我們想要的內容
    用到開發者工具搜索功能

二. 代碼實現步驟過程: 固定四大步驟

  1. 發送請求, 對於剛剛分析得到url地址發送請求

  2. 獲取數據, 獲取伺服器返迴響應數據 ---> 開發者工具裡面response

  3. 解析數據, 提取我們想要數據內容 ---> 店鋪基本信息

  4. 保存數據, 保存數據, 保存表格裡面

  5. 多頁數據採集

多頁數據採集 ---> 迴圈 for <目的>

分析請求url地址參數變化

採集代碼

# 導入數據請求模塊 ---> 第三方模塊 需要 pip install requests
import requests
# 導入格式化輸出模塊 --> 內置模塊 不需要安裝
from pprint import pprint
# 導入csv模塊 --> 內置模塊 不需要安裝
import csv
# 導入時間模塊 --> 內置模塊 不需要安裝
import time
# 導入正則模塊 --> 內置模塊 不需要安裝
import re
# 3. 發送請求
html_data = requests.get(url=link, headers=headers).text
# 4. 獲取數據print(html_data)
"""
5. 解析數據, re正則 會用 1 不會 2
re.findall() 找到所有我們想要數據
告訴程式: 從什麼地方 去找什麼數據
從 html_data  去找 "address":"(.*?)","phone":"(.*?)","openTime":"(.*?)", 這段內容
其中 (.*?) 就是我們要的數據
"""
shop_info = re.findall('"address":"(.*?)","phone":"(.*?)","openTime":"(.*?)",', html_data)[0]
print(shop_info)
# shop_info 元組 ---> [0] 根據索引位置取值 / 計數從0開始計數
address = shop_info[0]
# [1] 什麼意思?
phone = shop_info[1]
# replace 是什麼 字元串替換方法 把 \\n 替換 空的  \<轉義字元串> \n 還換行符
openTime = shop_info[2].replace('\\n', '')
print(address, phone, openTime)

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

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

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

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

    # 發送請求
    response = requests.get(url=url, params=data, headers=headers)
    # <Response [403]>: 整體表示響應對象 403狀態碼 表示 沒有訪問許可權
    # <Response [200]> 200 狀態碼表示請求成功 print(response)
    # 2. 獲取數據, 獲取伺服器返迴響應數據 ---> 開發者工具裡面response --> response.json() 獲取響應對象json字典數據 print(response.json())
    # 3. 解析數據, 提取我們想要的數據內容 ---> 字典取值: 鍵值對取值 <根據冒號左邊的內容[鍵], 提取冒號右邊的內容[值]>
    for index in response.json()['data']['searchResult']:  # for迴圈遍歷, 把列表裡面元素一個一個提取出來
        # 寫入數據
        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('暫無數據')



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']  # 設置載入的字體名
plt.rcParams['axes.unicode_minus'] = False   # 解決保存圖像是負號'-'顯示為方塊的問題
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軸調換順序
    .set_global_opts(title_opts=opts.TitleOpts(title="武漢桌游商圈數量top10",subtitle="數據來源:美團",pos_left = 'center'),
                       xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=16)), #更改橫坐標字體大小
                       yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=16)), #更改縱坐標字體大小
                       )
    .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="不同評分類型店鋪數量",subtitle="數據來源:美團",pos_top="-1%",pos_left = 'center'))
        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{d}%",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="不同店鋪類型店鋪數量",pos_top="-1%",pos_left = 'center'))
        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {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軸調換順序
    .set_global_opts(title_opts=opts.TitleOpts(title="不同店鋪類型評分",subtitle="數據來源:美團",pos_left = 'center'),
                       xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=16)), #更改橫坐標字體大小
                       yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=16)), #更改縱坐標字體大小
                       )
    .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軸調換順序
    .set_global_opts(title_opts=opts.TitleOpts(title="不同店鋪類型評論人數",subtitle="數據來源:美團",pos_left = 'center'),
                       xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=16)), #更改橫坐標字體大小
                       yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=16)), #更改縱坐標字體大小
                       )
    .set_series_opts(label_opts=opts.LabelOpts(font_size=16,position='right'))
    )
c.render_notebook()

尾語

要成功,先發瘋,下定決心往前沖!

學習是需要長期堅持的,一步一個腳印地走向未來!

未來的你一定會感謝今天學習的你。

—— 心靈雞湯

本文章到這裡就結束啦~感興趣的小伙伴可以複製代碼去試試哦

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Serverless 架構將成為未來雲計算領域重要的技術架構,將會被更多的業務所採納。進一步深究,Serverless 架構在什麼場景下有優秀的表現,在什麼場景下可能表現得並不是很理想呢?或者說,有哪些場景更適合 Serverless 架構呢? ...
  • 顧名思義,如何建房子一樣,建造者模式可以將複雜對象的建造過程抽象出來,使用相同的構建過程可以構造出不同表現的對象。 ...
  • 山河遠闊,煙火人間,又一年,千里嬋娟~ 今天給大家帶來的是給玉兔投喂月餅的小游戲。八月十五中秋夜晚,讓我們對著月亮許願:希望我們在意和在意我們的人,諸邪避退、百事無忌、平安喜樂、萬事勝意。提前祝大家中秋節快樂。 中秋節的起源 中秋節起源於上古時代,普及於漢代,定型於唐朝初年,盛行於宋朝以後。中秋節是 ...
  • 目錄 一.OpenGL 圖像飽和度調節 1.原始圖片 2.效果演示 二.OpenGL 圖像飽和度調節源碼下載 三.猜你喜歡 零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學 ...
  • JavaGUI-坦克大戰 1.Java繪圖坐標體系 坐標體系介紹:下圖說明瞭一個Java坐標體系。坐標原點位於左上角,以像素為單位。在Java坐標體系中,第一個是x坐標,表示當前位置為水平方向,距離坐標原點x個像素;第二個是y坐標,表示當前位置為垂直方向,距離坐標原點y個像素。 坐標體系-像素: 繪 ...
  • Spring-04 聲明式事務 1、事務的定義 事務就是由一組邏輯上緊密關聯的多個工作單元(資料庫操作)而合併成一個整體,這些操作要麼都執行,要麼都不執行。 2、事務的特性:ACID 1)原子性A :原子即不可再分,表現:一個事務涉及的多個操作在業務邏輯上缺一不可,保證同一個事務中的操作要不都提交, ...
  • Vector底層實現 vector的三個私有成員 :_start 記錄初始位置 , _finish 記錄有效字元 , _endofstoage 記錄容量大小 vector會存儲的類型不同,所以要用模版來定類型 typedef T* iterator; iterator _start; iterato ...
  • Java註解 1.註解的理解 註解(Annotation)也被稱為元數據(Metadata),用於修飾解釋 包、類、方法、屬性、構造器、局部變數等數據信息 和註釋一樣,註解不影響程式邏輯,但註解可以被編譯或者運行,相當於嵌入在代碼中的補充信息 在JavaSE中,註解的使用目的比較簡單,例如標記過時的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...