手機打字不想打太多
一般瀏覽器打開頁面可以分成幾個步驟:
1. 請求 HTML
2. 解析 HTML 並下載 assets (img, css, js)
3. 執行 js
4. 渲染 DOM
之後就是一直 3 4 按需執行,有動態內容可能還會有 2
當然,實際上的渲染執行步驟比這複雜的多
Selenium 等爬蟲最早是透過訂製的 Chromium 在不同階段
存取頁面中的 DOM,本質上還是一個瀏覽器在讀取-解析-執行
後來有穩定 API 與 headless 模式以後,Chrome/Chromium/
Firefox 等等主流瀏覽器幾乎都能被直接驅動
扯遠了,你說得 requests 應該是指 Python 的 Requests
函式庫?那它只有執行上面提到的 1,什麼東西都拿不到
是正常的。現代網頁開發已走向 SPA/前後端分離,你打開
網頁只有給你一個骨架與 js 去執行動態內容,所以你必須
執行上面說的 234 才能得到最終使用者看到的內容。
一般來說寫爬蟲要快都是去拆 API 來看,不是很複雜的
內容就是自己模擬請求直戳 API,在沒有公開 API 文件的
情況下就有如逆向工程般麻煩。你必須知道他的 session
登入端點在哪,用 cookie session 還是 JWT 還是自行開發,
之後所有請求都要帶登入驗證 token。然後你還要知道戳
哪支 API 才會取得你要的內容,看是 JSON 還是 XML
還是其他奇奇怪怪格式,解析完才能用取得的資料。
次一級是用輕量級的 browser emulator 去模擬瀏覽器產生
DOM,再去爬模擬的 DOM 內容。因為原生語言優勢,
這種通常都是直接寫 Node.js 配 jsdom 去執行。
這邊必須要注意瀏覽器內的 js 是在沙箱內執行的,可以用
的 API 很少,但用 nodejs 執行外部來源的 js 就要注意
RCE 等安全問題。
最後就是 Selenium 這種用真正的瀏覽器跑頁面渲染,
相容性最好也安全,任意的 js 程式碼被瀏覽器包裝在
瀏覽器內部,不至於輕易爆破主機,只是速度也最慢。
再來就是看它會不會彈出一個瀏覽器視窗,如果會的話
代表你沒有開 headless mode,有開速度也會快不少...
註:先聲明我不會寫 python,沒用過 Selenium,
一路走來用過 PhantomJS、cheerio、puppeteer
直到現在的 jsdom