網絡字體反爬之pyspider爬取起點中文小說

前幾天跟同事聊到最近在看什麼小說,想起以前看過一篇文章說的是網絡十大水文,就想把起點上的小說信息爬一下,搞點可視化數據看看。這段時間正在看爬蟲框架-pyspider,以爲這種網站用框架仍是很方便的,因此今天就給你們帶來這篇---起點中文網小說爬取。可視化咱們放到下一集。html

安裝使用

安裝和基本使用請查看pyspider中文文檔,咱們這篇主要不是介紹pyspider哦。Mac安裝的過程當中出現了一些問題,請看Mac安裝pycurl失敗,裝好之後使用pyspider all啓動。而後打開瀏覽器輸入:http://localhost:5000/

建立之後,咱們就開始分析並編寫起點爬蟲了。python

爬蟲編寫

打開起點中文網(https://www.qidian.com/),選擇所有做品並按照字數排序

右鍵檢查元素,由於是靜態網頁,因此咱們就直接解析網頁元素就好了,可使用BeautifulSoup、PyQuery、xpath或者正在表達式。我習慣用xpath,因此就採這個坑了。

Chrome可自動生成xpath

可是生成的大部分狀況下都不是很合適,好比/html/body/div[2]/div[5]/div[2]/div[2]/div/ul/li[1]/div[2]/h4/a,你看這有多長,仍是本身寫吧,chrome瀏覽器能夠幫咱們驗證xpath這個是很方便的,有的人是按照xpathhelper插件,我以爲原生就很好用了, CTRL+F

按照此方式咱們匹配到小說名、做者、更新狀態、更新時間、字數信息而後存儲到數據庫。

pyspider這個可視化調試的功能確實很是方便,可是咱們看到了什麼?框框?字數居然是框框?我就懵逼了

網頁元素裏看到的居然也是這個???我不死心,再看看網頁源碼

好像有些什麼編碼,可是爲何xpath查出來的是框框的,我百思不得騎姐,試了各類方式發現確實是方框,腫麼辦捏?我考慮能夠把獲取到的元素的html源碼打印出來,而後再提取一下,是否是能夠呢?

OK,獲得咱們須要的數據了,可是這也不是小說字數呀,這就是我寫這篇文章的緣由了,咱們看到上面元素查看截圖中的font-face了,裏面有一些.ttf、.woff,這些咱們應該知道是字體文件,下載下來看一下

這究竟是什麼鬼?不明白,那就問谷哥和度姐吧,而後我就知道了字體反爬這個概念,漲姿式呀!我明白了一個道理,要想漲姿式,就得多嘗試,否則你怎麼能知道還有這種姿式呢?個人意思你們都懂吧,而後我就找到了fonttools這個python庫,可是仍是走了不少彎路,裏面提供的命令行識別不了,最後仍是經過源碼調試找到了getBestCmap這個接口

下載woff字體文件,而後經過BytesIO轉化爲內存文件,使用TTFont處理

看到打印的結果了嗎?只不過對應的數字變成了英文,咱們本身定義一個字典對應一下就好了

字體搞定了,那最初咱們須要的數據都有了
chrome


調試成功了,啓動咱們的工程抓取吧數據庫

接下來是pyspider的坑(主要仍是不熟悉)
首先要存儲數據,咱們把detail_page函數最後的print換成return就好了,在pyspider的爬蟲回調函數中,return的數據將會記錄在默認數據庫中,默認數據庫在哪裏?pyspider會建立一個data目錄,以Mac爲例在~/data/result.db

咱們在界面上看到的數據都記錄在這裏,我在調試的過程當中發現想要刪除已建立的工程很是麻煩,網上搜到的都是把group改爲delete,status改爲stop,而後24個小時候會刪除,能夠經過修改配置時間來刪除,可是很麻煩,咱們直接在數據庫裏刪除豈不是更方便瀏覽器


還有一個task.db和result.db,result的就是咱們return之後裏面會寫入數據微信


result字段裏面就是咱們return的值,task.db裏面是咱們每次訪問的時候記錄的url信息,爲何嘞?pyspider中有一個很方便的功能,就是過濾已爬取的網頁網絡


這個age配置的意思就是10天內再遇到這個任務就會忽略掉,因此咱們在上面一個網頁中獲取其餘的網頁連接進行訪問的時候,不用擔憂會循環訪問。可是,這裏又出現了另一個問題框架


咱們最後是經過先訪問字體連接,而後解析字數,再進行存儲,我原本覺得起點的文字字體是每次請求的時候隨機生成的,每次都不同,結果後來發現總共也就生成了五種,這就出現了一個問題,一樣的請求不會被訪問,也就是當第二次出現這個字體文件的時候,咱們的請求不會被處理,那麼就無法解析存儲了,我在網上查了怎麼去除這個請求的過濾限制,沒找到,多是我沒檢索到有效信息吧。可是發現一個有用的信息,pyspider是經過taskid來判斷重複的,就是咱們在task.db中看到的taskid

這個taskid是怎麼來的呢?咱們在crawl函數源碼中看到curl



taskid是url的md5碼,並且在crawl的參數中若是傳遞了taskid,那麼它就不會自動生成taskid了,那就到我靈機一動的時候了ide


在crawl中傳入taskid參數,這個參數能夠搞一個整型每次都加1,這樣taskid就不會重複了,這樣咱們訪問起點每頁小說數據的時候能夠過濾重複的,訪問咱們的字體信息時就不會過濾了,知足了需求,beautiful!!!

那麼本次爬取就結束了,數據有了下次咱們再搞可視化,此次主要是想讓你們瞭解一下網絡字體反爬,你get到了嗎?


若是你以爲個人文章還能夠,能夠關注個人微信公衆號:Python爬蟲實戰之路
也能夠掃描下面二維碼,添加個人微信號
公衆號

微信號

相關文章
相關標籤/搜索