本系列文章共十篇:
【爬蟲成長(zhǎng)之路】(一)爬蟲系列文章導(dǎo)讀
【爬蟲成長(zhǎng)之路】(二)各篇需要用到的庫(kù)和工具
【爬蟲成長(zhǎng)之路】(三)【大眾點(diǎn)評(píng)】selenium爬蟲
【爬蟲成長(zhǎng)之路】(四)【大眾點(diǎn)評(píng)】selenium登錄+requests爬取數(shù)據(jù)
【爬蟲成長(zhǎng)之路】(五)【大眾點(diǎn)評(píng)】瀏覽器掃碼登錄+油猴直接爬取數(shù)據(jù)
【爬蟲成長(zhǎng)之路】(六)【大眾點(diǎn)評(píng)】mitmproxy中間人代理爬蟲
【爬蟲成長(zhǎng)之路】(七)【大眾點(diǎn)評(píng)】PC微信小程序+requests爬取數(shù)據(jù)
【爬蟲成長(zhǎng)之路】(八)【大眾點(diǎn)評(píng)】安卓APP爬蟲
本文需要用到的工具:瀏覽器
F12控制臺(tái)
本文需要用到的庫(kù):無(wú)
爬取目標(biāo)數(shù)據(jù):
- 指定城市的店鋪列表及其評(píng)分?jǐn)?shù)據(jù)
- 指定店鋪下的用戶評(píng)論數(shù)據(jù)
一、需求分析
這一篇總共需要爬取兩個(gè)頁(yè)面的數(shù)據(jù),分別是:
- 某城市的
店鋪列表頁(yè)面 - 某店鋪的
評(píng)論列表頁(yè)面
二、獲取目標(biāo)頁(yè)面的URL
這里與前面獲取的URL稍有不同,不需要用到登錄的URL了,只需要編寫能夠匹配店鋪?lái)?yè)面和評(píng)論頁(yè)面的URL即可,如下:
# 這樣就能夠匹配到點(diǎn)評(píng)的全部頁(yè)面了
// @match http://www.dianping.com/*
三、分析文檔結(jié)構(gòu),使用油猴插件提取數(shù)據(jù)
這里需要簡(jiǎn)單的JS語(yǔ)法知識(shí),在前端就可以將要獲取的數(shù)據(jù)提取出來(lái),后端就只進(jìn)行接收操作就好了。如果不知道如何編寫油猴插件的話,可以去學(xué)一下怎么寫油猴插件,這個(gè)會(huì)JS的話很快就能上手了。
四、編寫程序
這里由于是使用油猴插件,所以操作起來(lái)幾乎和人在操作一樣,服務(wù)器后臺(tái)無(wú)法察覺(jué)出來(lái),所以只要頻率不太快,幾乎不會(huì)存在反爬的問(wèn)題,這種方式編寫的爬蟲能夠爬取任何WEB頁(yè)面,但缺點(diǎn)就是速度比較慢,和selenium一樣,都需要瀏覽器的介入才能完成爬取。
在前端獲取到數(shù)據(jù)后,可以傳遞到后臺(tái)進(jìn)行處理,這里就不提供后端程序的代碼了,比較簡(jiǎn)單,搭建一個(gè)簡(jiǎn)單的服務(wù)就好了。
油猴插件代碼:
// ==UserScript==
// @name dianping_spider
// @namespace http://tampermonkey.net/
// @version 0.1
// @description 爬取大眾點(diǎn)評(píng)店鋪信息和用戶評(píng)論
// @author keep1234quiet
// @match http://www.dianping.com/*
// @match http://www.dianping.com/shop/*
// @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @require https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js
// @run-at document-idle
// @grant GM_xmlhttpRequest
// ==/UserScript==
(function() {
'use strict';
console.log("點(diǎn)評(píng)爬蟲插件啟動(dòng)成功!");
var shop_page = document.getElementsByClassName("txt");
var review_page = $(".review-list-main");
var page,data,score;
if(shop_page.length != 0){ // 判斷是否是店鋪詳情頁(yè)
console.log("當(dāng)前頁(yè)面:店鋪列表頁(yè)");
page = "shop";
var shop_list = [];
for (var i = shop_page.length - 1; i >= 0; i--) {
var shop = shop_page[i];
var shopname = shop.getElementsByTagName("h4")[0].innerText;
score = shop.getElementsByClassName("star_score")[0].innerText;
shop_list.push({'name': shopname, 'score': score});
}
data = {"page": page, "data":shop_list};
console.log(shop_list);
}
else if(review_page){ // 判斷是否是評(píng)論頁(yè)
console.log("當(dāng)前頁(yè)面:評(píng)論頁(yè)");
page = "comment";
var comment_list = []; // 存放當(dāng)前頁(yè)提取的的評(píng)論信息
var userlist = $(".reviews-items>ul>li");
for (var i = userlist.length - 1; i >= 0; i--) {
var user = userlist[i];
var username = user.getElementsByClassName("dper-info")[0].innerText;
var item_list = user.getElementsByClassName("score")[0].getElementsByClassName("item");
score = [];
for (var j = item_list.length - 1; j >= 0; j--) {
score.push(item_list[j].innerText);
}
var content = user.getElementsByClassName("review-words")[0].innerText.trim();
comment_list.push({'username':username, 'score': score, 'content': content});
}
data = {"page": page, "data": comment_list};
console.log("comment_list=",comment_list);
}
else{
page = "unkown";
console.log("unkown page");
}
//setInterval(refresh, 1000*30);//30s 刷新一次
function refresh()
{
window.location.reload();
}
var sleep = function(time) {
var startTime = new Date().getTime() + parseInt(time, 10);
while(new Date().getTime() < startTime) {}
};
GM_xmlhttpRequest({
method:'POST',
url:"http://127.0.0.1:8000/index/?name=spider",
data:JSON.stringify(data),
dataType:"json",
headers:{
"Content-Type":"application/json"
},
onload:function(response){
var next_url = response.responseText;
sleep(3000);
//window.location.href = next_url;
//window.location.reload(next_url);
}
});
console.log("刷新成功");
})();
五、程序運(yùn)行結(jié)果
安裝好油猴插件,并將代碼寫入腳本中,瀏覽器打開店鋪列表頁(yè)面和用戶評(píng)論頁(yè)面就會(huì)自動(dòng)爬取了,如果要做批量爬取,需要自己再修改下程序。
以下是程序運(yùn)行結(jié)果:


六、優(yōu)缺點(diǎn)分析
| 序號(hào) | 優(yōu)點(diǎn) | 缺點(diǎn) |
|---|---|---|
| 1 | 程序編寫簡(jiǎn)單 | 運(yùn)行速度慢 |
| 2 | 幾乎沒(méi)有反爬問(wèn)題,不用構(gòu)造參數(shù) | - |
注:
- 如果您不希望我在文章提及您文章的鏈接,或是對(duì)您的服務(wù)器造成了損害,請(qǐng)聯(lián)系我對(duì)文章進(jìn)行修改;
- 本文僅爬取公開數(shù)據(jù),不涉及到用戶隱私;