python爬虫-小说(01)
一、分析网址
一般我们下载之前都需要看一下网页信息,进行分析实现的方式;
通常来说是从最底层向外一步步实现;
比如本次下载的小说是神道丹帝
先打开单章,然后分析单章的下载,实现之后我们再分析实现自动获取章节信息下载,章节下载也实现了,那下一步就是自动获取小说进行整本下载;
先打开单章,我们分析单章的下载
如图,也就是说我们访问单章的url从响应里面就可以获取到我们需要的章节内容和章节标题;
接下来我们分析实现批量章节下载,其实也就是说我们只需要把这些章节的url都获取到,循环下载就可以,怎么获取呢,打开章节列表我们看一哈;
也就是说访问小说的章节列表我们就可以从响应里面获取到部分内容,我们自己拼接一下章节的url不就出来了,这样不就可以获取到小说的所有章节url地址,那岂不是说我们就可以进行全部下载下来了;
二、实现方式
大致的操作我们可以分为三个动作:定义一个获取章节url方法、定义一个下载单章内容方法、调用方法实现下载。
1、定义一个获取章节url方法
# 获取章节的id生成url,传入小说的url
def get_id(url):
res = requests.get(url).text
# 正则获取章节id
id = re.findall(r'href="/read/(.*?).html',res)
# 获取到的id列表中最后一位不是我们需要的所以需要裁掉
id = id[0:-1]
# 拼接成章节的url
for i in range(0,len(id)):
id[i] = 'https://www.bxwxorg.com/read/'+ id[i] + '.html'
print(id)
return id
2、定义一个下载单章内容方法
# 获取每一章的标题和内容写入文档
def get_test(url):
res = requests.get(url).text
# 获取章节名称
title = re.findall(r'>> 第(.*?)<script>textselect', res)
title = '第' + title[0]
# 获取章节小说内容
text = re.findall(r'<p>(.+)</p>', res)
with open('D:\\test1\\111.txt', 'ab') as f: # 这里用的是ab 实现追加写入
# 把标题写入文件
f.write('\n'.encode())
f.write(title.encode())
# 由于获取到的小说内容包含一些我们不想要的信息,需要裁掉text[4:-7]
for i in text[4:-7]:
# str对象转换,write方法只能下载bytes对象
i = i.encode()
f.write('\n'.encode())
# 章节内容写入文档
f.write(i)
print(title + '下载完成')
3、调用两个方法实现下载
url = 'https://www.bxwxorg.com/read/143981/'
# 输入小说的url地址获取到章节的url列表
url_list = get_id(url)
# 循环取出url链接进行下载
for f_url in url_list:
# 调用get_test方法下载小说
get_test(f_url)
三、代码
import re
import requests
# 获取章节的id生成url,传入小说的url
def get_id(url):
res = requests.get(url).text
# 正则获取章节id
id = re.findall(r'href="/read/(.*?).html',res)
id = id[0:-1]
# 拼接成章节的url
for i in range(0,len(id)):
id[i] = 'https://www.bxwxorg.com/read/'+ id[i] + '.html'
print(id)
return id
# 获取每一章的标题和内容写入文档
def get_test(url):
res = requests.get(url).text
# 获取章节名称
title = re.findall(r'>> 第(.*?)<script>textselect', res)
title = '第' + title[0]
text = re.findall(r'<p>(.+)</p>', res)
with open('D:\\test1\\111.txt', 'ab') as f:
f.write('\n'.encode())
f.write(title.encode())
for i in text[4:-7]:
# str对象转换
i = i.encode()
f.write('\n'.encode())
f.write(i)
print(title + '下载完成')
url = 'https://www.bxwxorg.com/read/143981/'
# 输入小说的url地址获取到章节的url列表
url_list = get_id(url)
# 循环取出url链接进行下载
for f_url in url_list:
# 调用get_test方法下载小说
get_test(f_url)
四、遗留
这是下载单本小说,下一步可以从小说列表中获取到小说的url列表和小说名称
进行批量下载。