分析並爬取美團美食資訊的一個簡單爬蟲練習。
閒來無聊,感覺美團資訊可能會爬取有點難度,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池。