頁面的正確姿勢)
不能否認, 它是相當出色的爬蟲框架, 其借用的是相似的辦法去爬取網(wǎng)頁, 即所爬取的是靜態(tài)頁面, 然而實際情形是, 多數(shù)網(wǎng)站均為動態(tài)的, 我們所見到的正常頁面皆是經(jīng)瀏覽器渲染后的成果, 倘若徑直運用爬取網(wǎng)頁的方式, 極有可能無法獲取到預期的數(shù)據(jù)。一種看似理所當然的辦法, 便是借助自定義, 采用類似于這種模擬瀏覽器行為的途徑, 從而直接獲取到渲染好的html內(nèi)容, 這般做無疑是行得通的, 而且也能夠較為輕易地實現(xiàn)對接, 其存在的欠缺之處在于, 會造成資源消耗的增加。另外存在一種能夠直接抵達本質(zhì)的途徑, 那便是尋找到數(shù)據(jù)的起始源頭, 其中有的借助ajax請求去獲取數(shù)據(jù)源, 有的把數(shù)據(jù)源放置于js代碼里, 借助瀏覽器開發(fā)工具對交互過程予以分析, 當找到數(shù)據(jù)源頭后, 要是屬于ajax請求, 只要直接請求對應(yīng)的接口便可以獲取到數(shù)據(jù), 本文會對數(shù)據(jù)源在js文件中的提取方式進行介紹。舉個例子在此處, 是以某文庫的搜索結(jié)果當作例子的, 要是直接去進行頁面爬取, 那是無法看到下圖里的搜索結(jié)果的, 經(jīng)過對頁面結(jié)構(gòu)加以分析, 發(fā)現(xiàn)源頭數(shù)據(jù)處于腳本之中, 腳本里面大致上就是類似于json的數(shù)據(jù)對象, 只要獲取到j(luò)s腳本的對象數(shù)據(jù), 那就等同于得到了搜索結(jié)果。安裝能夠?qū)s腳本予以解析, 進而獲取其中的數(shù)據(jù)對象, 在此推薦這個庫, 它可以直接把js里的數(shù)據(jù)對象返回, 極為便利, 在使用前需借助pip安裝此庫。要留意的是, 其核心代碼是用c編寫而成, 所以在安裝時要事先安裝c構(gòu)建工具。1. 如果事先沒有安裝c構(gòu)建工具會報錯2. 訪問上面錯誤提示中的鏈接下載c構(gòu)建工具并安裝安裝成功之后再次執(zhí)行pip 安裝成功shellShell能夠運用交互形式迅速驗證用于提取數(shù)據(jù)的代碼, 并非要一次次去運行爬蟲進行驗證, 極為高效, 接下來就要演示怎樣借助shell將js中的數(shù)據(jù)提取出來。啟動 shellscrapy shell https://wenku.baidu.com/search?wordpythonlm0od0frtop_homeieutf-8_wkts_1711155481643wkQuerypython根據(jù)返回的結(jié)果而言, 已然獲取到所爬取的頁面內(nèi)容, 緊接著主要會以其進行數(shù)據(jù)提取。我們已然清楚數(shù)據(jù)源處于內(nèi)里, 徑直運用.css()能夠獲取全部的, 我們所需求的是第二個當中的腳本。從中直接取出js腳本, 通過.css(::text)來進行獲取。最后就是導入庫執(zhí)行js代碼并獲取返回的數(shù)據(jù)對象import chompjs data chompjs.parse_js_object(js_code)data屬于dict字典對象, 所需的數(shù)據(jù)處于‘’這個鍵當中, 到這里, 便成功完成啦。我來做個簡單總結(jié), 我覺得運用寫爬蟲根本沒必要用到像這般的模擬瀏覽器下載器, 解決之道是尋找到數(shù)據(jù)的源頭, 沒有數(shù)據(jù)源的話動態(tài)網(wǎng)站也就沒辦法進行渲染了。然而, 此處遺漏了一個關(guān)鍵的環(huán)節(jié), 那便是登錄, 不同的平臺登錄機制存在差異, 形形色色的驗證碼令人煩擾, 直接對抗極有可能撞得頭破血流, 所以我不提議將登錄部分編寫在爬蟲之中, 一種更為優(yōu)良的方案是單獨去開發(fā)一個池服務(wù), 池服務(wù)承擔著管理所有平臺用戶登錄的職責, 對于無法自動登錄的情況就提供手工登錄加以解決, 并且通過 web api 來提供隨機獲取的功能, 借助調(diào)用池的 api 來達成模擬已登錄用戶狀態(tài)的目的。