前言
嗨嘍~大家好呀,這里是魔王吶 !
又是學(xué)習(xí)的一天,讓我們開始叭~
環(huán)境使用:
Python 3.8
Pycharm
模塊使用:
requests >>> pip install requests
re
csv
如果安裝python第三方模塊:
win + R 輸入 cmd 點擊確定, 輸入安裝命令 pip install 模塊名 (pip install requests) 回車
在pycharm中點擊Terminal(終端) 輸入安裝命令
基本流程思路: <通用>
一. 數(shù)據(jù)來源分析
抓包分析我們想要數(shù)據(jù)內(nèi)容, 請求的那個網(wǎng)站 url地址得到
F12 或者 鼠標(biāo)右鍵點擊檢查選擇network, 點擊第二頁
選中xhr 第一個數(shù)據(jù)包就是我們想要的內(nèi)容
用到開發(fā)者工具搜索功能
二. 代碼實現(xiàn)步驟過程: 固定四大步驟
發(fā)送請求, 對于剛剛分析得到url地址發(fā)送請求
獲取數(shù)據(jù), 獲取服務(wù)器返回響應(yīng)數(shù)據(jù) ---> 開發(fā)者工具里面response
解析數(shù)據(jù), 提取我們想要數(shù)據(jù)內(nèi)容 ---> 店鋪基本信息
保存數(shù)據(jù), 保存數(shù)據(jù), 保存表格里面
多頁數(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()
- 發(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ù)制代碼去試試哦 ??
對啦!!記得三連哦~ ?? 另外,歡迎大家閱讀我往期的文章呀~