Python爬蟲(chóng)實(shí)例——爬取美團(tuán)美食數(shù)據(jù)
1.分析美團(tuán)美食網(wǎng)頁(yè)的url參數(shù)構(gòu)成
1)搜索要點(diǎn)
美團(tuán)美食,地址:北京,搜索關(guān)鍵詞:火鍋
2)爬取的url
https://bj.meituan.com/s/%E7%81%AB%E9%94%85/
3)說(shuō)明
url會(huì)有自動(dòng)編碼中文功能。所以火鍋二字指的就是這一串我們不認(rèn)識(shí)的代碼%E7%81%AB%E9%94%85。
通過(guò)關(guān)鍵詞城市的url構(gòu)造,解析當(dāng)前url中的bj=北京,/s/后面跟搜索關(guān)鍵詞。
這樣我們就可以了解到當(dāng)前url的構(gòu)造。
2.分析頁(yè)面數(shù)據(jù)來(lái)源(F12開(kāi)發(fā)者工具)
開(kāi)啟F12開(kāi)發(fā)者工具,并且刷新當(dāng)前頁(yè)面:可以看到切換到第二頁(yè)時(shí)候,我們的url沒(méi)有變化,網(wǎng)站也沒(méi)有自動(dòng)進(jìn)行刷新跳轉(zhuǎn)操作。(web中ajax技術(shù)就是在保證頁(yè)面不刷新,url不變化情況下進(jìn)行數(shù)據(jù)加載的技術(shù))
此時(shí)我們需要在開(kāi)發(fā)者工具中,找到xhr里面對(duì)應(yīng)當(dāng)前數(shù)據(jù)的響應(yīng)文件。
分析到這里可以得知:我們的數(shù)據(jù)是以json格式交互。分析第二頁(yè)的json文件請(qǐng)求地址與第三頁(yè)json文件的請(qǐng)求地址。
第二頁(yè):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
第三頁(yè):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
對(duì)比發(fā)現(xiàn):offse參數(shù)每次翻頁(yè)增加32,并且limit參數(shù)是一次請(qǐng)求的數(shù)據(jù)量,offse是數(shù)據(jù)請(qǐng)求的開(kāi)始元素,q是搜索關(guān)鍵詞poi/pcsearch/1?其中的1是北京城市的id編號(hào)。
3.構(gòu)造請(qǐng)求抓取美團(tuán)美食數(shù)據(jù)
接下來(lái)直接構(gòu)造請(qǐng)求,循環(huán)訪問(wèn)每一頁(yè)的數(shù)據(jù),最終代碼如下。
import requestsimport redef start(): for w in range(0, 1600, 32): #頁(yè)碼根據(jù)實(shí)際情況x32即可,我這里是設(shè)置50頁(yè)為上限,為了避免設(shè)置頁(yè)碼過(guò)高或者數(shù)據(jù)過(guò)少情況,定義最大上限為1600-也就是50頁(yè),使用try-except來(lái)檢測(cè)時(shí)候異常,異常跳過(guò)該頁(yè),一般作為無(wú)數(shù)據(jù)跳過(guò)該頁(yè)處理 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開(kāi)發(fā)者工具下面的requests_headers中查看,需要實(shí)現(xiàn)選擇如下headers信息 #必要情況 請(qǐng)求頻繁 建議增加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) #正則獲取當(dāng)前響應(yīng)內(nèi)容中的數(shù)據(jù),因json方法無(wú)法針對(duì)店鋪特有的title鍵值進(jìn)行獲取沒(méi)所以采用正則 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) #輸出當(dāng)前返回?cái)?shù)據(jù)的長(zhǎng)度 是否為32 print(len(titles), len(addresses), len(avgprices), len(avgscores), len(comments)) for o in range(len(titles)): #循環(huán)遍歷每一個(gè)值 寫(xiě)入文件中 title = titles[o] address = addresses[o] avgprice = avgprices[o] avgscore = avgscores[o] comment = comments[o] #寫(xiě)入本地文件 file_data(title, address, avgprice, avgscore, comment)#文件寫(xiě)入方法def file_data(title, address, avgprice, avgscore, comment): data = {’店鋪名稱’: title,’店鋪地址’: address,’平均消費(fèi)價(jià)格’: avgprice,’店鋪評(píng)分’: avgscore,’評(píng)價(jià)人數(shù)’: comment } with open(’美團(tuán)美食.txt’, ’a’, encoding=’utf-8’)as fb: fb.write(json.dumps(data, ensure_ascii=False) + ’n’) #ensure_ascii=False必須加因?yàn)閖son.dumps方法不關(guān)閉轉(zhuǎn)碼會(huì)導(dǎo)致出現(xiàn)亂碼情況if __name__ == ’__main__’: start()
運(yùn)行結(jié)果如下:
本地文件:
4.總結(jié)
根據(jù)搜索詞變化,城市變化,可以改變url中指定的參數(shù)來(lái)實(shí)現(xiàn)。同時(shí)也要記得變更headers中的指定參數(shù),方法簡(jiǎn)單,多加練習(xí)即可熟悉ajax類型的數(shù)據(jù)抓取。
以上就是Python爬蟲(chóng)實(shí)例——爬取美團(tuán)美食數(shù)據(jù)的詳細(xì)內(nèi)容,更多關(guān)于Python爬蟲(chóng)爬取美食數(shù)據(jù)的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. CSS3實(shí)例分享之多重背景的實(shí)現(xiàn)(Multiple backgrounds)2. 使用Spry輕松將XML數(shù)據(jù)顯示到HTML頁(yè)的方法3. php網(wǎng)絡(luò)安全中命令執(zhí)行漏洞的產(chǎn)生及本質(zhì)探究4. XHTML 1.0:標(biāo)記新的開(kāi)端5. ASP基礎(chǔ)知識(shí)VBScript基本元素講解6. 利用CSS3新特性創(chuàng)建透明邊框三角7. XML入門(mén)的常見(jiàn)問(wèn)題(四)8. asp(vbscript)中自定義函數(shù)的默認(rèn)參數(shù)實(shí)現(xiàn)代碼9. 詳解CSS偽元素的妙用單標(biāo)簽之美10. HTML5 Canvas繪制圖形從入門(mén)到精通
