Python 爬取筆趣閣小說


  最近在學習 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM