溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python如何爬取美團美食數(shù)據(jù)

發(fā)布時間:2021-11-25 14:59:08 來源:億速云 閱讀:301 作者:小新 欄目:大數(shù)據(jù)

這篇文章將為大家詳細講解有關(guān)Python如何爬取美團美食數(shù)據(jù),小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

1.分析美團美食網(wǎng)頁的url參數(shù)構(gòu)成

1)搜索要點

美團美食,地址:北京,搜索關(guān)鍵詞:火鍋

2)爬取的url

https://bj.meituan.com/s/%E7%81%AB%E9%94%85/

3)說明

url會有自動編碼中文功能。所以火鍋二字指的就是這一串我們不認識的代碼%E7%81%AB%E9%94%85。

通過關(guān)鍵詞城市的url構(gòu)造,解析當前url中的bj=北京,/s/后面跟搜索關(guān)鍵詞。

這樣我們就可以了解到當前url的構(gòu)造。

2.分析頁面數(shù)據(jù)來源(F12開發(fā)者工具)

開啟F12開發(fā)者工具,并且刷新當前頁面:可以看到切換到第二頁時候,我們的url沒有變化,網(wǎng)站也沒有自動進行刷新跳轉(zhuǎn)操作。(web中ajax技術(shù)就是在保證頁面不刷新,url不變化情況下進行數(shù)據(jù)加載的技術(shù))

此時我們需要在開發(fā)者工具中,找到xhr里面對應(yīng)當前數(shù)據(jù)的響應(yīng)文件。

Python如何爬取美團美食數(shù)據(jù)

分析到這里可以得知:我們的數(shù)據(jù)是以json格式交互。分析第二頁的json文件請求地址與第三頁json文件的請求地址。

第二頁:https://apimobile.meituan.com/group/v4/poi/pcsearch/1?uuid=xxx&userid=-1&limit=32&offset=32&cateId=-1&q=%E7%81%AB%E9%94%85

第三頁:https://apimobile.meituan.com/group/v4/poi/pcsearch/1?uuid=xxx&userid=-1&limit=32&offset=64&cateId=-1&q=%E7%81%AB%E9%94%85

對比發(fā)現(xiàn):offse參數(shù)每次翻頁增加32,并且limit參數(shù)是一次請求的數(shù)據(jù)量,offse是數(shù)據(jù)請求的開始元素,q是搜索關(guān)鍵詞poi/pcsearch/1?其中的1是北京城市的id編號。

3.構(gòu)造請求抓取美團美食數(shù)據(jù)

接下來直接構(gòu)造請求,循環(huán)訪問每一頁的數(shù)據(jù),最終代碼如下。

import requests
import re


def start():
    for w in range(0, 1600, 32):
    #頁碼根據(jù)實際情況x32即可,我這里是設(shè)置50頁為上限,為了避免設(shè)置頁碼過高或者數(shù)據(jù)過少情況,定義最大上限為1600-也就是50頁,使用try-except來檢測時候異常,異常跳過該頁,一般作為無數(shù)據(jù)跳過該頁處理
        try:
        # 注意uuid后面參數(shù)空余將uuid后xxx替換為自己的uuid參數(shù)
            url = 'https://apimobile.meituan.com/group/v4/poi/pcsearch/1?uuid=xxx&userid=-1&limit=32&offset='+str(w)+'&cateId=-1&q=%E7%81%AB%E9%94%85'
            #headers的數(shù)據(jù)可以在F12開發(fā)者工具下面的requests_headers中查看,需要實現(xiàn)選擇如下headers信息
            #必要情況  請求頻繁 建議增加cookie參數(shù)在headers內(nèi)
            headers = {
                'Accept': '*/*',
                'Accept-Encoding': 'gzip, deflate, br',
                'Accept-Language': 'zh-CN,zh;q=0.9',
                'Connection': 'keep-alive',
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400',
                'Host': 'apimobile.meituan.com',
                'Origin': 'https://bj.meituan.com',
                'Referer': 'https://bj.meituan.com/s/%E7%81%AB%E9%94%85/'
            }
            response = requests.get(url, headers=headers)
            #正則獲取當前響應(yīng)內(nèi)容中的數(shù)據(jù),因json方法無法針對店鋪特有的title鍵值進行獲取沒所以采用正則
      titles = re.findall('","title":"(.*?)","address":"', response.text)
         addresses = re.findall(',"address":"(.*?)",', response.text)
         avgprices = re.findall(',"avgprice":(.*?),', response.text)
         avgscores = re.findall(',"avgscore":(.*?),',response.text)
         comments = re.findall(',"comments":(.*?),',response.text)
         #輸出當前返回數(shù)據(jù)的長度  是否為32
         print(len(titles), len(addresses), len(avgprices), len(avgscores), len(comments))
         for o in range(len(titles)):
         #循環(huán)遍歷每一個值  寫入文件中
             title = titles[o]
             address = addresses[o]
             avgprice = avgprices[o]
             avgscore = avgscores[o]
             comment = comments[o]
             #寫入本地文件
             file_data(title, address, avgprice, avgscore, comment)

#文件寫入方法
def file_data(title, address, avgprice, avgscore, comment):
    data = {
                '店鋪名稱': title,
                '店鋪地址': address,
                '平均消費價格': avgprice,
                '店鋪評分': avgscore,
                '評價人數(shù)': comment
            }
    with open('美團美食.txt', 'a', encoding='utf-8')as fb:
        fb.write(json.dumps(data, ensure_ascii=False) + '\n')
        #ensure_ascii=False必須加因為json.dumps方法不關(guān)閉轉(zhuǎn)碼會導(dǎo)致出現(xiàn)亂碼情況
if __name__ == '__main__':
    start()

運行結(jié)果如下:

Python如何爬取美團美食數(shù)據(jù)

關(guān)于“Python如何爬取美團美食數(shù)據(jù)”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI