所需知識點(diǎn)
1、動態(tài)數(shù)據(jù)抓包演示
2、json數(shù)據(jù)解析
3、requests模塊的使用
4、保存csv
安裝命令:requests >>> pip install requests
模塊安裝問題:
如果安裝python第三方模塊:
- win + R 輸入 cmd 點(diǎn)擊確定, 輸入安裝命令 pip install 模塊名 (pip install requests) 回車
-
在pycharm中點(diǎn)擊Terminal(終端) 輸入安裝命令
如何配置pycharm里面的python解釋器?
- 選擇file(文件) >>> setting(設(shè)置) >>> Project(項(xiàng)目) >>> python interpreter(python解釋器)
- 點(diǎn)擊齒輪, 選擇add
- 添加python安裝路徑
pycharm如何安裝插件?
- 選擇file(文件) >>> setting(設(shè)置) >>> Plugins(插件)
- 點(diǎn)擊 Marketplace 輸入想要安裝的插件名字 比如:翻譯插件 輸入 translation / 漢化插件 輸入 Chinese
- 選擇相應(yīng)的插件點(diǎn)擊 install(安裝) 即可
- 安裝成功之后 是會彈出 重啟pycharm的選項(xiàng) 點(diǎn)擊確定, 重啟即可生效
案例實(shí)現(xiàn)思路流程: 可見即可爬...
一. 數(shù)據(jù)來源分析
通過開發(fā)者工具進(jìn)行抓包分析, 分析自己想要數(shù)據(jù)內(nèi)容 可以從哪里獲取
分析數(shù)據(jù) 從第二頁開始
- 打開開發(fā)者工具
- 點(diǎn)擊第二頁內(nèi)容
- 點(diǎn)擊搜索按鈕, 進(jìn)行搜索內(nèi)容
- 查看服務(wù)器返回響應(yīng)數(shù)據(jù)內(nèi)容
二. 代碼實(shí)現(xiàn)步驟: 發(fā)送請求 >>> 獲取數(shù)據(jù) >>> 解析數(shù)據(jù) >>> 保存數(shù)據(jù)
用代碼去模擬瀏覽器發(fā)送請求獲取數(shù)據(jù)
- 發(fā)送請求, 對于剛剛分析得到url地址發(fā)送請求
- 獲取數(shù)據(jù), 獲取服務(wù)器返回?cái)?shù)據(jù)
- 解析數(shù)據(jù), 提取我們想要數(shù)據(jù)內(nèi)容 店鋪基本信息
- 保存數(shù)據(jù), 把數(shù)據(jù)表格里面

