小說網站竟然沒有下載功能?跟小姐姐學會這個python小說爬蟲,把全文小說帶回家!

hello大家好,我是你們的可愛丸,不知道你們有沒有遇到過這種情況:

自己喜歡的小說竟然只能看不能下載???

在這裏插入圖片描述
作爲一個python學習者,這種情況當然不能忍,那麼今天我就教大家用python寫一個小說爬蟲,輕輕鬆鬆的把全網小說都下載到你的電腦裏。
在這裏插入圖片描述
視頻教程地址:https://www.bilibili.com/video/bv1gQ4y1M7j7

本次案例我選取的是小說網站是:筆趣閣,首頁地址爲:https://www.52bqg.com/
在這裏插入圖片描述
因爲該小說網站上每一本小說的內容都很多,所以今天我就教大家設計針對單本小說的爬蟲。在本案例中,我選取的是以下這本還在連載的小說,網頁地址爲:https://www.52bqg.com/book_307/
在這裏插入圖片描述
在正式開始講解之前我先給大家講解一下我的設計思路:

1、確定想要爬取的小說及入口url
2、在入口url通過解析獲取小說所有章節名稱及各章節href
3、通過字符串拼接得到所有章節詳情頁的地址
4、爬取每章具體內容的文本
5、將每章小說以章節名稱命名並保存爲txt文件

注意: 現在各大網站都有反爬機制,所以我們要對我們的爬蟲進行僞裝,讓它模仿瀏覽器訪問,這樣網站就檢測不到訪問他的是爬蟲程序啦。所以我們要給爬蟲設置請求頭,將網頁的User-Agent複製到代碼裏

headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'}

剛纔我們已經確定了想要爬的小說以及入口url, 那怎麼獲取小說的章節名稱和href呢? 方法是:點擊鼠標右鍵,選擇檢查,然後選擇左上角的小箭頭,再把鼠標移動到我們想要獲取的內容的位置,就能找到他們的代碼啦!
在這裏插入圖片描述在這裏插入圖片描述
這裏我們通過xpath的方式獲取需要的內容 ,如果你對xpath不熟悉的話,那我們還可以通過如下的一個小妙招輕鬆獲取xpath路徑。
在這裏插入圖片描述
注意:dd[3]代表的是獲取第三個dd標籤的內容,如果你想獲取所有章節名稱,那把[3]去掉即可,即:

//*[@id="list"]/dl/dd[3]/a

變爲:

//*[@id="list"]/dl/dd/a

代碼如下:
#設置爬取小說的函數功能

def get_text(url):
    response = requests.get(url, headers=headers)
    #最常用的編碼方式是utf-8以及gbk,出現亂碼可以先嚐試這兩種
    response.encoding = 'gbk'
    selector = etree.HTML(response.text)
    #獲取到所有章節的標題
    title = selector.xpath('//*[@id="list"]/dl/dd/a/text()')
    #獲取每章小說具體內容的鏈接
    hrefs = selector.xpath('//*[@id="list"]/dl/dd/a/@href')

接下來我們來想一想如何獲取到每一章的內容鏈接呢?
首先我們可以觀察一下每一章的鏈接有什麼規律:

第一章:https://www.52bqg.com/book_307/189710.html
第二章:https://www.52bqg.com/book_307/189713.html
第三章:https://www.52bqg.com/book_307/189716.html
第四章:https://www.52bqg.com/book_307/189720.html
第五章:https://www.52bqg.com/book_307/189723.html

我們可以觀察到,每章的鏈接地址前面有一部分都是相同的,而最後一個/後的內容都是每一章名稱a標籤的href屬性的內容,因此我們可以通過字符串的拼接來找到具體章節地址

 urls = []
    for href in hrefs:
        #把url和href拼接得到每一章具體內容的url並存在urls列表裏
        urls.append(url+href)

然後我們可以再次通過審查元素的方法,找到章節內容的xpath路徑,獲取每一章的內容

for i in range(len(urls)):
    #傳入每一章內容具體鏈接的url
    response = requests.get(urls[i], headers=headers)
    response.encoding = 'gbk'
    selector = etree.HTML(response.text)
    #獲取每一章具體的內容
    contents = selector.xpath('//*[@id="content"]/text()')
    #保存小說章節名稱及章節內容

最後我們再設計一下保存文章的代碼,並使這個爬蟲能幫助我們在沒有對應文件夾的情況下自動創建文件夾保存小說文件。

自動生成小說文件夾:

import os

#自動創建保存小說的文件夾
# os.chdir()方法用於改變當前工作目錄指定的文件夾
if not os.path.exists(os.getcwd()+"/xiaoshuo"):
    print("小說文件夾不存在,幫你自動創建好了")
    print("==================================")
    os.mkdir("xiaoshuo")
    #把當前路徑改爲到xiaoshuo文件夾處
    os.chdir(os.getcwd()+"/xiaoshuo")
else:
    print("小說文件夾存在")
    os.chdir(os.getcwd()+"/xiaoshuo")
    print("==================================")

保存爲txt文件:

 with open(title[i]+".txt", "w", encoding='utf-8') as f:
            for content in contents:
                content = content.replace("\n","")
                #將每一章的內容寫入對應章節的txt文件裏
                f.write(content)
            print(str(title[i])+"下載成功!")

代碼運行效果:
在這裏插入圖片描述
完整代碼:

#導入需要用到的模塊
import requests
from lxml import etree
import os

#自動創建保存小說的文件夾
# os.chdir()方法用於改變當前工作目錄指定的文件夾
if not os.path.exists(os.getcwd()+"/xiaoshuo"):
    print("小說文件夾不存在,幫你自動創建好了")
    print("==================================")
    os.mkdir("xiaoshuo")
    #把當前路徑改爲到xiaoshuo文件夾處
    os.chdir(os.getcwd()+"/xiaoshuo")
else:
    print("小說文件夾存在")
    os.chdir(os.getcwd()+"/xiaoshuo")
    print("==================================")

#設置請求頭
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'}

#設置想要爬取的小說鏈接
url = 'https://www.52bqg.com/book_307/'

#設置爬取小說的函數功能
def get_text(url):
    response = requests.get(url, headers=headers)
    #最常用的編碼方式是utf-8以及gbk,出現亂碼可以先嚐試這兩種
    response.encoding = 'gbk'
    selector = etree.HTML(response.text)
    #獲取到所有章節的標題
    title = selector.xpath('//*[@id="list"]/dl/dd/a/text()')
    #獲取每章小說具體內容的鏈接
    hrefs = selector.xpath('//*[@id="list"]/dl/dd/a/@href')
    urls = []
    for href in hrefs:
        #把url和href拼接得到每一章具體內容的url並存在urls列表裏
        urls.append(url+href)

    for i in range(len(urls)):
        #傳入每一章內容具體鏈接的url
        response = requests.get(urls[i], headers=headers)
        response.encoding = 'gbk'
        selector = etree.HTML(response.text)
        #獲取每一章具體的內容
        contents = selector.xpath('//*[@id="content"]/text()')
        #保存小說章節名稱及章節內容
        with open(title[i]+".txt", "w", encoding='utf-8') as f:
            for content in contents:
                content = content.replace("\n","")
                #將每一章的內容寫入對應章節的txt文件裏
                f.write(content)
            print(str(title[i])+"下載成功!")

if __name__ == '__main__':
    get_text(url)

今天的小說爬蟲案例就分享到這裏啦,喜歡的朋友們記得給我點贊關注支持我哦,我將持續和大家分享python學習經驗 O(∩_∩)O~
在這裏插入圖片描述
我是可愛丸,人生苦短,我學python!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章