【爬蟲成長(zhǎng)之路】(五)【大眾點(diǎn)評(píng)】瀏覽器掃碼登錄+油猴直接爬取數(shù)據(jù)

本系列文章共十篇:

【爬蟲成長(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ù):

  1. 指定城市的店鋪列表及其評(píng)分?jǐn)?shù)據(jù)
  2. 指定店鋪下的用戶評(píng)論數(shù)據(jù)

一、需求分析

這一篇總共需要爬取兩個(gè)頁(yè)面的數(shù)據(jù),分別是:

  1. 某城市的店鋪列表頁(yè)面
  2. 某店鋪的評(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é)果:

油猴插件獲取到的店鋪數(shù)據(jù)
油猴插件獲取到的評(píng)論數(shù)據(jù)

六、優(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ù) -

注:

  1. 如果您不希望我在文章提及您文章的鏈接,或是對(duì)您的服務(wù)器造成了損害,請(qǐng)聯(lián)系我對(duì)文章進(jìn)行修改;
  2. 本文僅爬取公開數(shù)據(jù),不涉及到用戶隱私;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容