python爬取小说
在网上看小说,会受到网络的影响,时不时会加载不出来。因此为了看得更舒服,本文使用python将网页上的小说爬取下来并且保存为txt。
一、需要的导入的库
from fake_useragent import UserAgent
from bs4 import BeautifulSoup
import time
import requests
import re
二、下载函数
这个函数实际上包含了两个部分:一个是读取网页源代码,并从源代码里面筛选出小说内容;一部分是“爬”,这一部分是精髓。
def download(url, file_path):
'''
传入小说章节页面的网址,以及下载小说的路径。
就可以下载小说,并且存储到指定路径的文件当中。
返回下一章的网址
'''
#获得静态网页
res = requests.get(url,params=req_header)
res.encoding ='UTF-8'
soups = BeautifulSoup(res.text,"html.parser")
#选出章节标题,并进行处理
title = str(soups.select('title'))
title1 = re.sub(r'<[^>]+>|\xa0', '', title)
c_title = title1.replace('_红楼春_穿越小说_笔趣阁', '')
print(c_title)
#选出章节内容,并进行处理
content = str(soups.find_all('div',{'id':{'content'}}))
content1 = re.sub(r'<[^>]+>','\r\n', content)
c_content = re.sub(r'\xa0|\n[\s| ]*\r', '', content1)
#将内容与标题写入文件
f.write(c_title)
f.write(c_content)
#选出下一章链接
bottem = soups.find('div',{'class':'bottem'}).find_all('a')[3]
if 'href' in bottem.attrs:
return bottem.attrs['href']
2.1下载本页小说
2.1.1、定位小说内容在哪里。
content = str(soups.find_all('div',{'id':{'content'}}))
2.1.2、去除标签
在网页中小说内容全部都是加杂标签的,如下图。因此需要将标签去掉,去掉标签的方式就是使用正则表达式。
content1 = re.sub(r'<[^>]+>','\r\n', content)
c_content = re.sub(r'\xa0|\n[\s| ]*\r', '', content1)
2.1.3、写入文件
#将内容与标题写入文件
f.write(c_title)
f.write(c_content)
2.2“爬”
#选出下一章链接
bottem = soups.find('div',{'class':'bottem'}).find_all('a')[3]
if 'href' in bottem.attrs:
return bottem.attrs['href']
三、主体
if __name__ == "__main__":
ua = UserAgent()
req_header= {'User-Agent':ua.random}
#定义基本信息字符串
txt=['title','author','update','update1','Introduction']
#小说章节目录url
#仅在该网站上的小说:https://www.biquge.info/
url = input("请输入小说主页网址:")
#获得静态网页
res = requests.get(url,params=req_header)
res.encoding ='UTF-8'
soups = BeautifulSoup(res.text,"html.parser")
#小说主要信息获得
txt[0] = '《'+ str(soups.h1) +'》'
txt[1] = soups.select('#maininfo #info p')[0] #info下第一个标签p的值
txt[2] = soups.select('#maininfo #info p')[2] #最新更新时间
txt[3] = soups.select('#maininfo #info p')[3] #最新更新章节
txt[4] = soups.select('#maininfo #intro p')[0] #小说简介
txt[0] = re.sub(r'<[^>]+>', '', str(txt[0]))
file_path = "D:\\BOX\\code\\python\\下载文件\\小说\\" + txt[0] + ".txt"
f = open(file_path, 'a', encoding='utf-8')
for i in [1, 2, 3, 4]:
txt[i] = re.sub(r'<[^>]+>', '', str(txt[i]))
#将小说信息录入文件
f.write(txt[i]+'\n')
if i == 4:
f.write("********************"+'\n\n')
#小说目录
content = soups.select('#list dl dd')
#小说总章数
c_num = len(content)
#实际下载小说章数
c_num_1 = 0
print(txt[0])
print("小说共",c_num,"章。")
#选出第一章url
for link in content[0].find_all('a'):
if 'href' in link.attrs:
href = url + link.attrs['href']
for k in range(c_num):
href = download(href, file_path)
c_num_1 = c_num_1+1
if c_num_1 == c_num :
print("全部下载完成,程序结束。")
else :
print("缺少章节。", c_num-c_num_1, "章。")
print("实际已下载:", c_num_1, "章。")
f.close()
四、全部程序
注意不同小说网站的爬取方式不一定相同,因此,需要根据实际的网站进行局部修改。
除此之外,文件储存路径也是需要修改的。
from fake_useragent import UserAgent
from bs4 import BeautifulSoup
import requests
import re
import random
def download(url, file_path):
'''
传入小说章节页面的网址,以及下载小说的路径。
就可以下载小说,并且存储到指定路径的文件当中。
返回下一章的网址
'''
#获得静态网页
res = requests.get(url,params=req_header)
res.encoding ='UTF-8'
soups = BeautifulSoup(res.text,"html.parser")
#选出章节标题,并进行处理
title = str(soups.select('title'))
title1 = re.sub(r'<[^>]+>|\xa0', '', title)
c_title = title1.replace('_红楼春_穿越小说_笔趣阁', '')
print(c_title)
#选出章节内容,并进行处理
content = str(soups.find_all('div',{'id':{'content'}}))
content1 = re.sub(r'<[^>]+>','\r\n', content)
c_content = re.sub(r'\xa0|\n[\s| ]*\r', '', content1)
#选出下一章链接
bottem = soups.find('div',{'class':'bottem'}).find_all('a')[3]
#将内容与标题写入文件
f.write(c_title)
f.write(c_content)
if 'href' in bottem.attrs:
return bottem.attrs['href']
if __name__ == "__main__":
ua = UserAgent()
req_header= {'User-Agent':ua.random}
#定义基本信息字符串
txt=['title','author','update','update1','Introduction']
#小说章节目录url
#仅在该网站上的小说:https://www.biquge.info/
url = input("请输入小说主页网址:")
#获得静态网页
res = requests.get(url,params=req_header)
res.encoding ='UTF-8'
soups = BeautifulSoup(res.text,"html.parser")
#小说主要信息获得
txt[0] = '《'+ str(soups.h1) +'》'
txt[1] = soups.select('#maininfo #info p')[0] #info下第一个标签p的值
txt[2] = soups.select('#maininfo #info p')[2] #最新更新时间
txt[3] = soups.select('#maininfo #info p')[3] #最新更新章节
txt[4] = soups.select('#maininfo #intro p')[0] #小说简介
txt[0] = re.sub(r'<[^>]+>', '', str(txt[0]))
file_path = "D:\\BOX\\code\\python\\下载文件\\小说\\" + txt[0] + ".txt"
f = open(file_path, 'a', encoding='utf-8')
for i in [1, 2, 3, 4]:
txt[i] = re.sub(r'<[^>]+>', '', str(txt[i]))
#将小说信息录入文件
f.write(txt[i]+'\n')
if i == 4:
f.write("********************"+'\n\n')
#小说目录
content = soups.select('#list dl dd')
#小说总章数
c_num = len(content)
#实际下载小说章数
c_num_1 = 0
print(txt[0])
print("小说共",c_num,"章。")
#选出第一章url
for link in content[0].find_all('a'):
if 'href' in link.attrs:
href = url + link.attrs['href']
for k in range(c_num):
href = download(href, file_path)
c_num_1 = c_num_1+1
if c_num_1 == c_num :
print("全部下载完成,程序结束。")
else :
print("缺少章节。", c_num-c_num_1, "章。")
print("实际已下载:", c_num_1, "章。")
f.close()
五、运行截图
1、获取网址
2、运行程序,输入网址
3、程序结束