●前言
前面咱们初步了解了爬虫的步骤以及bs4,并且学习了如何批量爬取图片,想必各位都对爬虫有了基本的了解,当然在学习爬虫之前,还是建议先掌握好python基础,并且对html,css,js以及ajax等知识有一些基本的了解,然后就可以愉快的爬了,好了,回归正题,今天我们来看看如何爬取小说。
●全球高武
给大家安利一本名为《全球高武》的小说,正版出自起点中文网,常常高居榜一,内容非常得劲,可惜收费,这篇文章就教大家如何白嫖,当然有能力的小伙伴还是建议支持下正版,毕竟作者创作不易,没能力的话就跟着我一起白嫖吧。
●准备工作
1.背景介绍
网站:笔趣阁
https://www.biduo.cc
笔趣阁,一个无广告无弹窗的优质盗版小说网站,但是只支持在线浏览,并不支持下载和打包,今天就教大家如何下载这里的小说。
2.安装bs4和lxml
pip install beautifulsoup4 # cmd安装BeautifulSoup4
或者
easy_install beautifulsoup4
pip install lxml # 安装lxml解释器
●小试牛刀
1.分析网页,构造章节链接
进入笔趣阁官网,搜索书名,进入目录页
F12调试,定位目录位置,找到章节链接
模拟请求,并解析页面,获取名为list的div内容
from bs4 import BeautifulSoup
import requests
url = 'https://www.biduo.cc/biquge/14_14141/'
res = requests.get(url=url, timeout=30)
html = res.text
bf = BeautifulSoup(html, 'lxml')
div = bf.find_all('div', id='list')
print(div)
我们可以看到章节的链接和章节名都获取到了,下面我们把它们提取出来并存放在列表里供后续使用
server = 'https://www.biduo.cc' # 主域名,拼接章节链接使用
a_bf = BeautifulSoup(str(div[0]), 'lxml')
a = a_bf.find_all('a')
names = []
urls = []
for each in a:
names.append(each.string)
urls.append(server + each.get('href'))
print(names)
print(urls)
2.根据章节链接解析章节内容
上面我们获取了所有的章节名称及其链接,接着我们来获取每一章的具体内容,先以第一章为例:https://www.biduo.cc/biquge/14_14141/c4280483.html
和上面一样,定位内容所在div,解析一下
from bs4 import BeautifulSoup
import requests
url = 'https://www.biduo.cc/biquge/14_14141/c4280483.html'
res = requests.get(url=url, timeout=30)
html = res.text
bf = BeautifulSoup(html, 'lxml')
div = bf.find_all('div', id='content')
print(div)
获取里面的文本内容
texts = div[0].text # .replace('\xa0' * 4, '\n\n')
print(texts)
我们可以看出每一行内容之间是四个空格隔开了,把它们替换成换行符格式化下
texts = div[0].text.replace('\xa0' * 4, '\n\n')
print(texts)
接下来就是把我们获取到的内容保存下来了。
3.保存小说
texts = div[0].text.replace('\xa0' * 4, '\n\n')
path = '全球高武.txt'
with open(path, 'a', encoding='utf-8') as f:
f.write(texts)
f.close()
4.完整代码
整合一下,加上下载进度和保存内容的格式化等
from bs4 import BeautifulSoup
import requests
import sys
class GetNovel(object):
"""
笔趣阁小说下载
"""
def __init__(self, targets, paths, titles):
self.server = 'https://www.biduo.cc'
self.target = targets
self.path = paths
self.title = titles
def geturls(self):
res = requests.get(url=self.target, timeout=30)
html = res.text
bf = BeautifulSoup(html, 'lxml')
div = bf.find_all('div', id='list')
a_bf = BeautifulSoup(str(div[0]), 'lxml')
a = a_bf.find_all('a')
names = []
urls = []
for each in a:
names.append(each.string)
urls.append(self.server + each.get('href')) # 构造完整链接
return names, urls
@staticmethod
def gettexts(url):
res = requests.get(url=url, timeout=30)
html = res.text
bf = BeautifulSoup(html, 'lxml')
div = bf.find_all('div', id='content')
texts = div[0].text.replace('\xa0' * 4, '\n\n')
return texts
def main(self):
print('准备下载小说......')
names, urls = self.geturls()
for name, url in zip(names, urls):
texts = self.gettexts(url)
with open(self.path, 'a', encoding='utf-8') as f:
f.write('\xa0' * 20 + name + '\n')
f.write(texts)
f.write('\n\n')
sys.stdout.write(self.title + '正在下载中,[进度]:%.3f%%' % float(((names.index(name) + 1) / (len(names)))) + '\r')
sys.stdout.flush()
if __name__ == "__main__":
index = input('请输入书籍编号,编号获取方式,访问https://www.biduo.cc,点开书籍,biquge/后面即是编号')
target = 'https://www.biduo.cc/biquge/' + index + '/'
path = input('请输入保存文件路径及名称,如'r'C:\Users\Administrator\Desktop'',默认桌面输入1')
if path == '1':
path = r'C:\Users\Administrator\Desktop'
title = input('请输入小说名称,如 全球高武')
novel = GetNovel(target, path + '\\' + title + '.txt', title)
novel.main()
效果图和结果:
●后记
还是之前那句话,做一个文明的spider,满足自己的需求即可,切勿给别人服务器造成过大的压力,大家好才是真的好!
对python感兴趣的朋友们可以关注本公众号,会不定时更新一些python基础、网络爬虫、数据分析等知识,也欢迎大家前来探讨交流,公众号加星标,不迷路!