1. 程式人生 > >python 3 爬取某小說網站小說,註釋詳細

python 3 爬取某小說網站小說,註釋詳細

每一行都有註釋,不多解釋了

import requests
from bs4 import BeautifulSoup
import os

if __name__ == '__main__':
    # 要下載的網頁
    url = 'https://www.biqubao.com/quanben/'
    # 網站根網址
    root_url = 'https://www.biqubao.com'
    # 儲存本地路徑
    path = 'F:\\python\\txt'

    # 解析網址
    req = requests.get(url)
    # 設定編碼,瀏覽器檢視網站編碼:F12,控制開輸入document.characterSet回車即可檢視
    req.encoding = 'gbk'

    # 獲取網頁所有內容
    soup = BeautifulSoup(req.text, 'html.parser')

    # 查詢網頁中div的id為main的標籤
    list_tag = soup.div(id="main")
    # 檢視div內所有裡標籤
    li = list_tag[0](['li'])
    # 刪除第一個沒用的標籤
    del li[0]
    # 迴圈遍歷
    for i in li:
        # 獲取到a標籤間的內容---小說型別
        txt_type = i.a.string
        # 獲取a標籤的href地址值---小說網址
        short_url = (i(['a'])[1].get('href'))
        # 獲取第三個span標籤的值---作者
        author = i(['span'])[3].string

        # 獲取網頁設定網頁編碼
        req = requests.get(root_url + short_url)
        req.encoding = 'gbk'

        # 解析網頁
        soup = BeautifulSoup(req.text, "html.parser")
        list_tag = soup.div(id="list")

        # 獲取小說名
        name = list_tag[0].dl.dt.string

        print("型別:{}    短址:{}   作者:{}   小說名:{}".format(txt_type, short_url, author, name))

        # 建立同名資料夾
        # paths = path + '\\' + name
        if not os.path.exists(path):
            # 獲取當前目錄並組合新目錄
            # os.path.join(path, name)
            os.mkdir(path)

        # 迴圈所有的dd標籤
        for dd_tag in list_tag[0].dl.find_all('dd'):
            # 章節名
            zjName = dd_tag.string
            # 章節地址
            zjUrl = root_url + dd_tag.a.get('href')

            # 訪問網址爬取章節內容
            req2 = requests.get(zjUrl)
            req2.encoding = 'gbk'

            zj_soup = BeautifulSoup(req2.text, "html.parser")
            content_tag = zj_soup.div.find(id="content")

            # 把空格內容替換成換行
            text = str(content_tag.text.replace('\xa0', '\n'))
            text.replace('\ufffd', '\n')

            # 寫入檔案操作'a'追加
            with open(path + "\\" + name + ".txt", 'a') as f:
                f.write('\n' + '\n' + zjName)
                f.write(text)
                print("{}------->寫入完畢".format(zjName))