作者:linkin 鏈接:
https://segmentfault.com/a/1190000017891608
大眾點(diǎn)評(píng)爬蟲(chóng)可用api
大眾點(diǎn)評(píng)爬蟲(chóng)、API,可以進(jìn)行單獨(dú)城市、單獨(dú)地區(qū)、單獨(dú)商鋪的爬取、搜索、多類型地區(qū)搜索、信息獲取、提供MongoDB數(shù)據(jù)庫(kù)存儲(chǔ)支持,可以進(jìn)行點(diǎn)評(píng)文本解密的爬取、存儲(chǔ)。
源碼:https://www.linkin.site/2019/01/14/大眾點(diǎn)評(píng)爬蟲(chóng)可用API/
可用于大眾點(diǎn)評(píng)網(wǎng)頁(yè)版
目前可用:
獲取大眾點(diǎn)評(píng)當(dāng)前可以查詢查看到店鋪的所有已激活城市信息
獲取大眾點(diǎn)評(píng)里所有省市直轄市的provinceId以及地區(qū)areaId
根據(jù)給定的中文城市、地區(qū)名稱來(lái)獲取其大眾點(diǎn)評(píng)首頁(yè)鏈接
通過(guò)id獲取地區(qū)名稱
通過(guò)id獲取地區(qū)內(nèi)的所有子地區(qū)信息
獲取某個(gè)城市的 熱搜關(guān)鍵詞
獲取某個(gè)城市的 當(dāng)前可見(jiàn)有效店鋪分類
獲取某個(gè)城市的 當(dāng)前可見(jiàn)有效的轄區(qū)信息,包含子地區(qū)
獲取某個(gè)城市的 某個(gè)關(guān)鍵詞相關(guān)的搜索結(jié)果和結(jié)果數(shù)
(單線程與多線程)搜索某個(gè)城市關(guān)于某個(gè)關(guān)鍵詞的某個(gè)分類、子地區(qū)、排序方式的相關(guān)店鋪并支持MongoDB存儲(chǔ)和本地文件存儲(chǔ)
獲取某個(gè)商鋪的評(píng)分、星級(jí)、地址、電話、點(diǎn)評(píng)數(shù)、人均消費(fèi)、點(diǎn)評(píng)標(biāo)簽、點(diǎn)評(píng)種類等
獲取某個(gè)商鋪的加密點(diǎn)評(píng)信息,支持條數(shù)設(shè)定
環(huán)境
使用環(huán)境:
win 7 64bits
pycharm
python3
第三方庫(kù):
bs4 >=0.0.1
lxml >=4.2.5
pymongo >=3.7.1
requests >=2.19.1
使用前
因?yàn)榇蟊婞c(diǎn)評(píng)的反爬措施,需要設(shè)置IP代理以及隨機(jī)切換可用的User-Agent來(lái)進(jìn)行大量數(shù)據(jù)的爬取。
IP代理(Proxy)
如何設(shè)置?config.py中有詳細(xì)的各個(gè)代理設(shè)置注釋,建議使用PROXY_POOL進(jìn)行IP代理,可以使用一次一個(gè)的接口來(lái)獲取代理IP。
UA池
user-agent可以使用settings.py中的UA池,如果你有更多的可用UA,可以自己加進(jìn)去或者替換掉。
用戶cookie
如果你需要爬取加密的商鋪點(diǎn)評(píng)數(shù)據(jù)(頁(yè)數(shù)>1),則需要添加點(diǎn)評(píng)用戶的登陸cookie到config.py的COOKIE中。具體內(nèi)容為一個(gè)字符串,如:
'_lxsdk_cuid=1681d897b62c8;_hc.v=ff4f63f6;thirdtoken=c9792'之類的。可以在瀏覽器調(diào)試界面獲得。數(shù)據(jù)庫(kù)存儲(chǔ)(MongoDB)與本地存儲(chǔ)
如果需要存儲(chǔ)搜索的店鋪數(shù)據(jù),則需要到config.py中設(shè)置MongoDB的數(shù)據(jù)庫(kù)設(shè)置(本地存儲(chǔ)可以在城市搜索api中設(shè)置保存本地的路徑。),其中
'database'為默認(rèn)使用的數(shù)據(jù)庫(kù)
'records'為記錄抓取的數(shù)據(jù)表名
'searchDB'為搜索結(jié)果存放的數(shù)據(jù)庫(kù)
其他相關(guān)的配置可以參見(jiàn)config.py 中的設(shè)置注解
使用
獲取大眾點(diǎn)評(píng)當(dāng)前可以查詢查看到店鋪的所有已激活城市信息
from dianping import DianPing
dp = DianPing()
cities = dp.active_cities
返回結(jié)果 cities 為大眾點(diǎn)評(píng)全國(guó)可以顯示搜索到店鋪的激活城市列表:
[
{
'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
},
...
]
獲取大眾點(diǎn)評(píng)里所有省市直轄市的provinceId以及地區(qū)areaId
from dianping import DianPing
dp = DianPing()
provinces = dp.provinces
返回結(jié)果 provinces 為全國(guó)的省、直轄市的ID信息:
{
'北京': {
'areaId': 1,
'provinceId': '1'
},
'天津': {
'areaId': 1,
'provinceId': '2'
},
'河北': {
'areaId': 1,
'provinceId': '3'
},
'山西': {
'areaId': 1,
'provinceId': '4'
},
...
}
根據(jù)給定的中文城市、地區(qū)名稱來(lái)獲取其大眾點(diǎn)評(píng)首頁(yè)鏈接
from city import City
beijing = City('北京')
url = beijing.url
返回結(jié)果 url 為北京市的大眾點(diǎn)評(píng)首頁(yè):
http://www.dianping.com/beijing
獲取某個(gè)城市的 當(dāng)前可見(jiàn)有效的轄區(qū)信息,包含子地區(qū)
from city import City
beijing = City('北京')
beijing.get()
locations = beijing.locations
返回結(jié)果 locations 為當(dāng)前城市的所有子地區(qū)信息:
[
{
'text': '海淀區(qū)',
'value': '17',
'children': [
{
'text': '雙榆樹(shù)',
'value': '2587',
'children': [
{
'text': 'HQ尚客百貨',
'value': '6975'
},
{
'text': '當(dāng)代商城',
'value': '2622'
},
{
'text': '華星影城',
'value': '2665'
},
{
'text': '雙安商場(chǎng)',
'value': '2720'
}
]
},
...
]
},
...
]
通過(guò)id獲取城市的某個(gè)地區(qū)名稱
#id 必須為城市中某個(gè)地區(qū)的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)
返回結(jié)果 someplace 為北京地區(qū)的對(duì)應(yīng)id的子地區(qū)名稱:
# ID 6975 對(duì)應(yīng)的地區(qū)
HQ尚客百貨
通過(guò)id獲取地區(qū)內(nèi)的所有子地區(qū)信息
from util.city import find_children_regions
from city import City
beijing = City('北京')
beijing.get()
sub_regions = find_children_regions(5956,beijing.locations)
返回結(jié)果 sub_regions 為當(dāng)前id下的所有子地區(qū)id列表:
# id 在城市的子地區(qū)列表中,但其未有子地區(qū),返回:
False
# id 在城市的子地區(qū)列表中, 如果其有子地區(qū)的話則返回子地區(qū)id列表:
['6008']
# id 不在城市的子地區(qū)列表中,則返回城市的一級(jí)子地區(qū):
['17', '5951', '328', '15', '5952', '14', '5950', '9158', '16', '20', '9157']
獲取某個(gè)城市的 熱搜關(guān)鍵詞
from city import City
beijing = City('北京')
beijing.get()
hot = beijing.hot
返回結(jié)果 hot 為當(dāng)前城市“北京”的熱搜詞匯列表(包含其所屬分類id等信息):
[
{
'subtag': '3',
'location': '7',
'maincategoryids': '35,60',
'datatype': '3002',
'id_': '786881',
'suggestkeyword': '溫泉'
},
{
'subtag': '18',
'location': '8',
'maincategoryids': '10',
'datatype': '3002',
'id_': '692874',
'suggestkeyword': '烤鴨'
},
...
]
獲取某個(gè)城市的 當(dāng)前可見(jiàn)有效店鋪分類
from city import City
beijing = City('北京')
beijing.get()
category = beijing.category
返回結(jié)果 category 為該城市所有的店鋪分類信息列表:
[
{
'text': '酒吧',
'value': '133',
'children': [
{
'text': '清吧',
'value': '33950'
},
{
'text': 'Live House',
'value': '33951'
},
{
'text': '夜店',
'value': '2951'
}
]
},
{
'text': '茶館',
'value': '134'
},
...
]
獲取某個(gè)城市的 某個(gè)關(guān)鍵詞相關(guān)的搜索結(jié)果和結(jié)果數(shù)
from city import City
beijing = City('北京')
beijing.get()
relative = beijing.get_relative('健身')
返回結(jié)果 relative 為北京市關(guān)鍵詞“健身”相關(guān)的搜索詞匯以及其對(duì)應(yīng)結(jié)果數(shù):
{
'良子健身 京糧大廈店': '1',
'健身游泳瑜伽綜合性會(huì)所': '1',
'Hey Heroes!私教健身工作室 泛悅坊店': '1',
'ULife悅體健身 五棵松店': '1',
'U-Vista優(yōu)維斯塔健身工作室 金融街旗艦店': '1',
'健身房24小時(shí)': '161',
'健身體驗(yàn)卡': '1',
'銳健身': '29',
'Hot Fitness 熱健身工作室 霍營(yíng)店': '1',
'鍛造健身ForgingFitness國(guó)際私教工作室': '1'
}
(單線程與多線程)搜索某個(gè)城市關(guān)于某個(gè)關(guān)鍵詞的某個(gè)分類、子地區(qū)、排序方式的相關(guān)店鋪并支持MongoDB存儲(chǔ)和本地文件存儲(chǔ)
單線程搜索下載相關(guān)店鋪
下例為搜索下載北京市“海淀區(qū)”店鋪分類為“運(yùn)動(dòng)健身”的“有團(tuán)購(gòu)”的與“器材”相關(guān)的所有店鋪,搜索下載結(jié)果“按人氣排序”,
save表示是否保存進(jìn)MongoDB數(shù)據(jù)庫(kù),details表示是否抓取店鋪的詳細(xì)信息。具體參數(shù)可見(jiàn)search函數(shù)注釋。
from city import City
beijing = City('北京')
beijing.get()
results = beijing.search('器材',category='運(yùn)動(dòng)健身',location='海淀區(qū)',filter='有團(tuán)購(gòu)',sort='按人氣排序',save=True,details=True)
返回結(jié)果 results 為搜索到的相關(guān)店鋪,具體內(nèi)容,單個(gè)店鋪的MongoDB數(shù)據(jù)庫(kù)顯示:
{
'_id' : ObjectId('5c3c88f265b2fd3134266c7b'),
'店名' : '優(yōu)享健身(金源店)',
'星級(jí)' : '四星商戶',
'注冊(cè)時(shí)間' : '2017-07-25T23:19:00',
'地址' : ' 遠(yuǎn)大路世紀(jì)金源燕莎B1層卜蜂蓮花超市內(nèi)南側(cè)家電區(qū)',
'人均' : 3526,
'預(yù)訂' : false,
'分店url' : 'http://www.dianping.com/brands/b93357498s45g45',
'商鋪圖片' : 'http://vfile.meituan.net/joymerchant/-1945301364589883676-23601423-1525363931678.jpg',
'商鋪標(biāo)簽' : '健身房',
'緯度' : 39.9573,
'經(jīng)度' : 116.28518,
'電話' : [
'010-57159188'
],
'店鋪ID' : 93357498,
'會(huì)員卡ID' : 0,
'地區(qū)' : [
'遠(yuǎn)大路'
],
'expand' : 0,
'poi' : 'HEHHURZVVGIDGF',
'promoId' : 0,
'shopDealId' : 27807431,
'shopPower' : 40,
'hasSceneryOrder' : false,
'點(diǎn)評(píng)數(shù)' : '118',
'點(diǎn)評(píng)標(biāo)簽' : [
'環(huán)境優(yōu)雅(43)',
'服務(wù)熱情(17)',
'設(shè)施很贊(15)',
'教練很棒(14)',
'器械齊全(7)',
'體驗(yàn)很棒(7)',
'干凈衛(wèi)生(4)',
'高大上(4)'
],
'點(diǎn)評(píng)類別' : {
'圖片' : '55',
'好評(píng)' : '85',
'中評(píng)' : '7',
'差評(píng)' : '26'
},
'評(píng)分' : {
'設(shè)施' : '8.3',
'環(huán)境' : '8.2',
'服務(wù)' : '7.6'
}
}
多線程搜索下載相關(guān)店鋪
多線程搜索與單線程搜索流程一致,只是搜索線程多開(kāi)了而已,線程數(shù)為搜索結(jié)果的頁(yè)數(shù),最多為50個(gè)(大眾點(diǎn)評(píng)目前單頁(yè)最多個(gè)數(shù))。啟用多線程的話,由于使用代理IP,有可能同時(shí)
獲取的代理多個(gè)線程都是同一個(gè),所以在config.py加入了RANDOM_INTERVAL(隨機(jī)等待間隔)防止多個(gè)線程使用同一個(gè)代理被封。
獲取某個(gè)商鋪的評(píng)分、星級(jí)、地址、電話、點(diǎn)評(píng)數(shù)、人均消費(fèi)、點(diǎn)評(píng)標(biāo)簽、點(diǎn)評(píng)種類等
下例以獲取id為507576的店鋪信息為例
from shop import Shop
store = Shop('507576')
store.get()
#店鋪名
name = store.name
#店鋪星級(jí),50為五星,40為四星,35為三星半
stars = store.stars
#地址
address = store.address
#聯(lián)系方式
phone = store.phone
#點(diǎn)評(píng)數(shù)
reviews = store.reviews
#人均消費(fèi)
average = store.average
#顧客評(píng)分
scores = store.scores
#點(diǎn)評(píng)種類及數(shù)量
comment_kinds = store.comment_kinds
#點(diǎn)評(píng)標(biāo)簽及數(shù)量
review_tags = store.review_tags
返回結(jié)果 :
'滿福樓''50''朝陽(yáng)門外大街8號(hào)藍(lán)島大廈東區(qū)六層(東大橋鐵站D2出口)'''64030992 64053088''18821''128'{'口味': '9.1', '環(huán)境': '9.1', '服務(wù)': '9.1'}{'圖片': '3513', '好評(píng)': '17632', '中評(píng)': '355', '差評(píng)': '95'}['回頭客(404)', '干凈衛(wèi)生(253)', '上菜快(106)', '停車方便(59)', '夜景贊(5)', '請(qǐng)客(161)', '朋友聚餐(93)', '家庭聚餐(44)', '現(xiàn)做現(xiàn)賣(22)', '下午茶(9)']
獲取下載保存某個(gè)商鋪的加密點(diǎn)評(píng)信息,支持條數(shù)設(shè)定
獲取點(diǎn)評(píng)需要使用cookie,具體使用參見(jiàn)“使用前”,默認(rèn)保存數(shù)據(jù)進(jìn)入數(shù)據(jù)庫(kù),具體的參數(shù)詳情參見(jiàn)get_reviews函數(shù)注釋。下例以獲取店鋪id為 507576 的商鋪以第2頁(yè)為起點(diǎn)的 300條加密點(diǎn)評(píng)為例:
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='保存數(shù)據(jù)表名',count=300,frompage=2)
結(jié)果已經(jīng)被存儲(chǔ)在數(shù)據(jù)庫(kù)中,MongoDB數(shù)據(jù)庫(kù)中的單條點(diǎn)評(píng)數(shù)據(jù)內(nèi)容具體為:
{
'_id' : ObjectId('5c3c914e65b2fd3384558c69'),
'點(diǎn)評(píng)ID' : '496225994',
'點(diǎn)評(píng)鏈接' : 'http://www.dianping.com/review/496225994',
'點(diǎn)評(píng)用戶' : '好想吃好',
'用戶ID' : '781396343',
'用戶主頁(yè)' : 'http://www.dianping.com/member/781396343',
'用戶頭像' : 'https://p0.meituan.net/userheadpicbackend/83fe454da66682fcbd43aed7e716f7c5104831.jpg',
'用戶等級(jí)' : 'lv5',
'VIP用戶' : true,
'點(diǎn)評(píng)商鋪' : '滿福樓',
'商鋪ID' : '507576',
'點(diǎn)評(píng)星級(jí)' : '50',
'用戶評(píng)價(jià)' : {
'口味' : '非常好',
'環(huán)境' : '非常好',
'服務(wù)' : '非常好'
},
'點(diǎn)評(píng)時(shí)間' : '2019-01-13 21:17',
'點(diǎn)評(píng)圖片' : [
'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'
],
'評(píng)論事件' : {
'贊' : '4'
},
'點(diǎn)評(píng)內(nèi)容' : '家里的抓到300元代金券,今天到店品嘗美味。乘直梯到六樓,進(jìn)店入眼就是放著小銅鍋的餐桌,才十一點(diǎn)多點(diǎn)兒大廳就幾乎滿員。仨人按大眾點(diǎn)評(píng)的推薦及個(gè)人喜好點(diǎn)了「牛骨高湯」「手切鮮羊肉」「羊上腦」「手切精品鮮黃瓜條」「精品太陽(yáng)肉」仨「羊肉串兒」「糖卷果」肚子實(shí)在沒(méi)地方了,可精品還沒(méi)吃,只好「烤火燒」「炸火燒」「肉沫燒餅」「烤腰子」各點(diǎn)一個(gè),三人分著嘗口兒。點(diǎn)的肉涮著吃沒(méi)一點(diǎn)兒膻味兒,還很嫩,麻醬蘸料很好吃!特別是腰子烤的牛極了,外面包的油焦脆,里面的腰子火候正好,美味!各種火燒也很好吃![服務(wù)]服務(wù)很到位!鍋里剛有點(diǎn)兒沫子,服務(wù)小妹就幫著撇出去,最后還送了果盤,看我們挺愛(ài)吃的,又提示我們果盤還可以續(xù),并送了我們2019年新掛歷,謝謝??!'
}
ToDo
如果想要抓取多個(gè)商鋪的點(diǎn)評(píng)數(shù)據(jù),可以使用多個(gè)賬戶+多代理+UA池來(lái)繞過(guò)反爬
嘗試使用selenium對(duì)爬取點(diǎn)評(píng)數(shù)據(jù)進(jìn)行驗(yàn)證碼滑動(dòng)驗(yàn)證
使用手機(jī)接碼平臺(tái)注冊(cè)多個(gè)賬戶進(jìn)行模擬登陸后獲取cookie進(jìn)行爬取點(diǎn)評(píng)數(shù)據(jù)
(完)
看完本文有收獲?請(qǐng)轉(zhuǎn)發(fā)分享給更多人
關(guān)注「Python那些事」,做全棧開(kāi)發(fā)工程師
聯(lián)系客服