【Python3爬蟲】網路小說更好看?十四萬條書籍資訊告訴你
一、前言簡述
因為最近微信讀書出了網頁版,加上自己也在閒暇的時候看了兩本書,不禁好奇什麼樣的書更受歡迎,哪位作者又更受讀者喜歡呢?話不多說,爬一下就能有個瞭解了。
二、頁面分析
首先開啟微信讀書:https://weread.qq.com/,往下拉之後可以看到有榜單推薦,而且顯示總共有25個榜單,有的榜單隻有幾百本,有的榜單卻有幾萬本書。
開啟“文學藝術榜”,可以看到一頁顯示了20條書本資訊,下拉之後很容易就能發現這些書本資訊是通過 AJAX 來載入的。
更關鍵的是,要獲取這些書籍資訊,只需要得到分類 ID 和引數 maxIndex。不過測試發現,每個分類只會返回50個頁面的內容,也就是最多一千條書本資訊。那麼,如果只有這25個類別的榜單,能得到的資料還是有點少的,所以要怎麼得到更多的資料呢?
細心的人可以發現右側還能選擇類別!如下圖:
不過,檢視這些元素髮現裡面是沒有顯示 URL 的,如下圖:
但是這也不表示沒有辦法了,全域性搜尋一下就能找到了,如下圖:
CategoryId 就是這個分類的 ID,也就是 URL 中“bookListInCategory/”後面的內容。至於 maxIndex,可以先設為0,然後傳送請求得到這一分類的書本總數“totalCount”,然後根據這個書本總數是否超過一千來設定頁數,就能得到這一分類下能夠爬取到的所有 URL 了。
三、爬取步驟
前面經過分析已經知道只要拿到書本分類 ID,就能傳送請求得到書本總數,也就能構造該分類下的所有頁面的 URL 了。那要怎麼得到所有分類呢?前面全域性搜尋的時候已經搜到了書本分類的 CategoryId 等資訊,如下圖:
所以只需先請求頁面然後用正則匹配 CategoryId 就行了!然後對每個分類傳送一次請求,用於獲取書本總數,並構造這一分類下的所有 URL。這一部分程式碼如下:
1 def prepare(base_url="https://weread.qq.com/web/category/1700000") -> list: 2 """ 3 prepare for crawler 4 :param base_url: weread base url 5 :return: page url list 6 """ 7 def request(url) -> list: 8 """ 9 request function 10 :param url: url 11 :return: page url list 12 """ 13 page_urls = [] 14 try: 15 res = requests.get(url=url, headers=headers) 16 if res.status_code == 200: 17 count = res.json()["totalCount"] 18 cnt = 50 if count >= 1000 else count // 20 19 page_urls = [url + "?maxIndex={}".format(i * 20) for i in range(cnt)] 20 else: 21 logging.error("Error request!") 22 except Exception as e: 23 logging.error(e) 24 finally: 25 return page_urls 26 27 resp = requests.get(url=base_url, headers=headers) 28 # check status code 29 if resp.status_code == 200: 30 id_list = re.findall('"CategoryId":"(.+?)"', resp.text) 31 id_list = list(set([i for i in id_list if i[0].isdigit()])) 32 href_list = ["https://weread.qq.com/web/bookListInCategory/{}".format(i) for i in id_list] 33 result = [] 34 for href in href_list: 35 result += request(href) 36 logging.info("Url count: {}".format(len(result))) 37 return result 38 else: 39 logging.error("Prepare error!") 40 exit()
進行到這一步,後面就很簡單了,就是獲取請求結果並解析即可。程式執行時列印輸出如下:
可以看到總連結數有7091條,那麼爬到的書本資訊有多少條呢?因為我用的是 MongoDB 儲存的,所以開啟 Robot3T 檢視,總共有141137條,結果如下圖:
四、繪圖分析
熟悉 Python 的都知道,matplotlib 是 Python 中用的最多的 2D 圖形繪相簿。不過我在這推薦一個好用的第三方庫:pyecharts,這是一個用於生成 Echarts 圖表的類庫,生成的圖表更加精巧,視覺化效果更好,不過需要注意的是 pyecharts 的0.5版本和1.0版本使用方法是不同的。下面就是使用這個庫生成的橫向柱狀圖了,分別表示評分前十的書籍、閱讀量前十的書籍和總閱讀量前十的作者:
可以發現評分高的書籍閱讀量卻不一定高,閱讀量更多的往往是一些網路小說。為什麼好像現在名著都不怎麼討喜,而網路小說卻能讓更多人著迷呢?個人猜想是小說裡的世界可能更加能夠滿足現在年輕人的幻想吧,現實生活疲憊不堪,就會更加迷戀小說中的“世外桃源”吧。
完整程式碼已上傳到 GitHub!
&nbs