最近在學習 Python,覺得爬蟲很好玩,今天我准備爬取我看了至少三遍的小說《雪中悍刀行》,作者是烽火戲諸侯,他的小說很有才華,有着很多的粉絲,但他很多部小說都處於斷更狀態,因此人稱大內總管。
我准備爬取小說的網站是新筆趣閣,這里一個盜版網站,是名門正派的眼中釘,不過對於我這種不想交錢看小說的人,沒資格評論它,這個網站連載的小說更新的還是比較快的,內容都是和正版的內容一模一樣。好了,廢話不多說了,下面開始放代碼:
我在抓取小說內容時先用了 requests 庫來抓取,結果就抓到了一章小說的開頭幾句話,后來想到了剛在學習的 Selenium 自動化測試工具,利用 Selenium 可以驅動瀏覽器執行特定的動作,如點擊、下拉等操作,同時還可以獲取瀏覽器當前呈現的頁面源代碼,可以做到爬取呈現在你面前的所有內容。
首先我們先打開我們要爬取小說的主頁 url = 'https://www.xxbiquge.com/0_807/',此時我們可以看到頁面是小說的全部章節,我們先要拿到小說章節總數,代碼如下:
def page_num(): """ 對小說的進行分析,得到小說總的章節數 :return: 章節數 """ # 目標小說的 URL 地址,如果你想爬其他小說,只要改成你要爬的小說的主頁就好了 url = 'https://www.xxbiquge.com/0_807/' browser = webdriver.Chrome() browser.get(url) html = browser.page_source soup = BeautifulSoup(html, 'lxml') dd = soup.find_all(name="dd") page = len(dd) browser.close() return page
接下來我們要對單章小說進行分析,比如第一章,第一章的 url = 'https://www.xxbiquge.com/0_807/4055527.html',我們很容易就能拿到第一章的源代碼,關鍵是怎么得到下一章的內容,Selenium 可以模擬用戶點擊下一章,跳轉到下一章的頁面,代碼如下:
def index_page(i): """ 加載出小說的每一章內容 :param i: 小說的第 i 章 """ if i == 1: # 小說第一章的 Url 地址, 你要爬取的小說的第一章 url url = "https://www.xxbiquge.com/0_807/4055527.html" browser.get(url) # 等待 Content 節點加載出來 wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#content'))) # 調用 get_info() 方法對頁面進行解析 get_info() # 尋找下一章點擊的節點 next_p = browser.find_elements(By.XPATH,('//div[@class="bottem2"]/a'))[2] # 點擊按鈕 next_p.click()
第三步,提取每一章的內容,代碼如下:
def get_info(): """ 提取每一章小說的章章節名及正文 :return: """ # 找到章節的名字 name = browser.find_element_by_css_selector('#wrapper > div.content_read > div > div.bookname > h1').text print(name) # 找到小說正文 content = browser.find_element_by_id('content').text print(content) # 將拿到的小說名和對應的正文內容寫入 txt 文件中 with open('雪中悍刀行.txt','a',encoding="utf-8") as f: f.write('\n'.join([name, content])) f.write('\n\n')
第四步,遍歷每一頁:
def main(): """ b遍歷小說的全部章節 :return: """ page = page_num() print(page) for i in range(1,page+1): index_page(i)
最后一步,運行程序:
if __name__ == '__main__': main()
然后就可以喝杯茶,等着小說下好。完整代碼在:https://github.com/luoyunqa/Test/tree/master/biquge_novel