1. 程式人生 > 其它 >手把手教你用Python爬取某網小說資料,並進行視覺化分析

手把手教你用Python爬取某網小說資料,並進行視覺化分析

網路文學是以網際網路為展示平臺和傳播媒介,藉助相關網際網路手段來表現文學作品及含有一部分文字作品的網路技術產品,在當前成為一種新興的文學現象,並快速興起,各種網路小說也是層出不窮,今天我們使用selenium爬取紅袖天香網站小說資料,並做簡單資料視覺化分析。

紅袖添香建於1999年,是全球領先的女性文學數字版權運營商之一,日更新小說5000部,為超過240萬註冊使用者提供涵蓋小說、散文、雜文、詩歌、歌詞、劇本、日記等體裁的高品質創作和閱讀服務,在言情、職場小說等女性文學寫作及出版領域獨佔高地。(百度百科)

網頁初步分析,舉個我的成品例子  www.bsoo.xyz 

開啟網頁如圖所示:

我們要把小說分類裡面的所有小說資料全部抓取下來:總共有50個頁面,每頁20條資料,一共1000條資料。

首先使用requests第三方庫請求資料,如下所示:

importrequestsurl = 'https://www.hongxiu.com/category/f1_f1_f1_f1_f1_f1_0_1'# 第一頁urlheaders = { 'xxx' : 'xxx'}res = requests.get(url,headers=headers)print(data.content.decode('utf-8'))我們發現請求回來的資料並沒有第一頁的小說資料資訊,很明顯資料不在網頁原始碼裡面,然後通過檢視network,發現了這樣的請求欄位:

_csrfToken: btXPBUerIB1DABWiVC7TspEYvekXtzMghhCMdN43_: 1630664902028這個是做了js加密,所以為了避免分析加密方式,使用selenium爬取資料可能更快一些。

selenium 爬取資料

01 初步測試

fromselenium import webdriverimport timeurl = 'https://y.qq.com/n/ryqq/songDetail/0006wgUu1hHP0N'driver = webdriver.Chrome()driver.get(url)結果執行正常,沒有問題。

02 小說資料

明確要爬取的小說資料資訊

然後通過點選下一頁的按鈕觀察是否是動態資料:發現不是;url規律如下所示:

'https://www.hongxiu.com/category/f1_f1_f1_f1_f1_f1_0_1'# 第一頁的url'https://www.hongxiu.com/category/f1_f1_f1_f1_f1_f1_0_2'# 第二頁的url03 解析資料

下面是解析頁面資料的程式碼:

defget_data():ficList = [] # 儲存每一頁的資料 items = driver.find_elements_by_xpath("//div[@class="right-book-list"]/ul/li")for item in items: dic = {} imgLink = item.find_element_by_xpath("./div[1]/a/img").get_attribute('src') # 1.圖片連結 2.小說名稱(name) 3.小說型別(types) .... dic['img'] = imgLink# ...... ficList.append(dic)這裡有幾個需要注意的點:

注意xpath語句書寫,注意細節,不要出錯;對於小說簡介,有的簡介比較長,有換行符,為了便於儲存,需要使用字串的replace方法把'\n'替換為空字串04 翻頁爬取

下面是翻頁爬取資料的程式碼:

try:time.sleep(3) js = "window.scrollTo(0,100000)" driver.execute_script(js)while driver.find_element_by_xpath( "//div[@class='lbf-pagination']/ul/li[last()]/a"): driver.find_element_by_xpath("//div[@class='lbf-pagination']/ul/li[last()]/a").click() time.sleep(3) getFiction() print(count, "*" * 20) count += 1if count >= 50:returnNoneexcept Exception as e: print(e)程式碼說明:

使用try語句,進行異常處理,防止有什麼特殊頁面的元素無法匹配或者其它問題。driver執行js程式碼,操作滾輪,滑動到頁面底部。js = "window.scrollTo(0,100000)"driver.execute_script(js)time.sleep(n) 因為迴圈裡面添加了解析函式(driver定位)需要等待資料載入完全。while迴圈語句,while後面的是 ‘下一頁’ 按鈕定位,保證迴圈的爬取下一頁的資料。使用if語句作為判斷條件,作為while迴圈推出的條件,然後要使用return退出函式,break不行。05 資料儲存

titles = ['imgLink', 'name', 'author', 'types', 'pink','popu','intro']with open('hx.csv',mode='w',encoding='utf-8',newline='') as f: writer = csv.DictWriter(f, titles) writer.writeheader() writer.writerows(data) print('寫入成功')06 程式執行

結果如下,顯示的1000條資料:

使用selenium爬取資料的一些注意點:

① 點選下一頁之後,資料不可能瞬間載入完全,一旦資料沒有載入完全,那麼使用webdriver的find_Element_by_xpath語句就會定位不到dom文件上的元素,進而丟擲一個錯誤:

selenium.StaleElementReferenceException: stale element reference: element is not attached to the page document大概意思:所引用的元素已過時,不再依附於當前頁面。產生原因:通常情況下,這是因為頁面進行了重新整理或跳轉。解決方法:1.重新使用 findElement 或 findElements 方法進行元素定位即可。2.或者只需要使用webdriver.Chrome().refresh重新整理一下網頁就可以,還要在前面等待幾秒鐘再重新整理,time.sleep(5)。關於這個報錯的解決方法,參考下面部落格:https://www.cnblogs.com/qiu-hua/p/12603675.html

② 在動態點選下一頁按鈕時,需要精準定位到下一頁的按鈕,其次很重要的一共問題,selenium開啟瀏覽器頁面時,需要視窗最大化。

由於視窗右側有一個絕對定位的二維碼小視窗,如果不視窗最大化,那個該視窗就會擋住下一頁按鈕導致無法點選,這個需要注意。

資料分析與視覺化

開啟檔案

importpandas as pddata = pd.read_csv('./hx.csv')data.head()