前期准备:
(1) 安装 requests(获取整个网页的HTML信息)
在cmd中,使用如下指令安装requests:
pip install requests
(2)安装 beautifulsoup4(解析HTML信息,提取我们需要的内容)
在cmd中,使用如下指令安装requests:
pip install beautifulsoup4
(3)确定文章链接(http://www.xbiquge.la/13/13959/5939025.html)
先获取页面
# -*- coding:UTF-8 -*-
import requests
if __name__ == '__main__':
target = 'http://www.xbiquge.la/13/13959/5939025.html'
req = requests.get(url=target)
req.encoding = 'UTF-8' # 获取到的页面会是乱码,需要转码
html = req.text
print(html)
再使用BeautifulSoup获取自己需要的内容
# -*- coding:UTF-8 -*-
import requests
from bs4 import BeautifulSoup
if __name__ == '__main__':
target = 'http://www.xbiquge.la/13/13959/5939025.html'
req = requests.get(url=target)
req.encoding = 'UTF-8' # 获取到的页面会是乱码,需要转码
html = req.text
bf = BeautifulSoup(html, features="html.parser") # 我使用了我系统中可用的最佳HTML解析器("html.parser")
texts = bf.find_all("div", id="content") #提取网页中id为content的div模块,返回的结果是一个列表
print(texts[0].text.replace('\xa0' * 8, '\n\n')) #使用text属性,提取文本内容,滤除br标签,随后使用replace方法,去掉下图的八个空格符号,并用回车代替
注意:这里是通过id来获取相应模块,如果是通过class来获取模块,则需要加入下划线(class_),因为python中class是关键字
上面运行完之后,可能在pyCharm中运行的结果与cmd中不一致,cmd中完整爬取了数据,而pyCharm中只有后面一段
这是因为显示不全,实际上数据已经获取到
有了以上基础,我们对章节目录进行获取
import requests
from bs4 import BeautifulSoup
req = requests.get(url = 'http://www.xbiquge.la/13/13959/')
req.encoding = 'UTF-8' # 获取到的中文会是乱码,需要转码
html = req.text
div_bf = BeautifulSoup(html, features="html.parser")
div = div_bf.find_all('div', id = 'list')
print(div)
可以看到输出结果为
爬取到的数据有章节名和对应的超链接,这时候我们需要的就是将章节名称和超链接提取出来,而超链接的格式便是网页的server+提取的数据。
div = div_bf.find_all('div', id = 'list')
a_bf = BeautifulSoup(str(div[0]), features="html.parser")
a = a_bf.find_all('a') #获取章节链接
self.nums = len(a) #统计章节数
最后我们将代码整合,并加上文件存储模块,以下为完整代码
# -*- coding:UTF-8 -*-
import requests,sys
from bs4 import BeautifulSoup
class getNovel(object):
def __init__(self):
self.server = 'http://www.xbiquge.la/' #接章节链接
self.target = 'http://www.xbiquge.la/13/13959/' #小说主页
self.names = [] #存放章节名
self.urls = [] #存放章节链接
self.nums = 0 #章节数
"""
将爬取的文章内容写入文件
Parameters:
name - 章节名称(string)
path - 当前路径下,小说保存名称(string)
text - 章节内容(string)
Returns:
无
"""
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')
"""
爬取的文章内容
Parameters:
target - 内容路径
Returns:
文章内容
"""
def get_content(self,target):
req = requests.get(url=target, headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36",
"Cookie": "_abcde_qweasd=0; Hm_lvt_169609146ffe5972484b0957bd1b46d6=1583122664; bdshare_firstime=1583122664212; Hm_lpvt_169609146ffe5972484b0957bd1b46d6=1583145548",
"Host": "www.xbiquge.la"})
req.encoding = 'UTF-8' # 获取到的中文会是乱码,需要转码
html = req.text
bf = BeautifulSoup(html, features="html.parser") # 我使用了我系统中可用的最佳HTML解析器("html.parser")
texts = bf.find_all("div", id="content") # 提取网页中id为content的div模块,返回的结果是一个列表
if (len(texts) ==0 ):
content = "未获取到章节内容"
else:
content = texts[0].text.replace('\xa0' * 8, '\n\n') # 使用text属性,提取文本内容,滤除br标签,随后使用replace方法,去掉下图的八个空格符号,并用回车代替
return content
"""
函数说明:获取下载链接
Parameters:
无
Returns:
无
Modify:
2017-09-13
"""
def get_novel_url(self):
req = requests.get(url = self.target)
req.encoding = 'UTF-8' # 获取到的中文会是乱码,需要转码
html = req.text
div_bf = BeautifulSoup(html, features="html.parser")
div = div_bf.find_all('div', id = 'list')
a_bf = BeautifulSoup(str(div[0]), features="html.parser")
a = a_bf.find_all('a') #获取章节链接
self.nums = len(a) #剔除不必要的章节,并统计章节数
for each in a:
self.names.append(each.string)
self.urls.append(self.server + each.get('href'))
if __name__ == '__main__':
gn = getNovel()
gn.get_novel_url()
print('《圣墟》开始下载:')
for i in range(gn.nums):
gn.writer(gn.names[i], '圣墟.txt', gn.get_content(gn.urls[i]))
sys.stdout.write("\r 已下载:{0:.3f}".format(i/gn.nums)) #加“\r”刷新
sys.stdout.flush()
print('《圣墟》下载完成')
爬取结果: