Python 小把戲之下載小說

Python 小把戲之下載小說

#! /usr/bin/python3
# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
import sys
import requests
import re
'''
下載小說  網站: 筆趣閣  http://www.biquku.la/
Parameter:
    無
    
Returns:
    無
Modify:
    2019/01/28
'''
class book_downloader(object):

    def __init__(self, url):
        '''
        初始化函數 
        Parameter:
            url:  網站: 筆趣閣的 小說目錄頁網址
        Returns:
            無
        Modify:
            2019/01/28
        '''
        self.__target = url
        self.__txtname= ''    #存放小說名
        self.__names  = []    #存放章節名字
        self.__urls   = []    #存放章節鏈接
        self.__nums   = 0     #章節數
        self.__book_url=[]    #存放風推動小說url

    def get_download_url(self):
        '''
        獲取各個章節的url 和 章節名稱
        Parameter:
            無
        Returns:
            無
        Modify:
            2019/01/28
        '''
        req = requests.get(url = self.__target)     #發送get請求,獲取req對象       
        div_bf = BeautifulSoup(req.text) 
        name =  div_bf.find_all('div', id = 'info') #取出小說名稱
        name_fb = BeautifulSoup(str(name[0]))     
        self.__txtname = name_fb.find_all('h1')[0].string     #取出小說名     
        div = div_bf.find_all('div', id = 'list')   #取出章節信息
        a_bf = BeautifulSoup(str(div[0]))         
        a = a_bf.find_all('a')                      #剔除章節信息中無效部分
        self.__nums = len(a)                        #獲取章節數目
        for each in a:
            self.__names.append(each.string)
            self.__urls.append(self.__target + each.get('href'))

    def get_txt(self, url):
        '''
        獲取各個章節內容
        Parameter:
            各個章節的url
        Returns:
            章節內容 txt
        Modify:
            2019/01/28
        '''
        r = requests.get(url)
        r.encoding = 'utf-8'
        r_bf = BeautifulSoup(r.text)
        r_txt = r_bf.find_all('div', id = 'content')       #獲取小說正文內容
        r_txt = r_txt[0].text.replace('\xa0'*4, '\n    ')  #替換換行
        return r_txt

    def write_txt(self, name, txt):
        '''
        將小說章節和內容寫入本地
        Parameter:
            name: 章節名   txt 章節的內容
        Returns:
            無
        Modify:
            2019/01/28
        '''
        with open(str(self.__txtname) + '.txt', 'a', encoding = 'utf-8') as f:
            f.write('\n\n' + name + '\n\n')
            f.writelines('    ' + txt.replace('\xa0'*4, '\n    '))

    def download(self):
        '''
        將小說章節和內容寫入本地
        Parameter:
            無
        Returns:
            無
        Modify:
            2019/01/28
        '''
        self.get_download_url()     #獲取各個章節的url 和 章節名稱
        n = 0
        for i in self.__urls:
            sys.stdout.write(" %s 已下載:%.3f%%" %  (self.__txtname,float( n*100/self.__nums)) + '\r')
            sys.stdout.flush()
            self.write_txt(self.__names[n], self.get_txt(i))
            n += 1

    def get_book_url(self):
        '''
        獲取 http://www.biquku.la/ 首頁上的封推的小說的url
        Parameter:
            無
        Returns:
            無
        Modify:
            2019/01/31
        '''
        url = 'http://www.biquku.la'
        html = requests.get(url = url)     #發送get請求,獲取req對象  
        div_bf = BeautifulSoup(html.text) 
        urls =  div_bf.find_all('div', class_ = 'content') #取出小說名稱 和 url
        print(urls)
        for each in urls:                                  #運用正則,取出小說url
            self.__book_url += re.findall('<a href="(.*?)">', str(each))

    def download_books(self):
        '''
        下載 http://www.biquku.la/ 首頁上的封推的小說
        Parameter:
            無
        Returns:
            無
        Modify:
            2019/01/31
        '''

        self.get_book_url()
        for each in self.__book_url:
            self.__urls   = []    #存放章節鏈接
            self.__names  = []    #存放章節名字
            self.__target = each  
            self.download()




if __name__ == '__main__':
    target = 'http://www.biquku.la/18/18109/'
    dl = book_downloader(target)
#    dl.download()       #下載target  指向的小說
    dl.download_books()  #下載 http://www.biquku.la/ 首頁上的封推的小說
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章