1. 程式人生 > >利用WebMagic的Cookie機制進行頁面爬取

利用WebMagic的Cookie機制進行頁面爬取

目前釋出的WebMagic的最新版本仍然不支援post請求模擬登陸來抓取頁面,但是相信,在後續的版本中,肯定會支援這項功能。那麼要抓取登陸後才能看到的頁面怎麼辦?

一、使用者自己傳送post請求,將獲取的cookie設定到Spider中

二、使用者使用抓包工具將抓到的cookie設定到Spider中

本文只討論第二種方式,第一種方式的抓取,博主會在後續的部落格中實現


本文抓取慕課網登陸後的個人資訊設定頁面,此個人資訊設定頁面要登入成功之後才能訪問。


1)登入慕課網時,用瀏覽器的開發者工具對瀏覽器進行抓包。

      獲取cookie資訊如下,將該cookie資訊記下


2)分析抓取頁面。

我們要抓取的頁面如下。注意,這個頁面是隻有使用者成功登入後才能訪問的。為簡單起見,這個demo只抓取此頁面的個性籤 名資訊,以表示爬蟲可以成功對此頁面進行抓取。

 

 

3)編寫PageProcessor

    public class MoocProcessor implements PageProcessor {
        private Site site = new Site().setRetryTimes(3).setSleepTime(100)
                //新增cookie之前一定要先設定主機地址,否則cookie資訊不生效
                .setDomain("www.imooc.com")
                //新增抓包獲取的cookie資訊
                .addCookie("Hm_lpvt_f0cfcccd7b1393990c78efdeebff3968", "1466776143")
                .addCookie("Hm_lvt_f0cfcccd7b1393990c78efdeebff3968", "1466755724,1466775709")
                .addCookie("PHPSESSID", "c3i1dfva2mu4hc22m3m1pg65k0")
                .addCookie("apsid",
                        "ExYjQ0ODhjN2IyNmY3ZTBlNWZhNDJhNTllNmQ1MmMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMTM1MDUzOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5OTU0NjIyMjZAcXEuY29tAAAAAAAAAAAAAAAAAAAAAGE2NDI5ZDM5OTgyN2I3MDY1MTNjNGU4ZWY2NWNkNjgxXTptV106bVc%3DND")
                .addCookie("cvde", "576d389dcceca-14").addCookie("imooc_isnew", "1")
                .addCookie("imooc_isnew_ct", "1466755723").addCookie("imooc_uuid", "49b7a51b-8451-4fb3-bcc8-9c27409519bf")
                .addCookie("last_login_username", "此處為使用者名稱").addCookie("loginstate", "1")
                //新增請求頭,有些網站會根據請求頭判斷該請求是由瀏覽器發起還是由爬蟲發起的
                .addHeader("User-Agent",
                        "ozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36 Core/1.47.516.400 QQBrowser/9.4.8188.400")
                .addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8")
                .addHeader("Accept-Encoding", "gzip, deflate, sdch").addHeader("Accept-Language", "zh-CN,zh;q=0.8")
                .addHeader("Connection", "keep-alive").addHeader("Referer", "http://www.imooc.com/");
     
        @Override
        public void process(Page page) {
            page.putField("aboutme", page.getHtml().xpath("//textarea[@id='aboutme']/text()").toString());
        }
     
        @Override
        public Site getSite() {
            return site;
        }
     
    }


4)編寫測試用例

    public class Test {
        public static void main(String[] args) {
            Spider.create(new MoocProcessor())
                    // 從"http://www.imooc.com/user/setprofile"開始抓
                    .addUrl("http://www.imooc.com/user/setprofile").addPipeline(new ConsolePipeline())
                    // 開啟5個執行緒抓取
                    .thread(1)
                    // 啟動爬蟲
                    .run();
        }
    }


5)測試結果


6)我們把新增cookie的程式碼去掉

    public class MoocProcessor implements PageProcessor {
        private Site site = new Site().setRetryTimes(3).setSleepTime(100)
                //新增cookie之前一定要先設定主機地址,否則cookie資訊不生效
                .setDomain("www.imooc.com")
                //新增抓包獲取的cookie資訊
    //            .addCookie("Hm_lpvt_f0cfcccd7b1393990c78efdeebff3968", "1466776143")
    //            .addCookie("Hm_lvt_f0cfcccd7b1393990c78efdeebff3968", "1466755724,1466775709")
    //            .addCookie("PHPSESSID", "c3i1dfva2mu4hc22m3m1pg65k0")
    //            .addCookie("apsid",
    //                    "ExYjQ0ODhjN2IyNmY3ZTBlNWZhNDJhNTllNmQ1MmMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMTM1MDUzOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5OTU0NjIyMjZAcXEuY29tAAAAAAAAAAAAAAAAAAAAAGE2NDI5ZDM5OTgyN2I3MDY1MTNjNGU4ZWY2NWNkNjgxXTptV106bVc%3DND")
    //            .addCookie("cvde", "576d389dcceca-14").addCookie("imooc_isnew", "1")
    //            .addCookie("imooc_isnew_ct", "1466755723").addCookie("imooc_uuid", "49b7a51b-8451-4fb3-bcc8-9c27409519bf")
    //            .addCookie("last_login_username", "995462226%40qq.com").addCookie("loginstate", "1")
                //新增請求頭,有些網站會根據請求頭判斷該請求是由瀏覽器發起還是由爬蟲發起的
                .addHeader("User-Agent",
                        "ozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36 Core/1.47.516.400 QQBrowser/9.4.8188.400")
                .addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8")
                .addHeader("Accept-Encoding", "gzip, deflate, sdch").addHeader("Accept-Language", "zh-CN,zh;q=0.8")
                .addHeader("Connection", "keep-alive").addHeader("Referer", "http://www.imooc.com/");
     
        @Override
        public void process(Page page) {
            page.putField("aboutme", page.getHtml().xpath("//textarea[@id='aboutme']/text()").toString());
        }
     
        @Override
        public Site getSite() {
            return site;
        }
     
    }


7)去掉cookie之後的測試結果,抓取到的資訊為空

5)和7)證明此網頁只有登入後才能訪問,需要新增cookie後爬蟲才可以對該網頁進行爬取
9