用Python爬取美團(tuán)外賣(mài)APP評(píng)論

一嘹承、介紹

朋友暑假實(shí)踐需要美團(tuán)外賣(mài)APP評(píng)論這一份數(shù)據(jù)拉庵,一開(kāi)始我想射沟,這不就抓取網(wǎng)頁(yè)源代碼再?gòu)闹刑崛?shù)據(jù)就可以了嗎辉巡,結(jié)果發(fā)現(xiàn)事實(shí)并非如此恨憎,情況和之前崔大講過(guò)的分析Ajax來(lái)抓取今日頭條街拍美圖類(lèi)似,都是通過(guò)異步加載的方式傳輸數(shù)據(jù)郊楣,不同的是這次的是通過(guò)JS傳輸憔恳,其他的基本思路基本一致,希望那些數(shù)據(jù)能幫到她吧

二净蚤、流程

  • 目標(biāo)站點(diǎn)分析
    用瀏覽器打開(kāi)美團(tuán)外賣(mài)APP評(píng)論钥组,F(xiàn)12
    1.首先我們要找到我們想要的評(píng)論數(shù)據(jù),在第一次“失敗”的直接抓取網(wǎng)頁(yè)源代碼后今瀑,我們發(fā)現(xiàn)它是通過(guò)Ajax加載的程梦,我們點(diǎn)擊JS選項(xiàng),可以發(fā)現(xiàn)JS項(xiàng)目里面的返回結(jié)果有我們想要的數(shù)據(jù)橘荠,勾選Preserve log屿附,當(dāng)點(diǎn)擊查看更多評(píng)論時(shí),后臺(tái)(JS里)會(huì)出現(xiàn)新的Ajax請(qǐng)求砾医,發(fā)現(xiàn)還有參數(shù)start和的變化拿撩,其他請(qǐng)求參數(shù)不變衣厘,start的參數(shù)變化是以10遞增的如蚜,的參數(shù)變化可就讓人摸不著頭腦(這個(gè)時(shí)候我們也不要方压恒,因?yàn)榇蠖嗲闆r下沒(méi)有規(guī)律的參數(shù)都是沒(méi)用的)
    1.0

2.經(jīng)過(guò)我們對(duì)http://comment.mobilem.#/comment/getComments?callback=jQuery17203361018749253357_1503362214558&baike=%E7%BE%8E%E5%9B%A2%E5%A4%96%E5%8D%96+Android_com.sankuai.meituan.takeoutnew&c=message&a=getmessage&start=0&count=10&_=1503362215647進(jìn)行分析后發(fā)現(xiàn)它的標(biāo)準(zhǔn)式為‘http://comment.mobilem.#/comment/getComments?&baike=%E7%BE%8E%E5%9B%A2%E5%A4%96%E5%8D%96+Android_com.sankuai.meituan.takeoutnew&start=’+str(i*10),i每次增加1,就包含新的十條評(píng)論的內(nèi)容错邦,所以我們通過(guò)改變i的值就可以拿到不同的數(shù)據(jù)

2.0

  • 分析url的網(wǎng)頁(yè)源代碼探赫,在源代碼里有我們想要的評(píng)論數(shù)據(jù),我們可以用正則(在這里正則還是比較好用的)把我們想要的信息弄下來(lái)

  • 開(kāi)啟循環(huán)撬呢,批量抓取

  • 保存數(shù)據(jù)至文本和數(shù)據(jù)庫(kù)

---------------------------17/8/26第一次更新:關(guān)于獲取評(píng)論的編碼問(wèn)題
#之前是這樣處理的:
def parse_one_page(html):
    pattern2 = re.compile('"m_type":"0",(.*?),"username"', re.S)
    items=re.findall(pattern2,html)
    for item in items:
        item = "{" + item + "}"
        item=json.loads(item)
        write_to_file(item)
        print(item)
        save_to_mongo(item)

#皮皮哥告訴了我他的獨(dú)家正則匹配方法可以匹配出來(lái)伦吠,這樣的確獲得的item沒(méi)有編碼問(wèn)題
def parse_one_page(html):
    pattern = '\"content\":\".*?"'
    items=re.findall(pattern,html)
    for item in items:
        item =eval(item.split(':',1)[1])
        write_to_file(item)
        print(item)
        save_to_mongo(item)

#對(duì)一般正則寫(xiě)法獲得的item進(jìn)行的方法,這是從皮皮哥那里得知的魂拦,親測(cè)有效
def parse_one_page(html):
    pattern = re.compile('rsion_name".*?"content":(.*?),"username"', re.S)
    items=re.findall(pattern,html)
    #print(items)
    for item in items:
        item = item.encode('utf-8').decode('unicode_escape')
        write_to_file(item)
        print(item)
        save_to_mongo(item)

三毛仪、代碼

#config.py
MONGO_URL='localhost'
MONGO_DB='meituan'
MONGO_TABLE='meituan'
import requests
from requests.exceptions import RequestException
import json
import re
from day31.config import *
import pymongo

client=pymongo.MongoClient(MONGO_URL)
db=client[MONGO_DB]
base_url='http://comment.mobilem.#/comment/getComments?callback=jQuery17209056727722758744_1502991196139&baike=%E7%BE%8E%E5%9B%A2%E5%A4%96%E5%8D%96+Android_com.sankuai.meituan.takeoutnew&start='

