爬get接口_网络字体反爬之起点中文小说
前幾天跟同事聊到最近在看什么小說,想起之前看過一篇文章說的是網絡十大水文,就想把起點上的小說信息爬一下,搞點可視化數據看看。這段時間正在看爬蟲框架-pyspider,覺得這種網站用框架還是很方便的,所以今天就給大家帶來這篇---起點中文網小說爬取。可視化我們放到下一集。
安裝使用
安裝和基本使用請查看pyspider中文文檔,我們這篇主要不是介紹pyspider哦。Mac安裝的過程中出現了一些問題,請看Mac安裝pycurl失敗,裝好以后使用pyspider all啟動。然后打開瀏覽器輸入:http://localhost:5000/
創建以后,我們就開始分析并編寫起點爬蟲了。
爬蟲編寫
打開起點中文網(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處理
看到打印的結果了嗎?只不過對應的數字變成了英文,我們自己定義一個字典對應一下就行了
字體搞定了,那最初我們需要的數據都有了
調試成功了,啟動我們的工程抓取吧
接下來是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函數源碼中看到
taskid是url的md5碼,而且在crawl的參數中如果傳遞了taskid,那么它就不會自動生成taskid了,那就到我靈機一動的時候了
在crawl中傳入taskid參數,這個參數可以搞一個整型每次都加1,這樣taskid就不會重復了,這樣我們訪問起點每頁小說數據的時候可以過濾重復的,訪問我們的字體信息時就不會過濾了,滿足了需求,beautiful!!!
那么本次爬取就結束了,數據有了下次我們再搞可視化,這次主要是想讓大家了解一下網絡字體反爬,你get到了嗎?
這一篇寫的可能有些人看不太明白,要說明一下這篇主要是想告訴大家網絡字體反爬的概念,所以其他的描述基本一筆帶過,因為這個靜態網頁爬取很簡單,也沒什么好詳細說的。之后有時間的話可以就爬蟲基礎單獨出一系列文章。
總結
以上是生活随笔為你收集整理的爬get接口_网络字体反爬之起点中文小说的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 什么函数获取ip,在PHP中获取
- 下一篇: 环信SDK 踩坑记webIM篇(三)