Python每日一練(16)-抓取小說目錄和全文

本文要實現的案例是通過 requests 庫抓取 鬥破小說網 上指定的小說的目錄和每一節的完整內容(只保留純文本內容)。當抓取包含目錄和小說內容的頁面後,會通過正則表達式分析 HTML 代碼,並提取出目錄標題,對應的 url 以及文本形式的小說內容。現在進入鬥破小說網,選擇一篇小說,本文選擇了 鬥破蒼穹 目錄頁面如下圖所示:
在這裏插入圖片描述
真是歲月催人老呀,懷念當年偷偷捂着被子,逃課看這本小說的年紀。這部小說的目錄很多,我只截圖了一部分,第一個任務要完成下載這個目錄頁面的代碼,並從中提取出小說的目錄以及對應的 URL 。在網頁中按 F12 或者是 檢查 調出控制檯調試界面,如下圖所示:
在這裏插入圖片描述
這步完成之後,我們就可以將標題作爲文件名,然後抓取 URL 對應的頁面內容,並提取出文本形式的小說正文,然後將小說正文保存在以標題作爲文件名的文件夾中。隨便單擊一個章節,進入小說正文,使用上面的方式調出調試窗口,查看正文對應的 HTML 代碼,如下圖所示:
在這裏插入圖片描述
使用 requests 模塊的時候,需要進行安裝,如下圖所示:
在這裏插入圖片描述
根據前面的分析,示例代碼如下:

# -*- coding: utf-8 -*-
# @Time    : 2020/5/9 19:03
# @Author  : 我就是任性-Amo
# @FileName: 76.抓取小說目錄和全文.py
# @Software: PyCharm
# @Blog    :https://blog.csdn.net/xw1680

import requests  # 第三方模塊 需要使用pip安裝
import re  # 導入正則模塊
import os

# 構造請求頭
headers = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, "
                  "like Gecko) Chrome/81.0.4044.138 Safari/537.36"
}


# TODO 1.根據小說鏈接得到小說目錄和對應的url
def get_catalogue(url):
    # 發送請求
    response = requests.get(url=url, headers=headers)
    response.encoding = "utf-8"  # 指定編碼
    chapter_info_list = []  # 用來存儲獲取到的所有url和章節標題數據
    if response.status_code == 200:  # 判斷請求是否成功
        li_list = re.findall(r"<li>.*</li>", response.text)  # 過濾 獲取所有的li標籤
        for li in li_list:
            # print(li)
            result = re.search(r'href="(.*)" title="(.*)"', li)  # 過濾出url和標題
            if result:
                # 組成完整的url
                chapter_url = "http://www.doupoxs.com" + result.group(1)
                # 得到章節的標題
                title = result.group(2)
                # 使用字典存儲url和title
                chapter = {"title": title, "url": chapter_url}
                # 將字典添加到列表中
                chapter_info_list.append(chapter)
    print(chapter_info_list)
    return chapter_info_list


# TODO 2.根據章節目錄,抓取目錄對應的url指定的小說正文頁面
def get_content(chapter_info_list):
    for chapter_info in chapter_info_list:
        # 發送請求
        response = requests.get(url=chapter_info["url"], headers=headers)
        if response.status_code == 200:  # 判斷請求是否成功
            # 判斷小說文件夾是否存在
            if os.path.exists("novel_鬥破蒼穹"):
                pass
            else:
                os.makedirs("novel_鬥破蒼穹")
            content_list = re.findall(r"<p>(.*?)</p>", response.content.decode("utf8"))[1:-1]
            # 建立文件 並將小說正文寫入文件中
            with open("./novel_鬥破蒼穹/" + chapter_info["title"] + ".txt", "w", encoding="utf8") as file:
                # 將內容一行一行的寫入文件中
                for content in content_list:
                    file.write(content + "\n")


if __name__ == '__main__':
    get_content(get_catalogue("http://www.doupoxs.com/doupocangqiong/"))

程序執行結果如下圖所示:
在這裏插入圖片描述

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