最近在学习python的爬虫知识,所以找了一些小说网站爬取电子书练练手
本次爬取的是顶点小说网站的斗破苍穹,好久没看了,爬取来稳固一下以前的经典小说。
用到的python模块有requests,sys,这是系统自带的不需要下载,还有就是BeautifulSoup,这个主要对html的元素做处理的强大模块
不多说了,上代码
下面准备一些变量,比如我们要爬取的小说链接,章节的数量,章节名等等
def __init__(self):
self.server = ''
self.target = 'https://www.23us.so/files/article/html/24/24420/index.html' #斗破苍穹链接
self.names = [] #存放章节名
self.urls = [] #存放章节链接
self.nums = 0 #章节数
我们先打开我们爬取的链接观察我们需要爬取的内容,这个table标签记录着斗破苍穹所有的章节名称,我们可以通过BeautifulSoup对HTML元素的处理,得到我们要的章节名字,以及这些章节名字的链接
刚刚我们看了table表格里面装着所有的章节标签,而且id是为at,所以我们可以利用BeautifulSoup的find_all(‘table’,id=‘at’)得到章节区域,然后再find_all(‘a’)得到所有的a标签即是章节名称,然后再通过a标签的href属性得到每个章节的内容
下面我们来爬取所有的章节以及各个章节的链接
def geturl(self):
url=requests.get(url=self.target)
html = url.text.encode(url.encoding).decode('utf-8')
bs = BeautifulSoup(html)
#得到章节区域,
table = bs.find_all('table',id='at')
#过滤标签,得到a标签,章节列表
a = table[0].find_all('a')
#章节数量
self.nums = len(a)
#遍历所有的a标签,得到a标签的href属性,即是每个章节的内容
for each in a:
self.names.append(each.string)
self.urls.append(self.server + each.get('href'))
接下来我们爬取每个章节的内容,我们还是找内容区域在html的哪一个元素里面,从下图我们可以看出,小说的内容都在dd标签,而且id为contents,所以我们可以用BeautifulSoup的find_all匹配小说的内容
def getcontent(self,target):
url = requests.get(url=target)
html = url.text.encode(url.encoding).decode('utf-8')
bs = BeautifulSoup(html)
content = bs.find_all('dd',id='contents')
#text属性过滤br标签
content = content[0].text
return content
得到内容后,我们就应该把每个章的章节内容存储起来
def writer(self, name, path, text):
write_flag = True
with open(path, 'a', encoding='utf-8') as f:
f.write(name + '\n')
f.writelines(text)
f.write('\n\n')
最后我们整理一下这些代码,完整的代码如下
# -*- coding:UTF-8 -*-
import requests
import sys
from bs4 import BeautifulSoup
class downloader(object):
def __init__(self):
self.server = ''
self.target = 'https://www.23us.so/files/article/html/24/24420/index.html'
self.names = [] #存放章节名
self.urls = [] #存放章节链接
self.nums = 0 #章节数
def writer(self, name, path, text):
write_flag = True
with open(path, 'a', encoding='utf-8') as f:
f.write(name + '\n')
f.writelines(text)
f.write('\n\n')
def geturl(self):
url=requests.get(url=self.target)
html = url.text.encode(url.encoding).decode('utf-8')
bs = BeautifulSoup(html)
#得到章节区域
table = bs.find_all('table',id='at')
#过滤标签,得到a标签,章节列表
a = table[0].find_all('a')
#章节数量
self.nums = len(a)
for each in a:
self.names.append(each.string)
self.urls.append(self.server + each.get('href'))
def getcontent(self,target):
url = requests.get(url=target)
html = url.text.encode(url.encoding).decode('utf-8')
bs = BeautifulSoup(html)
content = bs.find_all('dd',id='contents')
#text属性过滤br标签
content = content[0].text
return content
if __name__ == "__main__":
dl = downloader()
dl.geturl()
for i in range(dl.nums):
dl.writer(dl.names[i], '斗破苍穹.txt', dl.getcontent(dl.urls[i]))
sys.stdout.write(" 已下载:%.3f%%" % float(i/dl.nums) + '\r')
sys.stdout.flush()
print('《斗破苍穹》下载完成')
我们打开命令提示符,然后python 运行我们的python脚本,开始爬取电子书
好了,这样我们就爬取整本斗破苍穹的电子书了,再也不用自己去百度搜全本电子书来下载了。