爬取笔趣阁小说网站上的所有小说(二)
网址为: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
查看评论