小言_互联网的博客

爬取笔趣阁小说网站上的所有小说(二)

489人阅读  评论(0)

爬取笔趣阁小说网站上的所有小说(二)

网址为:https://www.biqukan.cc/topallvisit/1.html

我们已经拿到了所有小说的地址爬取笔趣阁小说网站上的所有小说(一),现在开始下载小说。

获取小说的信息

每个小说都有书名,类型,图片,简介等信息,我们先得到并存储在CSV里。

我们下先读取已经下载好的小说地址,并获得小说页面的源码:

# 以1页为例
for i in range(1,2):
    # 打开本地文件夹
    with open('第'+str(i) + '页.txt', 'r', encoding='utf-8') as f:
        # 总共有30个小说
        for j in range(1,31):
            # 读取一行作为地址
            url = f.readline()
            html = requests.get(url, headers=head)
            html.encoding = html.apparent_encoding
            # 清洗好的源码
            soup = BS(html.text, "html.parser")

借下号我们看看网页的真正面目

这里也是一样的,所有的信息都在一个div里面,这样我们就很好获取。

#类型
type_=soup.find(class_='breadcrumb').findAll('li')[1].a['title']


类型是在一个单独的ol标签中,所以我们先获取,看源码:

首先用class=breadcrumb获取ol标签医德所有内容,接着用findAll拿到所有的li标签,因为我们需要的类型在第二个中的title,就这样拿到了类型。

接着在去拿其他内容

#所有信息
info = soup.find(class_='panel-body')
# 图片
img = info.find('img')['src']
img = requests.get(img)
# 作者,书名
title_authoe = info.find(class_='bookTitle').text.split('/')
# 书名
title = title_authoe[0].replace(' ','')
# 作者
author = title_authoe[1]
# 简介
introduction=info.find(class_='text-muted').text.replace(' ','')

info是包含其他信息的一个div,个信息可以通过这个info来获取。

保存小说信息

保存其实是比较简单的事情,但是喝多时候容易出现问题,就单独拿出来说。

这里我们先导入库,CSV然后再操作

# 保存书名,类型,作者,简介
with open('笔趣阁/'+title+'/'+'info.csv', 'a+', encoding='utf-8', newline='') as f:
    writer = csv.writer(f)
    rows = [(title,author,type_,introduction)]
    writer.writerows(rows)

这里指的注意的是文件夹和文件之间间隔的不是win上的 ‘\’ ,而是’/’,这个是Python的一个特点。

获取章节网址

首先看网站上是什么样的。

这个网站对爬虫实在是太友好了,整整齐齐的排列好了,这样就简单多了,还是在一个div中,这次我们选择使用ID这个标签来获取,应为有两个相同的class。

chapter_lists = soup.find(id='list-chapterAll')
chapter_urls= chapter_lists.findAll('a')

就这样拿到了所有的章节的网址了。

下载个章节

因为得到的网址不完整,所以需要整合一下

#书的地址
book_url =url.replace('\n','')
for chapter in range(len(urls)):
	#章节地址
	chapter_url =book_url+urls[chapter]['href']

再次查看网站

正文都在一个div里,直接获取就可以了

html = requests.get(url=chapter_url, headers=head)
html.encoding = html.apparent_encoding
soup = BS(html.text, "html.parser")
# 正文
body = soup.find(class_='panel-body').text.split('最新章节!')[1]

源码

import requests
from bs4 import BeautifulSoup as BS
import csv
import time
import os
# 请求头
user_agent = r'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36'
head = {'User-Agnet': user_agent, }

# 进度条
def process_bar(percent, start_str='', end_str='', total_length=0):
    bar = ''.join(["\033[31m%s\033[0m"%'   '] * int(percent * total_length)) + ''
    bar = '\r' + start_str + bar.ljust(total_length) + ' {:0>4.1f}%|'.format(percent*100) + end_str
    print(bar, end='', flush=True)


# 下载章节内容
def download_chapter(urls,url,book_name):
    #
    book_url =url.replace('\n','')
    book_name =book_name
    for chapter in range(len(urls)):
        # 章节名
        chapter_title = urls[chapter]['title']
        chapter_url =book_url+urls[chapter]['href']
        # 显示下载的是第几章
        print('正在下载=='+chapter_title, end='', flush=True)
        html = requests.get(url=chapter_url, headers=head)
        html.encoding = html.apparent_encoding
        soup = BS(html.text, "html.parser")
        # 正文
        body = soup.find(class_='panel-body').text.split('最新章节!')[1]
        # 进度条
        process_bar(chapter / len(urls), start_str='', end_str='100%', total_length=20)
        with open('笔趣阁/'+book_name+'/'+chapter_title+'.txt', 'w', encoding='utf-8') as f:
            f.write(body)
        # print(body)
        time.sleep(1)


# 获取章节
def get_chapter(soup,url,book_name):
    chapter_lists = soup.find(id='list-chapterAll')
    chapter_urls= chapter_lists.findAll('a')
    print('正在下载<<'+book_name+'>>')
    # 下载各章节
    download_chapter(chapter_urls,url,book_name)


# 保存信息
def get_info(soup,url):
    # 类型
    type_=soup.find(class_='breadcrumb').findAll('li')[1].a['title']
    #所有信息
    info = soup.find(class_='panel-body')
    # 图片
    img = info.find('img')['src']
    img = requests.get(img)
    # 作者,书名
    title_authoe = info.find(class_='bookTitle').text.split('/')
    # 书名
    title = title_authoe[0].replace(' ','')
    # 作者
    author = title_authoe[1]
    # 简介
    introduction=info.find(class_='text-muted').text.replace(' ','')
    # print(introduction)
    try:
        os.makedirs('笔趣阁/'+title)
    except:
        pass
    # 保存书名,类型,作者,简介
    with open('笔趣阁/'+title+'/'+'info.csv', 'a+', encoding='utf-8', newline='') as f:
        writer = csv.writer(f)
        rows = [(title,author,type_,introduction)]
        writer.writerows(rows)
    # 保存书封皮
    with open('笔趣阁/' + title + '/' + 'img.jpg', 'wb') as f:
        f.write(img.content)
    # 开始下载个章节
    get_chapter(soup, url,title)

# 以1页为例
for i in range(1,2):
    # 打开本地文件夹
    with open('第'+str(i) + '页.txt', 'r', encoding='utf-8') as f:
        # 总共有30个小说
        for j in range(1,31):
            # 读取一行作为地址
            url = f.readline()
            html = requests.get(url, headers=head)
            html.encoding = html.apparent_encoding
            # 清洗好的源码
            soup = BS(html.text, "html.parser")
            get_info(soup,url)

看一下最终效果


转载:https://blog.csdn.net/qq_43630441/article/details/106650653
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场