1. 程式人生 > >分析並爬取美團美食資訊的一個簡單爬蟲練習。

分析並爬取美團美食資訊的一個簡單爬蟲練習。

    閒來無聊,感覺美團資訊可能會爬取有點難度,so,我就想來試一試爬取一下美團的美食的資訊,不過,經過搜尋,也有大佬做過了,但是我自己做的呢,還是寫下來分享一下吧,畢竟是自己寫出來的程式碼。

     依然用到的是Python3,Request,bs4裡面的BeautifulSoup,正則re,嗯,大概就這麼多吧。。。。

      好了,首先我們先用request請求一下爬取地區的美團美食頁面,隨便點選一個小縣城的吧,url是http://zp.meituan.com/meishi/然後檢視獲取到的頁面程式碼。大概的一個簡單函式是:

def gethtmlcode(url,header):
    req = request.Request(url,headers=header)
    res = request.urlopen(req)
    htmlcode = res.read().decode("utf-8")
    return htmlcode

由於前期分析了幾次,美團可能會給你拒絕請求,把你的IP給記住,所以呢,我加入了一點請求頭,可能在單執行緒中的作用不大,當用到Scrapy,或者是多執行緒等等爬取的時候,可能就會有很大的作用了。奉上headers:

headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
    'Cache-Control': 'max-age=0',
    'Proxy-Connection': 'keep-alive',
    'Host': 'zp.meituan.com',
    'Referer': 'http://zp.meituan.com/',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': '',
    'Content-Type': 'text/html;charset=utf-8',
    'Cookie': '',
}

不過,cookie和user-agent得需要自己填寫,嗯,這裡就不解釋了,大概就是模擬瀏覽器請求訪問的。

好了,獲取到網頁程式碼以後我們分析一下,一下是分析思路。

上個圖,請求下來的程式碼有點亂,我用Hbuilder來格式話一下,讓便我們分析,這樣看起來就好看多了,至少不會讓人一頭霧水,嗯。

然後我們用瀏覽器,請求一下,分析一下網頁元素,在瀏覽器用我們需要獲取到的資訊  大概在這裡面

紅色框框中的,但是,在Hbuilder中搜索,li所對用的class類的時候,是沒有的。然後搜所名字,發現是在JavaScript中,所以,他的載入方式是獲取到Json格式的字串,在JS中通過js載入進來的,所以我們就需要將js匹配出來,解析出我們想要的資料,所以,在Hbuilder裡面,得到我們所需要的資料在哪個script裡面,用BeautifulSoup解析,得到script,然後通過json解析出相對應的資料。大概函式是這樣的。

def analysis(htmlcode):
    soup = BeautifulSoup(htmlcode,'lxml')
    js = soup.find_all("script")
    data = js[14].text
    string = re.findall("window._appState = (.*);",data)[0]
    dictdata = json.loads(string,encoding="utf-8")
    tempsource = dictdata["poiLists"]
    source = tempsource["poiInfos"][0]
    return source

返回的source是一個內容為list的字典,資料格式大概是這樣的資料。

{
"poiId": ,
"frontImg": "",
"title": "",
"avgScore": 4.5,
"allCommentNum": 8,
"address": "",
"avgPrice": 36,
"dealList": [],
"hasAds": true,
"adsClickUrl": "",
"adsShowUrl": ""
					}

大概我我們能夠看到對我們有用的資料是有poiId(我的分析應該是每個商店店鋪唯一的id標識),title(商家店鋪名稱),avgScore(平均評分),allCommentNum(評論數量),address(商家店鋪的地址),avgPrice(人均價格),目前我們所可以獲取到的資料,大概就是這些,通過他的點選分析,每個商家的URL地址,大概是這樣的http://www.meituan.com/meishi/<poiId>/  前面都一樣,後邊的poiId是變化的。所以我們可以將poiid載入到一個list裡面,然後拼接地址,獲取到商家的URLlist,進而分析點選網頁,獲取到商家詳細資訊,商家的評論等可以看到的公佈出來的資訊。因為商家的團購資訊,以及價格資訊等,需要登陸以後實現爬取,所以,暫時並沒有去寫這一塊。嗯,不過在我單執行緒批量爬取一個城市的所有美食資訊的時候,美團會拒絕你的請求,所以在一定程度上,需要我們再加一定的IP代理池,還有cookie池。