def the_url(url):
    try:
        response = requests.get(url)
        if response.status_code==200:
            response.encoding='utf-8'
            return response.text
        return None
    except RequestException:
        print('請(qǐng)求出錯(cuò)')
        return None

def the_total():
    html=the_url(base_url)
    pattern1 = re.compile('"total":(.*?),"messages"', re.S)
    Total = re.findall(pattern1, html)
    Total=int(':'.join(Total))
    #print(type(Total))
    show='總計(jì)評(píng)論%d條'%Total
    print(show)
    write_to_file(show)
    return Total

def parse_one_page(html):
    pattern2 = re.compile('"m_type":"0",(.*?),"username"', re.S)
    items=re.findall(pattern2,html)
    for item in items:
        item = "{" + item + "}"
        item=json.loads(item)
        write_to_file(item)
        print(item)
        save_to_mongo(item)



def save_to_mongo(result):
    try:
        if db[MONGO_TABLE].insert(result):
            print('儲(chǔ)存到MongoDB成功',result)
    except Exception:
        print('儲(chǔ)存到MongoDB失敗',result)

def write_to_file(content):
    with open('meituan_result.text','a',encoding='utf-8') as f:
        f.write(json.dumps(content,ensure_ascii=False)+'\n')
        f.close()

def main():
    Total=the_total()
    Total=int(Total/10)+2
    for i in range(Total):
        url = base_url + str(i*10)
        if the_url(url)!=None:
            html=the_url(url)
            parse_one_page(html)
        else:
            print('輸完啦')
    ps='PS:因?yàn)橛行┰u(píng)論空,所以實(shí)際評(píng)論比抓取的少'   #這是我瞎猜的
    write_to_file(ps)
    print(ps)

if __name__ == '__main__':
    main()

四芯勘、最后得到的數(shù)據(jù)視圖和文件

3.0

五箱靴、總結(jié)

1.程序報(bào)錯(cuò)很正常,不要一報(bào)錯(cuò)就問(wèn)別人荷愕,先自己思考衡怀、百度
2.在數(shù)據(jù)類(lèi)型處理方面的知識(shí)還要加強(qiáng)
3.感謝皮皮哥、感謝姚文峰前輩安疗!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抛杨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子荐类,更是在濱河造成了極大的恐慌怖现,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玉罐,死亡現(xiàn)場(chǎng)離奇詭異真竖,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)厌小,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)恢共,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人璧亚,你說(shuō)我怎么就攤上這事讨韭。” “怎么了癣蟋?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵透硝,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我疯搅,道長(zhǎng)濒生,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任幔欧,我火速辦了婚禮罪治,結(jié)果婚禮上丽声,老公的妹妹穿的比我還像新娘。我一直安慰自己觉义,他們只是感情好雁社,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著晒骇,像睡著了一般霉撵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上洪囤,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天徒坡,我揣著相機(jī)與錄音,去河邊找鬼瘤缩。 笑死崭参,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的款咖。 我是一名探鬼主播何暮,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼铐殃!你這毒婦竟也來(lái)了海洼?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤富腊,失蹤者是張志新(化名)和其女友劉穎坏逢,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體赘被,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡是整,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了民假。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浮入。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖羊异,靈堂內(nèi)的尸體忽然破棺而出事秀,到底是詐尸還是另有隱情,我是刑警寧澤野舶,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布易迹,位于F島的核電站,受9級(jí)特大地震影響平道,放射性物質(zhì)發(fā)生泄漏睹欲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一一屋、第九天 我趴在偏房一處隱蔽的房頂上張望窘疮。 院中可真熱鬧袋哼,春花似錦、人聲如沸考余。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)楚堤。三九已至,卻和暖如春含懊,著一層夾襖步出監(jiān)牢的瞬間身冬,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工岔乔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酥筝,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓雏门,卻偏偏與公主長(zhǎng)得像嘿歌,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子茁影,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,506評(píng)論 25 707
  • 夏天來(lái)了 行道樹(shù)紛紛戴上手套 躊躇滿志 只有一位 只是戴起了袖套
    白條紋的黑貓閱讀 186評(píng)論 0 0
  • 今夜募闲,我望見(jiàn)故鄉(xiāng) 院角里生出了蘑菇 沙磚里藏了一窩蜜蜂 屋檐里飛出了一只蝴蝶 一隊(duì)小雞跳過(guò)門(mén)檻 往屋里歇 今夜步脓, ...
    莫愁Jessie閱讀 206評(píng)論 2 7
  • 都晚上了,然后認(rèn)識(shí)了個(gè)很可愛(ài)的姑娘浩螺,我都不知道該怎么形容靴患,我一眼看到,長(zhǎng)相不錯(cuò)啊要出,與別人不同的是長(zhǎng)得很好鸳君,氣質(zhì)也不...
    翔于閱讀 327評(píng)論 0 0
  • 在大家咨詢的各類(lèi)肌膚問(wèn)題中况脆,最眼熟的撤贡觯客就是黑頭問(wèn)題了,所以一直想找個(gè)機(jī)會(huì)來(lái)說(shuō)說(shuō)黑頭這個(gè)萬(wàn)年話題格了。實(shí)際上關(guān)于黑頭問(wèn)...
    萌說(shuō)閱讀 340評(píng)論 0 2