python爬取电子书

最近在学习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元素的处理,得到我们要的章节名字,以及这些章节名字的链接
python爬取电子书_第1张图片

刚刚我们看了table表格里面装着所有的章节标签,而且id是为at,所以我们可以利用BeautifulSoup的find_all(‘table’,id=‘at’)得到章节区域,然后再find_all(‘a’)得到所有的a标签即是章节名称,然后再通过a标签的href属性得到每个章节的内容

python爬取电子书_第2张图片

下面我们来爬取所有的章节以及各个章节的链接

	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匹配小说的内容
python爬取电子书_第3张图片

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脚本,开始爬取电子书

python爬取电子书_第4张图片

python爬取电子书_第5张图片

好了,这样我们就爬取整本斗破苍穹的电子书了,再也不用自己去百度搜全本电子书来下载了。

你可能感兴趣的:(学习笔记)