大眾點評爬蟲可用api
大眾點評爬蟲、API,可以進行單獨城市、單獨地區、單獨商鋪的爬取、搜尋、多型別地區搜尋、資訊獲取、提供MongoDB資料庫儲存支援,可以進行點評文字解密的爬取、儲存。
原始碼:https://www.linkin.site/2019/01/14/大眾點評爬蟲可用API/
可用於大眾點評網頁版
目前可用:
- 獲取大眾點評當前可以查詢檢視到店鋪的所有已啟用城市資訊
- 獲取大眾點評裡所有省市直轄市的provinceId以及地區areaId
- 根據給定的中文城市、地區名稱來獲取其大眾點評首頁連結
- 透過id獲取地區名稱
- 透過id獲取地區內的所有子地區資訊
- 獲取某個城市的 熱搜關鍵詞
- 獲取某個城市的 當前可見有效店鋪分類
- 獲取某個城市的 當前可見有效的轄區資訊,包含子地區
- 獲取某個城市的 某個關鍵詞相關的搜尋結果和結果數
- (單執行緒與多執行緒)搜尋某個城市關於某個關鍵詞的某個分類、子地區、排序方式的相關店鋪並支援MongoDB儲存和本地檔案儲存
- 獲取某個商鋪的評分、星級、地址、電話、點評數、人均消費、點評標簽、點評種類等
- 獲取某個商鋪的加密點評資訊,支援條數設定
環境
使用環境:
- win 7 64bits
- pycharm
- python3
第三方庫:
- bs4 >=0.0.1
- lxml >=4.2.5
- pymongo >=3.7.1
- requests >=2.19.1
使用前
因為大眾點評的反爬措施,需要設定IP代理以及隨機切換可用的User-Agent來進行大量資料的爬取。
IP代理(Proxy)
如何設定?config.py中有詳細的各個代理設定註釋,建議使用PROXY_POOL進行IP代理,可以使用一次一個的介面來獲取代理IP。
UA池
user-agent可以使用settings.py中的UA池,如果你有更多的可用UA,可以自己加進去或者替換掉。
使用者cookie
如果你需要爬取加密的商鋪點評資料(頁數>1),則需要新增點評使用者的登陸cookie到config.py的COOKIE中。具體內容為一個字串,如:
‘_lxsdk_cuid=1681d897b62c8;_hc.v=ff4f63f6;thirdtoken=c9792’之類的。可以在瀏覽器除錯介面獲得。資料庫儲存(MongoDB)與本地儲存
如果需要儲存搜尋的店鋪資料,則需要到config.py中設定MongoDB的資料庫設定(本地儲存可以在城市搜尋api中設定儲存本地的路徑。),其中
- ‘database’為預設使用的資料庫
- ‘records’為記錄抓取的資料表名
- ‘searchDB’為搜尋結果存放的資料庫
其他相關的配置可以參見config.py 中的設定註解
使用
- 獲取大眾點評當前可以查詢檢視到店鋪的所有已啟用城市資訊
from dianping import DianPing
dp = DianPing()
cities = dp.active_cities
傳回結果 cities 為大眾點評全國可以顯示搜尋到店鋪的啟用城市串列:
[
{
"activeCity": true,
"appHotLevel": 1,
"cityAbbrCode": "BJ",
"cityAreaCode": "010",
"cityEnName": "beijing",
"cityId": 2,
"cityLevel": 1,
"cityName": "北京",
"cityOrderId": 406,
"cityPyName": "beijing",
"directURL": "",
"gLat": 39.904667,
"gLng": 116.408198,
"overseasCity": false,
"parentCityId": 0,
"provinceId": 1,
"scenery": false,
"tuanGouFlag": 1
},
...
]
- 獲取大眾點評裡所有省市直轄市的provinceId以及地區areaId
from dianping import DianPing
dp = DianPing()
provinces = dp.provinces
傳回結果 provinces 為全國的省、直轄市的ID資訊:
{
"北京": {
"areaId": 1,
"provinceId": "1"
},
"天津": {
"areaId": 1,
"provinceId": "2"
},
"河北": {
"areaId": 1,
"provinceId": "3"
},
"山西": {
"areaId": 1,
"provinceId": "4"
},
...
}
- 根據給定的中文城市、地區名稱來獲取其大眾點評首頁連結
from city import City
beijing = City('北京')
url = beijing.url
傳回結果 url 為北京市的大眾點評首頁:
http://www.dianping.com/beijing
- 獲取某個城市的 當前可見有效的轄區資訊,包含子地區
from city import City
beijing = City('北京')
beijing.get()
locations = beijing.locations
傳回結果 locations 為當前城市的所有子地區資訊:
[
{
"text": "海澱區",
"value": "17",
"children": [
{
"text": "雙榆樹",
"value": "2587",
"children": [
{
"text": "HQ尚客百貨",
"value": "6975"
},
{
"text": "當代商城",
"value": "2622"
},
{
"text": "華星影城",
"value": "2665"
},
{
"text": "雙安商場",
"value": "2720"
}
]
},
...
]
},
...
]
- 透過id獲取城市的某個地區名稱
#id 必須為城市中某個地區的id
from util.city import find_region_by_id
from city import City
beijing = City('北京')
beijing.get()
someplace = find_region_by_id(6975,beijing.locations)
傳回結果 someplace 為北京地區的對應id的子地區名稱:
# ID 6975 對應的地區
HQ尚客百貨
- 透過id獲取地區內的所有子地區資訊
from util.city import find_children_regions
from city import City
beijing = City('北京')
beijing.get()
sub_regions = find_children_regions(5956,beijing.locations)
傳回結果 sub_regions 為當前id下的所有子地區id串列:
# id 在城市的子地區串列中,但其未有子地區,傳回:
False
# id 在城市的子地區串列中, 如果其有子地區的話則傳回子地區id串列:
['6008']
# id 不在城市的子地區串列中,則傳回城市的一級子地區:
['17', '5951', '328', '15', '5952', '14', '5950', '9158', '16', '20', '9157']
- 獲取某個城市的 熱搜關鍵詞
from city import City
beijing = City('北京')
beijing.get()
hot = beijing.hot
傳回結果 hot 為當前城市“北京”的熱搜詞彙串列(包含其所屬分類id等資訊):
[
{
"subtag": "3",
"location": "7",
"maincategoryids": "35,60",
"datatype": "3002",
"id_": "786881",
"suggestkeyword": "溫泉"
},
{
"subtag": "18",
"location": "8",
"maincategoryids": "10",
"datatype": "3002",
"id_": "692874",
"suggestkeyword": "烤鴨"
},
...
]
- 獲取某個城市的 當前可見有效店鋪分類
from city import City
beijing = City('北京')
beijing.get()
category = beijing.category
傳回結果 category 為該城市所有的店鋪分類資訊串列:
[
{
"text": "酒吧",
"value": "133",
"children": [
{
"text": "清吧",
"value": "33950"
},
{
"text": "Live House",
"value": "33951"
},
{
"text": "夜店",
"value": "2951"
}
]
},
{
"text": "茶館",
"value": "134"
},
...
]
- 獲取某個城市的 某個關鍵詞相關的搜尋結果和結果數
from city import City
beijing = City('北京')
beijing.get()
relative = beijing.get_relative('健身')
傳回結果 relative 為北京市關鍵詞“健身”相關的搜尋詞彙以及其對應結果數:
{
"良子健身 京糧大廈店": "1",
"健身游泳瑜伽綜合性會所": "1",
"Hey Heroes!私教健身工作室 泛悅坊店": "1",
"ULife悅體健身 五棵松店": "1",
"U-Vista優維斯塔健身工作室 金融街旗艦店": "1",
"健身房24小時": "161",
"健身體驗卡": "1",
"銳健身": "29",
"Hot Fitness 熱健身工作室 霍營店": "1",
"鍛造健身ForgingFitness國際私教工作室": "1"
}
- (單執行緒與多執行緒)搜尋某個城市關於某個關鍵詞的某個分類、子地區、排序方式的相關店鋪並支援MongoDB儲存和本地檔案儲存
- 單執行緒搜尋下載相關店鋪
下例為搜尋下載北京市“海澱區”店鋪分類為“運動健身”的“有團購”的與“器材”相關的所有店鋪,搜尋下載結果“按人氣排序”,
save表示是否儲存進MongoDB資料庫,details表示是否抓取店鋪的詳細資訊。具體引數可見search函式註釋。
from city import City
beijing = City('北京')
beijing.get()
results = beijing.search('器材',category='運動健身',location='海澱區',filter='有團購',sort='按人氣排序',save=True,details=True)
傳回結果 results 為搜尋到的相關店鋪,具體內容,單個店鋪的MongoDB資料庫顯示:
{
"_id" : ObjectId("5c3c88f265b2fd3134266c7b"),
"店名" : "優享健身(金源店)",
"星級" : "四星商戶",
"註冊時間" : "2017-07-25T23:19:00",
"地址" : " 遠大路世紀金源燕莎B1層卜蜂蓮花超市內南側家電區",
"人均" : 3526,
"預訂" : false,
"分店url" : "http://www.dianping.com/brands/b93357498s45g45",
"商鋪圖片" : "http://vfile.meituan.net/joymerchant/-1945301364589883676-23601423-1525363931678.jpg",
"商鋪標簽" : "健身房",
"緯度" : 39.9573,
"經度" : 116.28518,
"電話" : [
"010-57159188"
],
"店鋪ID" : 93357498,
"會員卡ID" : 0,
"地區" : [
"遠大路"
],
"expand" : 0,
"poi" : "HEHHURZVVGIDGF",
"promoId" : 0,
"shopDealId" : 27807431,
"shopPower" : 40,
"hasSceneryOrder" : false,
"點評數" : "118",
"點評標簽" : [
"環境優雅(43)",
"服務熱情(17)",
"設施很贊(15)",
"教練很棒(14)",
"器械齊全(7)",
"體驗很棒(7)",
"乾凈衛生(4)",
"高大上(4)"
],
"點評類別" : {
"圖片" : "55",
"好評" : "85",
"中評" : "7",
"差評" : "26"
},
"評分" : {
"設施" : "8.3",
"環境" : "8.2",
"服務" : "7.6"
}
}
- 多執行緒搜尋下載相關店鋪
多執行緒搜尋與單執行緒搜尋流程一致,只是搜尋執行緒多開了而已,執行緒數為搜尋結果的頁數,最多為50個(大眾點評目前單頁最多個數)。啟用多執行緒的話,由於使用代理IP,有可能同時
獲取的代理多個執行緒都是同一個,所以在config.py加入了RANDOM_INTERVAL(隨機等待間隔)防止多個執行緒使用同一個代理被封。
- 獲取某個商鋪的評分、星級、地址、電話、點評數、人均消費、點評標簽、點評種類等
下例以獲取id為507576的店鋪資訊為例
from shop import Shop
store = Shop('507576')
store.get()
#店鋪名
name = store.name
#店鋪星級,50為五星,40為四星,35為三星半
stars = store.stars
#地址
address = store.address
#聯絡方式
phone = store.phone
#點評數
reviews = store.reviews
#人均消費
average = store.average
#顧客評分
scores = store.scores
#點評種類及數量
comment_kinds = store.comment_kinds
#點評標簽及數量
review_tags = store.review_tags
傳回結果 :
'滿福樓'
'50'
'朝陽門外大街8號藍島大廈東區六層(東大橋鐵站D2出口)''
'64030992 64053088'
'18821'
'128'
{'口味': '9.1', '環境': '9.1', '服務': '9.1'}
{'圖片': '3513', '好評': '17632', '中評': '355', '差評': '95'}
['回頭客(404)', '乾凈衛生(253)', '上菜快(106)', '停車方便(59)', '夜景贊(5)', '請客(161)', '朋友聚餐(93)', '家庭聚餐(44)', '現做現賣(22)', '下午茶(9)']
- 獲取下載儲存某個商鋪的加密點評資訊,支援條數設定
獲取點評需要使用cookie,具體使用參見“使用前”,預設儲存資料進入資料庫,具體的引數詳情參見get_reviews函式註釋。下例以獲取店鋪id為 507576 的商鋪以第2頁為起點的 300條加密點評為例:
from comment import Comments
from dbhelper import Database
from config import MongoDB
dianpingDB = Database(MongoDB)
target_shop = Comments('50576',db=dianpingDB)
target_shop.get()
target_shop.get_reviews(tname='儲存資料表名',count=300,frompage=2)
結果已經被儲存在資料庫中,MongoDB資料庫中的單條點評資料內容具體為:
{
"_id" : ObjectId("5c3c914e65b2fd3384558c69"),
"點評ID" : "496225994",
"點評連結" : "http://www.dianping.com/review/496225994",
"點評使用者" : "好想吃好",
"使用者ID" : "781396343",
"使用者主頁" : "http://www.dianping.com/member/781396343",
"使用者頭像" : "https://p0.meituan.net/userheadpicbackend/83fe454da66682fcbd43aed7e716f7c5104831.jpg",
"使用者等級" : "lv5",
"VIP使用者" : true,
"點評商鋪" : "滿福樓",
"商鋪ID" : "507576",
"點評星級" : "50",
"使用者評價" : {
"口味" : "非常好",
"環境" : "非常好",
"服務" : "非常好"
},
"點評時間" : "2019-01-13 21:17",
"點評圖片" : [
"http://qcloud.dpfile.com/pc/chB7IwRZcpIwgAZu6ZkIE1Ts_aTNOyiGGbmIGbs4RjCN3JfGN-IioWlr9osF8hImjoJrvItByyS4HHaWdXyO_DrXIaWutJls2xCVbatkhjUNNiIYVnHvzugZCuBITtvjski7YaLlHpkrQUr5euoQrg.jpg",
"http://qcloud.dpfile.com/pc/zGhlhFul5cqBQs7e5Vz8vKGz21xv2xOlIEIwy7kf50p-NpRbr0UwQ7niAIDwKWOCjoJrvItByyS4HHaWdXyO_DrXIaWutJls2xCVbatkhjUNNiIYVnHvzugZCuBITtvjski7YaLlHpkrQUr5euoQrg.jpg",
"http://qcloud.dpfile.com/pc/Ve_jDe47G9v8Da_Hsy9MpZqCs0Fb67Yq6j2rkpqgN7H0kAawvhDXOXBa2ZnI1FIWjoJrvItByyS4HHaWdXyO_DrXIaWutJls2xCVbatkhjUNNiIYVnHvzugZCuBITtvjski7YaLlHpkrQUr5euoQrg.jpg",
"http://qcloud.dpfile.com/pc/StJvWhLl7MjtPi7VbNfYIR2I1IS9esxPO21bqfDKVaPygfipf3l2ctLCNDL5jbj1joJrvItByyS4HHaWdXyO_DrXIaWutJls2xCVbatkhjUNNiIYVnHvzugZCuBITtvjski7YaLlHpkrQUr5euoQrg.jpg",
"http://qcloud.dpfile.com/pc/7UmBsS10yRloypGc2Pp1pdlmdKP2hDzRhWT5wZLgI-JbnpM9T49yMmnt4yPiPxuwjoJrvItByyS4HHaWdXyO_DrXIaWutJls2xCVbatkhjUNNiIYVnHvzugZCuBITtvjski7YaLlHpkrQUr5euoQrg.jpg",
"http://qcloud.dpfile.com/pc/sI_CeStxWNFGJcOTa1bhmxOKkLGBEHBmXGaXkST7jk8t-HQzlOY35ADlO6UZvd_rjoJrvItByyS4HHaWdXyO_DrXIaWutJls2xCVbatkhjUNNiIYVnHvzugZCuBITtvjski7YaLlHpkrQUr5euoQrg.jpg",
"http://qcloud.dpfile.com/pc/fXFthqUVtnH64f56FytXNTHCV_h2ItUd8n-LqQllEf8Ho8itsBkcmVncTI8kIYxjjoJrvItByyS4HHaWdXyO_DrXIaWutJls2xCVbatkhjUNNiIYVnHvzugZCuBITtvjski7YaLlHpkrQUr5euoQrg.jpg",
"http://qcloud.dpfile.com/pc/7DrPJ4wMkZMQJQMwzrV_htFX28QHwS538qf9O7X1Hx0i8AgtQV76cj-_sKD6JTPFjoJrvItByyS4HHaWdXyO_DrXIaWutJls2xCVbatkhjUNNiIYVnHvzugZCuBITtvjski7YaLlHpkrQUr5euoQrg.jpg",
"http://qcloud.dpfile.com/pc/FZy3uddbXxAZkk2-J8EI7GFutnl-xTc7gEdOn8IsUFQrvkHyMac7eaNrOOmvIgmcjoJrvItByyS4HHaWdXyO_DrXIaWutJls2xCVbatkhjUNNiIYVnHvzugZCuBITtvjski7YaLlHpkrQUr5euoQrg.jpg",
"http://qcloud.dpfile.com/pc/px379Hd9MRRqOF6opKanBs8QEGc7UK5pjkSHtQoP9BrbMF6JuBDWN8BUF4VB5oV5joJrvItByyS4HHaWdXyO_DrXIaWutJls2xCVbatkhjUNNiIYVnHvzugZCuBITtvjski7YaLlHpkrQUr5euoQrg.jpg",
"http://qcloud.dpfile.com/pc/xwUMFgIHr8Uemd33o3rQMg6ktHU-4BMTzvInDCRMhkhXBw3IHLzmZnDdPoSzfFepjoJrvItByyS4HHaWdXyO_DrXIaWutJls2xCVbatkhjUNNiIYVnHvzugZCuBITtvjski7YaLlHpkrQUr5euoQrg.jpg"
],
"評論事件" : {
"贊" : "4"
},
"點評內容" : "家裡的抓到300元代金券,今天到店品嘗美味。乘直梯到六樓,進店入眼就是放著小銅鍋的餐桌,才十一點多點兒大廳就幾乎滿員。仨人按大眾點評的推薦及個人喜好點了「牛骨高湯」「手切鮮羊肉」「羊上腦」「手切精品鮮黃瓜條」「精品太陽肉」仨「羊肉串兒」「糖捲果」肚子實在沒地方了,可精品還沒吃,只好「烤火燒」「炸火燒」「肉沫燒餅」「烤腰子」各點一個,三人分著嘗口兒。點的肉涮著吃沒一點兒羶味兒,還很嫩,麻醬蘸料很好吃!特別是腰子烤的牛極了,外麵包的油焦脆,裡面的腰子火候正好,美味!各種火燒也很好吃![服務]服務很到位!鍋裡剛有點兒沫子,服務小妹就幫著撇出去,最後還送了果盤,看我們挺愛吃的,又提示我們果盤還可以續,並送了我們2019年新掛歷,謝謝!!"
}
ToDo
- 如果想要抓取多個商鋪的點評資料,可以使用多個賬戶+多代理+UA池來繞過反爬
- 嘗試使用selenium對爬取點評資料進行驗證碼滑動驗證
- 使用手機接碼平臺註冊多個賬戶進行模擬登陸後獲取cookie進行爬取點評資料