爬蟲讓我再次在女同學面前長臉了~(現實版真實案例)

qwer1030274531發表於2020-09-25

1. 文章背景:

鑑於這幾天掉髮情況,想著週末是多休息的啦,睡午覺的時候被微信滴滴來信給吵醒了,拿來一看,是那個女同學哦,簡單看了一下,她主要表達的意思就是:“你能不能幫我 x x x x x x x ?(省略幾百個字)”,身為一個男同學,你能說你不能嘛? m(o_ _)m
在這裡插入圖片描述

2. 前言:

簡單介紹一下  “需求” ,她希望我幫忙在 “下載一批次的試題以及答案,如

在這裡插入圖片描述


3. 爬蟲

瞭解到要實現的東西之後,就可以對網頁進行解剖了,下面是具體步驟。

1.瀏覽器抓包
在這裡插入圖片描述

2.瞭解傳遞的引數

在瀏覽器抓包中我們看不到實際傳遞了哪些引數(unable to decode value),因此這裡可以使用 Fiddler 進行抓包或者使用下面的一種方式,任意一種都行,看你喜歡了… 在這裡插入圖片描述

然後使用文字框貼上剛才複製的內容:

curl '\
  -H 'Connection: keep-alive' \
  -H 'Cache-Control: max-age=0' \
  -H 'Upgrade-Insecure-Requests: 1' \
  -H 'Origin: \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36' \
  -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9' \
  -H 'Sec-Fetch-Site: same-origin' \
  -H 'Sec-Fetch-Mode: navigate' \
  -H 'Sec-Fetch-User: ?1' \
  -H 'Sec-Fetch-Dest: document' \
  -H 'Referer: \
  -H 'Accept-Language: zh-CN,zh;q=0.9,zh-TW;q=0.8,en-US;q=0.7,en;q=0.6' \
  --data-raw 'KeyWord=%C2%ED%BF%CB%CB%BC%D6%F7%D2%E5&monthHidden=%C8%AB%B2%BF&month=&yearHidden=%C8%AB%B2%BF&year=' \
  --compressed12345678910111213141516

留意一下倒數第二行  KeyWord=%C2%ED%BF%CB%CB%BC%D6%F7%D2%E5
結合瀏覽器抓包06瞭解到Keyword,這裡其實就是上面搜尋傳遞的內容啦!!!

3.如何傳遞分頁

來到這裡我們就能獲取一頁的列表資料了,那麼獲取第二頁傳遞什麼引數呢?點選  下一頁 然後觀察抓包情況

如上,url 發生了一點點變化了, 新增了一個引數page,也就是說page=2代表第2頁

翻頁也不成問題了,那就看看如何獲取內部的下載連結吧~

4.查詢下載連結

隨便點選一個連結進如試題詳情頁如下:
https://www.zikao365.com/shiti/download-427-16827.html

在這裡插入圖片描述

原本我打算高高興興的點選 “立即下載” 的,結果發現需要登入
真的是好事多磨啊~~

在這裡插入圖片描述

擺在眼前只有三條路

  1. 找女同學要一個賬號,點選一下看看什麼情況
  2. 自己註冊一個賬號,但是太麻煩了
  3. 嘗試繞開登入驗證,直接下載(很明顯我選擇第三種)

因為一般 超連結 點選了都是直接跳轉的,如果沒有直接跳轉,那就說明禁用了 href 屬性,並且重寫onclick事件,帶著這種前提意識開啟 F12 > Elements 觀察原始碼

在這裡插入圖片描述

OK~~ 來到這裡對自考365的整體列表資料以及詳情資料的下載檔案都有了一個整體的瞭解,那就可以著手編碼啦!!

程式碼實現較簡單 我這裡就全部貼出來

public static void main(String[] args) throws Exception {
    HttpClient httpClient = HttpClient.buildHttpClient();
    String urlTemplate = "{page}&KeyWord=${KeyWord}";
    String url = null;
    for (int i = 1; i < 6; i++) {
        // 第一頁開始
        url = urlTemplate.replace("${page}", i + "");
        url = url.replace("${KeyWord}", "%C2%ED%BF%CB%CB%BC%D6%F7%D2%E5");
        // 這裡我竟然直接使用 GET 也是可以的 ( 我當時是忘記了抓包是 POST ,直接寫了GET, 可以,那就更加方便了)
        Request request = httpClient.buildRequest(url).GET();
        Response<String> response = request.execute(BodyHandlers.ofString(Charset.forName("gbk")));
        log.debug("response: [{}]", response.getBody());
        // 把html解析為一個Document
        Document document = Jsoup.parse(response.getBody());
        // 獲取每一頁的試題超連結
        Elements a = document.select(".bot.clearfix li > a");
        List<String> hrefs = a.stream().map(v -> v.attr("href")).collect(Collectors.toList());
        for (String href : hrefs) {
            // 這裡相當於點選進入具體的試題超連結
            response = httpClient.buildRequest(href).execute(BodyHandlers.ofString(Charset.forName("gbk")));
            String html = response.getBody();
            // 解析每一個試題內部的document
            document = Jsoup.parse(html);
            // 獲取當前試題的標題
            String title = document.selectFirst(".main div > h1").text();
            // 手動字串切割獲取檔案的path
            String[] scripts = StringUtils.substringsBetween(html, "<script", "</script>");
            String path = Arrays.stream(scripts).filter(v -> v.contains("addClick") && v.contains("path")).findFirst().get();
            path = path.substring(path.indexOf("path") + 4);
            path = path.replaceAll("'", "\"");// 這裡是為了統一 ' 轉為 " , 避免個別頁面使用的是' 如: var path = '
            path = path.substring(path.indexOf("\"") + 1);
            path = path.substring(0, path.indexOf("\""));
            // 獲取檔案的字尾
            String suffix = path.substring(path.lastIndexOf("."));
            log.info("title:[{}], path: [{}], suffix: [{}]", title, path, suffix);
            // 執行下載檔案到本地目錄
            // 也可以使用 commons.io 的工具類下載, 如: FileUtils.copyURLToFile(new URL(path), Paths.get("C:\\Users\\houyu\\Desktop\\馬克思主義", title + suffix).toFile());
            httpClient.buildRequest(path).execute(BodyHandlers.ofFile(Paths.get("C:\\Users\\houyu\\Desktop\\馬克思主義", title + suffix)));
        }
    }}1234567891011121314151617181920212223242526272829303132333435363738394041

說明:這裡列舉一下使用到幾個類庫或者工具類

4. 下載

日誌:
在這裡插入圖片描述

下載之後的檔案如下,共108個:
在這裡插入圖片描述

5. 最後

當我把這108個檔案發給哪位那個女同學的時候…

在這裡插入圖片描述


你想學呀 我叫你呀,從此就可以有正當理由聊了呀,你是否遇到你這樣子的女同學呢 ?
在這裡插入圖片描述


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30239065/viewspace-2724062/,如需轉載,請註明出處,否則將追究法律責任。

相關文章