爬虫類の場合ウェブサイト小説のダウンロード

著作権の問題により、ウェブサイトは一時的に記載されていません。
通常、クロールにはxpathを使用し、クライミング対策は使用しません

クロールはプログレスバーを使用します。プログレスバーの使用とクロールで発生する問題について説明します。

  • \ rは、カーソルを行の先頭に戻すことを意味します
    \ bは、カーソルを1つ戻すことを意味します

  • print( "\ r"、end = "")end = ""は、次の印刷が折り返されないことを意味し、\ rはカーソルの位置が行の先頭に戻ることを意味するため、前の印刷は上書きされますドロップ

  • 「/」は浮動小数点数の除算を意味し、浮動小数点の結果を返します。「//」は整数の除算を意味します。

  • xpathがラベルテキストを取得すると、文字化けした文字が表示されます。テキストには.encode( 'ISO-8859-1')。decode( "gbk")を使用してください。

  • バッファを更新する方法:

    flush()バッファ領域を更新します。
    バッファがいっぱいになると、
    ファイルが閉じられたとき、またはプログラムが終了したときに自動的に更新されます。

    import time
    import sys
     
    for i in range(5):
        print(i,end='')
        # sys.stdout.flush()
        time.sleep(0.001)
    #注释打开和关闭效果不同
    

    一部の文字を印刷する場合、print関数を呼び出した直後に印刷されません。通常、文字は最初にバッファに送信され、次に印刷されます。問題があります。一部の文字を等間隔で印刷したいが、バッファがいっぱいでないために印刷されない場合。いくつかの対策を講じる必要があります。たとえば、バッファは印刷のたびに強制的に更新されます。

クロール結果:
ここに画像の説明を挿入します

ここに画像の説明を挿入します

コード

import requests
from lxml import etree
import re,os,time,sys

m=0
k=0

#解析小说正文页面
def parse_page(url):
    r = requests.get(url).text
    html = etree.HTML(r)
    title = html.xpath('//div[@class="content"]/h1/text()')[0]
    text = html.xpath('//div[@id="content"]/text()')
    if len(text)==0:
        pass
    new_text = []
    for te in text[:-4]:
        new_text.append(te)
    
    err = ['?', '?','\"', '“','|',':','(','*','(']
    #判断小说章节名是否合法
    if len([True for er in err if er in title])!=0:
        y = re.findall('[((\??"“”|:/\*].*',title)[0]
        new_title = title.replace(y,'')
        save(new_title,new_text)
    else:  
        save(title,new_text)

        
#使用进度条
def down_progress(len_url):
    global m
    global k
    if k!=0 and m<=99 and k%(int)(len_url/100)==0:
        m=m+1
        print("\r", end="")
        print("Download progress: {}%: ".format(m), "▋" * (m // 2), end="")
        sys.stdout.flush()
    k+=1
        
#获取小说的所有正文Url
def get_url(url):
    global novel_name
    global len_url
    r = requests.get(url).text
    html = etree.HTML(r)
    novel_name = html.xpath('//div[@class="info"]/h2/text()')[0].encode('ISO-8859-1').decode("gbk")
    if not os.path.exists(novel_name):
        os.mkdir(novel_name)
    dd = html.xpath('//div[@class="listmain"]/dl//dd')
    len_url = len(dd)-12
    
    print("下载的小说名为:"+novel_name)
    print("共需要下载{}章".format(len_url))
    print("保存地址为:"+os.getcwd()+"\\"+ novel_name)
    print("下载大概需"+str('%.2f'%(len_url*1.1/60))+"分钟")
    print("*"*30+'下载开始'+"*"*30)
    for d in dd[12:]:
        #使用进度条
        down_progress(len_url)
        url = "https://www.bqkan.com/" + d.xpath('./a/@href')[0]
        parse_page(url)
        time.sleep(0.05)
#将小说正文写入文本文件中
def save(title,text):
    f = open(novel_name+"/"+title+'.txt','a',encoding='utf-8')
    for te in text:
        f.write(te)
        f.write('\n')

def main():
    url = input("请输入小说目录下载地址:")
    get_url(url)

if __name__ == '__main__':
    start = time.time()
    main()
    end = time.time()
    print()
    print("*"*30+'下载已完成'+"*"*30)
    print("下载耗费时间:{}分钟".format(str('%.2f'%((end-start)/60))))

おすすめ

転載: blog.csdn.net/a12355556/article/details/113135828