大衆點評爬蟲

大衆點評爬蟲可用api

大衆點評爬蟲、API,能夠進行單獨城市、單獨地區、單獨商鋪的爬取、搜索、多類型地區搜索、信息獲取、提供MongoDB數據庫存儲支持,能夠進行點評文本解密的爬取、存儲。python

源碼:地址數據庫

可用於大衆點評網頁版json

目前可用:api

  • 獲取大衆點評當前能夠查詢查看到店鋪的全部已激活城市信息
  • 獲取大衆點評裏全部省市直轄市的provinceId以及地區areaId
  • 根據給定的中文城市、地區名稱來獲取其大衆點評首頁連接
  • 經過id獲取地區名稱
  • 經過id獲取地區內的全部子地區信息
  • 獲取某個城市的 熱搜關鍵詞
  • 獲取某個城市的 當前可見有效店鋪分類
  • 獲取某個城市的 當前可見有效的轄區信息,包含子地區
  • 獲取某個城市的 某個關鍵詞相關的搜索結果和結果數
  • (單線程與多線程)搜索某個城市關於某個關鍵詞的某個分類、子地區、排序方式的相關店鋪並支持MongoDB存儲和本地文件存儲
  • 獲取某個商鋪的評分、星級、地址、電話、點評數、人均消費、點評標籤、點評種類等
  • 獲取某個商鋪的加密點評信息,支持條數設定

環境

使用環境:瀏覽器

  • win 7 64bits
  • pycharm
  • python3

第三方庫:cookie

  • bs4 >=0.0.1
  • lxml >=4.2.5
  • pymongo >=3.7.1
  • requests >=2.19.1

使用前

由於大衆點評的反爬措施,須要設置IP代理以及隨機切換可用的User-Agent來進行大量數據的爬取。多線程

IP代理(Proxy)app

如何設置?config.py中有詳細的各個代理設置註釋,建議使用PROXY_POOL進行IP代理,可使用一次一個的接口來獲取代理IP。函數

UA池ui

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進行爬取點評數據
相關文章
相關標籤/搜索