代碼
1.導(dǎo)入模塊
import requests # 數(shù)據(jù)請求模塊
import pprint # 格式化輸出模塊
import csv # 內(nèi)置模塊
import time
import re
def get_shop_info(html_url):
# url = 'https://www.meituan.com/xiuxianyule/193306807/'
headers = {
'Cookie': '_lxsdk_cuid=17e102d3914c8-000093bbbb0ed8-4303066-1fa400-17e102d3914c8; __mta=48537241.1640948906361.1640948906361.1640948906361.1; _hc.v=e83bebb5-d6ee-d90e-dd4b-4f2124f8f982.1640951715; ci=70; rvct=70; mt_c_token=2Tmbj8_Qihel3QR9oEXS4nEpnncAAAAABBEAAB9N2m2JXSE0N6xtRrgG6ikfQZQ3NBdwyQdV9vglW8XGMaIt38Lnu1_89Kzd0vMKEQ; iuuid=3C2110909379198F1809F560B5E33A58B83485173D8286ECD2C7F8AFFCC724B4; isid=2Tmbj8_Qihel3QR9oEXS4nEpnncAAAAABBEAAB9N2m2JXSE0N6xtRrgG6ikfQZQ3NBdwyQdV9vglW8XGMaIt38Lnu1_89Kzd0vMKEQ; logintype=normal; cityname=%E9%95%BF%E6%B2%99; _lxsdk=3C2110909379198F1809F560B5E33A58B83485173D8286ECD2C7F8AFFCC724B4; _lx_utm=utm_source%3DBaidu%26utm_medium%3Dorganic; latlng=28.302546%2C112.868692; ci3=70; uuid=f7c4d3664ab34f13ad7f.1650110501.1.0.0; mtcdn=K; lt=9WbeLmhHHLhTVpnVu264fUCMYeIAAAAAQREAAKnrFL00wW5eC7mPjhHwIZwkUL11aa7lM7wOfgoO53f0uJpjKSRpO6LwCBDd9Fm-wA; u=266252179; n=qSP946594369; token2=9WbeLmhHHLhTVpnVu264fUCMYeIAAAAAQREAAKnrFL00wW5eC7mPjhHwIZwkUL11aa7lM7wOfgoO53f0uJpjKSRpO6LwCBDd9Fm-wA; unc=qSP946594369; firstTime=1650118043342; _lxsdk_s=18032a80c4c-4d4-d30-e8f%7C%7C129',
'Referer': 'https://chs.meituan.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.88 Safari/537.36'
}
response = requests.get(url=html_url, headers=headers)
# print(response.text)
phone = re.findall('"phone":"(.*?)"', response.text)[0]
# \n 不是換行符, \n符號而已 \轉(zhuǎn)義字符給轉(zhuǎn)移掉
openTime = re.findall('"openTime":"(.*?)"', response.text)[0].replace('\\n', '')
address = re.findall('"address":"(.*?)"', response.text)[0]
shop_info = [phone, openTime, address]
return shop_info
# 保存文件 創(chuàng)建文件夾 encoding='utf-8' 指定編碼 如果說我用utf-8 還亂碼怎么辦
# w 會覆蓋, a不會覆蓋
f = open('究極無敵男人秘密最終版.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=[
'店名',
'人均消費(fèi)',
'最低消費(fèi)',
'商圈',
'店鋪類型',
'評分',
'電話',
'營業(yè)時(shí)間',
'地址',
'緯度',
'經(jīng)度',
'詳情頁',
])
csv_writer.writeheader() # 寫入表頭
# html_url = 'https://apimobile.meituan.com/group/v4/poi/pcsearch/70?uuid=f7c4d3664ab34f13ad7f.1650110501.1.0.0&userid=266252179&limit=32&offset=64&cateId=-1&q=%E4%BC%9A%E6%89%80&token=9WbeLmhHHLhTVpnVu264fUCMYeIAAAAAQREAAKnrFL00wW5eC7mPjhHwIZwkUL11aa7lM7wOfgoO53f0uJpjKSRpO6LwCBDd9Fm-wA'
1. 發(fā)送請求, 對于剛剛分析得到url地址發(fā)送請求 翻頁去分析請求url地址的變化規(guī)律
for page in range(0, 321, 32): # 從0 32 64 96 128 160 192 .... 320
time.sleep(1.5) # 延時(shí)等待 1.5S
url = 'https://apimobile.meituan.com/group/v4/poi/pcsearch/70'
# pycharm功能 快速批量替換, ctrl + R 選擇需要替換目標(biāo), 運(yùn)用正則表達(dá)式進(jìn)行批量替換
data = {
'uuid': 'f7c4d3664ab34f13ad7f.1650110501.1.0.0',
'userid': '266252179',
'limit': '32',
'offset': page,
'cateId': '-1',
'q': '會所',
'token': '9WbeLmhHHLhTVpnVu264fUCMYeIAAAAAQREAAKnrFL00wW5eC7mPjhHwIZwkUL11aa7lM7wOfgoO53f0uJpjKSRpO6LwCBDd9Fm-wA',
}
# headers 偽裝 python代碼的 外套
# User-Agent 用戶代理 瀏覽器基本的身份信息.... 最簡單反反爬的手段 為了防止被識別是爬蟲程序
# Referer 防盜鏈 告訴服務(wù)器我們請求url地址是從哪里跳轉(zhuǎn)過來
headers = {
'Referer': 'https://chs.meituan.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.88 Safari/537.36'
}
response = requests.get(url=url, params=data, headers=headers)
# print(response) # <Response [403]> 狀態(tài)碼 表示沒有訪問權(quán)限 防盜鏈 200 請求成功

image.png
2. 獲取數(shù)據(jù) response.text 獲取文本數(shù)據(jù)字符串?dāng)?shù)據(jù)類型 response.json() 字典數(shù)據(jù)類型
# print(response.json())
# pprint.pprint(response.json()) # 老師版本是 python 3.8
3. 解析數(shù)據(jù) 字典取值, 根據(jù)鍵值對取值 根據(jù)冒號左邊的內(nèi)容(鍵) 提取冒號右邊的內(nèi)容(值)
searchResult = response.json()['data']['searchResult']
for index in searchResult: # 把列表里面數(shù)據(jù) 一個(gè)一個(gè)提取出來
# pprint.pprint(index)
href = f'https://www.meituan.com/xiuxianyule/{index["id"]}/'
shop_info = get_shop_info(href)
title = index['title'] # 店名
price = index['avgprice'] # 人均消費(fèi)
lost_price = index['lowestprice'] # 最低消費(fèi)
area = index['areaname'] # 商圈
shop_type = index['backCateName'] # 店鋪類型
score = index['avgscore'] # 評分
latitude = index['latitude'] # 緯度
longitude = index['longitude'] # 經(jīng)度 ctrl + D 快速復(fù)制
# tab 集體縮進(jìn)
# shift + tab 取消縮進(jìn)
dit = {
'店名': title,
'人均消費(fèi)': price,
'最低消費(fèi)': lost_price,
'商圈': area,
'店鋪類型': shop_type,
'評分': score,
'電話': shop_info[0],
'營業(yè)時(shí)間': shop_info[1],
'地址': shop_info[2],
'緯度': latitude,
'經(jīng)度': longitude,
'詳情頁': href,
}
4. 保存數(shù)據(jù)
csv_writer.writerow(dit)
print(dit)
尾語
好了,我的這篇文章寫到這里就結(jié)束啦!
有更多建議或問題可以評論區(qū)或私信我哦!一起加油努力叭(? ?_?)?
喜歡就關(guān)注一下博主,或點(diǎn)贊收藏評論一下我的文章叭!!!

