相信我们常常会有想看的小说,但是不能下载,导致无法在没网的环境下观看。。下面将解一下如何用python3爬取网络小说。
本文主要是用于学习,希望大家支持正版。
首先我们需要两个包,我们分别是requests和beautifulsoup4
我们只要在cmd命令分别运行
pip install requests
pip install beautifulsoup4
即可安装,安装好以后我们先去小说网站寻找url,我找的是土豆的元尊,网址如下:https://www.hehuamei.com//1/1138/975876.html 我们在网址中打开元素审查,将鼠标放到对应的html元素时,他会自动定位相应位置,我们找到正文的元素位置:
接下来我们可以来编写代码:
首先我们要拿到整个页面的html代码,然后从其中解析出我们想要的东西:
# -*- coding:UTF-8 -*-
import requests
if __name__ == '__main__':
target = 'https://www.hehuamei.com//1/1138/975876.html'
req = requests.get(url=target)
print(req.text)
运行结果如下:
接下来我们要解析拿到的东西,我们可以找到对应正文的html元素,可以看到,红圈中的就是我们要的正文:
所以我们,将原来代码修改一下,代码中 “\xa0”就是代表空格,由上图可知,正文很多地方出现了 所以我们把那些出现四次空格的换成换行:
# -*- coding:UTF-8 -*-
import requests
from bs4 import BeautifulSoup
if __name__ == '__main__':
target = 'https://www.hehuamei.com/1/1138/'
req = requests.get(url=target)
html = req.text
bf = BeautifulSoup(html)
texts = bf.find_all('div', id='content') #用于将所拿到的html解析,只留取其中id为content的部分
print(texts[0].text.replace('\xa0' * 4, '\n\n')) #我们拿到的文章就只有长长的一行,所以我们将其中的空格改为换行
运行显示如下:
拿到一章节的内容以后,我们再获取全部章节的内容,我们需要做的就是将拿到每一章的URL,因为这些章节的URL前面都是一样的,所以我们可以很方便得写出来,其中server + index.get(‘href’)为章节的地址,index.string为章节名;
# -*- coding:UTF-8 -*-
from bs4 import BeautifulSoup
import requests
if __name__ == "__main__":
server = 'https://www.hehuamei.com/' #小说网站网址
target = 'https://www.hehuamei.com/1/1138/' #元尊小说目录网址
req = requests.get(url=target)
html = req.text
div_bf = BeautifulSoup(html)
div = div_bf.find_all('div', id='list') #解析目录,拿到目录中所有id为list的元素
a_bf = BeautifulSoup(str(div[0]))
a = a_bf.find_all('a') #拿到的html为一个超链接标签,所以去掉‘a’
for each in a:
print(each.string, server + each.get('href'))
代码运行效果:
接下来,我们只要将上面两个代码发到两个函数中,
主函数创建文件夹,再调用获取章节和章节网站的代码(即上述的第三段代码)
而获取章节的代码在进入循环时,调用获取正文的代码,并将第几章,和对应章节的地址传给他
综合一下代码;
# -*- coding:UTF-8 -*-
from bs4 import BeautifulSoup
import requests
import os ,sys
def one(a,b):
target = a
req = requests.get(url=target)
html = req.text
bf = BeautifulSoup(html)
texts = bf.find_all('div', id='content')
os.getcwd()
os.chdir(r'G:\pycharm\aaa\元尊小说')
fobj = open(b+".txt", 'a',encoding='utf-8')
text=texts[0].text.replace('\xa0' * 4, '\n\n')
fobj.write(text)
def two():
server = 'https://www.hehuamei.com/'
target = 'https://www.hehuamei.com/1/1138/'
req = requests.get(url=target)
html = req.text
div_bf = BeautifulSoup(html)
div = div_bf.find_all('div', id='list')
a_bf = BeautifulSoup(str(div[0]))
a = a_bf.find_all('a')
for each in a:
#print(each.string, server + each.get('href'))
one(server + each.get('href'),each.string)
if __name__ == "__main__":
path="元尊小说"
os.mkdir(path)
print("目录已创建")
two()
特别简单,我们运行,就可以在项目的目录下找到对应的文件,数量有点多,所以运行时间会有点长: