相信我们常常会有想看的小说,但是不能下载,导致无法在没网的环境下观看。。下面将解一下如何用python3爬取网络小说。
本文主要是用于学习,希望大家支持正版。
首先我们需要两个包,我们分别是requests和beautifulsoup4
我们只要在cmd命令分别运行
pip install requests
pip install beautifulsoup4
即可安装,安装好以后我们先去小说网站寻找url,我找的是土豆的元尊,网址如下:https://www.hehuamei.com//1/1138/975876.html 我们在网址中打开元素审查,将鼠标放到对应的html元素时,他会自动定位相应位置,我们找到正文的元素位置:

python爬虫下载GitHub python爬虫下载小说_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)

运行结果如下:

python爬虫下载GitHub python爬虫下载小说_超链接_02


接下来我们要解析拿到的东西,我们可以找到对应正文的html元素,可以看到,红圈中的就是我们要的正文:

python爬虫下载GitHub python爬虫下载小说_html_03


所以我们,将原来代码修改一下,代码中 “\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'))	#我们拿到的文章就只有长长的一行,所以我们将其中的空格改为换行

运行显示如下:

python爬虫下载GitHub python爬虫下载小说_python爬虫下载GitHub_04


拿到一章节的内容以后,我们再获取全部章节的内容,我们需要做的就是将拿到每一章的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'))

代码运行效果:

python爬虫下载GitHub python爬虫下载小说_html_05


接下来,我们只要将上面两个代码发到两个函数中,

主函数创建文件夹,再调用获取章节和章节网站的代码(即上述的第三段代码)

而获取章节的代码在进入循环时,调用获取正文的代码,并将第几章,和对应章节的地址传给他

综合一下代码;

# -*- 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()

特别简单,我们运行,就可以在项目的目录下找到对应的文件,数量有点多,所以运行时间会有点长:

python爬虫下载GitHub python爬虫下载小说_html_06