數據采集實戰(四)-- 線性代數習題答案下載


1. 概述

前段時間在看一本很多人推薦的線性代數教材《線性代數應該這樣學》第三版,這一版每個章節都有大量的習題。

官方網站上雖然按照章節提供了習題的答案,一來因為網站是國外的,訪問不流暢,二來答案中還夾雜着廣告,影響查看。
所以,想試着將答案爬取下來制作成pdf,查看起來方便,也不會受網絡的影響。

2. 采集流程

只是獲取網頁比較簡單,沒什么好說的,這里和前幾篇數據采集實戰不一樣的地方在於:

  1. 網頁中有數學公式,這些公式通過前端js的轉換才能正常顯示,所以從html中直接獲取DOM內容是沒用的,要獲取所有html元素
  2. 獲取網頁之后要去除不必要的元素(比如網頁中的header,footer,menu,廣告等等),然后再保存網頁,也就是采集網頁局部內容

image.png
綠色背景的部分是通過puppetter來完成的。
藍色背景的部分在采集之后通過PDF相關的命令行小工具來完成。

2.1 去除網頁中元素(綠色背景部分)

    await page.evaluate(() => {
      const domToRemove = [
        "#top-bar-wrap",
        "#site-header",
        "#main> .page-header",
        "#content > article > ul",
        "#content > article > .entry-content > center",
        "#content > article > .entry-content > .google-auto-placed",
        "#content > article > .entry-content > #amzn_assoc_ad_div_adunit0_0",
        "#content > article > .entry-content > #related_posts",
        ".post-tags",
        "nav",
        "section",
        ".addthis-smartlayers",
        "#right-sidebar",
        "footer",
      ];
      for (let j = 0; j < domToRemove.length; j++) {
        const doms = document.querySelectorAll(domToRemove[j]);
        for (let k = 0; k < doms.length; k++) {
          // !!!這一步是關鍵,將自己從DOM樹中刪除
          doms[k].parentNode.removeChild(doms[k]);
        }
      }
    });

    // 網頁保存成html文件,為了后面可以轉換成pdf
    await savePage(
      page,
      "./output/linearAlgebraExercises",
      exercies[i] + ".html"
    );

2.2 生成PDF文檔(藍色背景部分)

將html文件轉成pdf的工具很多,python和nodejs有很多這種庫,選擇一種你熟悉的都可以。
我用的 pandoc,轉換效果還不錯!數學公式都可以正確顯示。

# 轉換html的命令示例
pandoc input.html -t latex -o output.pdf

顯示效果如下:
image.png

合並多個pdf也有很多小工具,我使用的是 pdftk。

# 合並pdf的命令示例
pdftk input1.pdf input2.pdf input3.pdf cat output output.pdf

3. 總結

整個流程很簡單,唯一值得說的技術點可能就是在獲取網頁時,實時的去除了不必要的部分。

雖然很簡單,但是整個流程是完備的,對它的細節進行一些完善之后,其實就是一個自動制作電子書的過程。

4. 注意事項

爬取數據只是為了研究學習使用,本文中的代碼遵守:

  1. 如果網站有 robots.txt,遵循其中的約定
  2. 爬取速度模擬正常訪問的速率,不增加服務器的負擔
  3. 只獲取完全公開的數據,有可能涉及隱私的數據絕對不碰


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM