通过Python爬虫实现爬取某小说网站小说并保存到本地

 

背景

前日在某小说网站上看到了一部心仪的小说,但因环境限制,我决定把它爬取到本地,随时随地都可以看(嘿嘿嘿)

实现

获取一个章节内容

我们首先需要用request库获取网址相关内容,获取代码如下

import requests

url = 'https://www.uuks5.com/book/801979/434711557.html'  # 输入我们的url
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0'
    }  # 设置我们的headers
get = requests.get(url, headers=headers).text

获取到网页内容后,就到解析网页了,通过lxml库进行解析

首先需要转换格式

selector = etree.HTML(get)  # 将源码转换为xpath可以识别的TML格式

8d642e39ae6649fbbff75d43c5e8ac58.png 通过观察该网站的元素可以发现文章的标题部分在id="mlfy_main_text"的div下的h元素的text部分 

225bf58331a3437b94f22099f670d3d8.png 

同样可以发现文章正文部分在class="read-content"的div下的p元素的text部分

cf172dc0c5e34ce1aa087307dabd7b18.png

因此通过以上这些特征进行解析

title = selector.xpath('//div[@id="mlfy_main_text"]/h1/text()')  #标题部分内容
data = selector.xpath('//div[@class="read-content"]/p/text()')  #正文部分内容

 运行后title的结果

0d086af3a78441fda7021013a3ac7d90.png

运行后data的结果

ac287d218eac4609a192714806a1d60e.png

因此我们可以发现,如此下来输出的均为list形式,但是我们需要的是list里的元素

所以,现在进行获取

for i in data:
    print(i)

输出后可以发现,已经全部为文本了

944c60c41c7a4b95b143852b8b8846ea.png

 

现在我们已经可以将一个章节的内容获取下来了。

获取全部内容

通过观察可以发现,切换不同章节是的网址是无顺序的,因此我们首先需要获取每一章节所对应的网址

在这本书的目录网址中我们可以发现每一章的网址在class="lazyrender"的li下的a元素中,其herf就是网址

b13b22f1086f4c23b21a6b3e44975dac.png

所以我们故伎重演,再次将其获取出来,代码如下

import requests
from lxml import etree
url = 'https://www.uuks5.com/book/801979/'  # 输入我们的url
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0'
}  # 设置我们的headers
get = requests.get(url, headers=headers).text  # get(url) 得到我们的网页, text将源网页转化为字符串
selector = etree.HTML(get)  # 将源码转换为xpath可以识别的TML格式
data = selector.xpath('//li[@class="lazyrender"]/a/@href')
for i in data:
    print(i)


运行后输出结果如下

e47d825cbefa4520a55dc0f5eec69664.png

与图片中的herf值一模一样

将获取网址的代码写成一个函数,放到之前写的获取单个章节代码之前,类似与这样

fe2614d8ce194d29b751af340c3bb911.png

但是,我们可以发现获取到的网址是不全的,缺少了主域名,所以我们稍作一下修改,将上一章节的url改一下(注意不是函数里的)

0a5a0da29fb846f69df499b409aa38cf.png

然后就循环获取,除了保存的代码如下

import requests
from lxml import etree
def get_title_url():
    url = 'https://www.uuks5.com/book/801979/'  # 输入我们的url
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0'
    }  # 设置我们的headers
    get = requests.get(url, headers=headers).text  # get(url) 得到我们的网页, text将源网页转化为字符串
    selector = etree.HTML(get)  # 将源码转换为xpath可以识别的TML格式
    data = selector.xpath('//li[@class="lazyrender"]/a/@href')
    return data

for j in get_title_url():
    url = 'https://www.uuks5.com' + j  # 输入我们的url
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0'
    }  # 设置我们的headers
    get = requests.get(url, headers=headers).text  # get(url) 得到我们的网页, text将源网页转化为字符串
    selector = etree.HTML(get)  # 将源码转换为xpath可以识别的TML格式
    title = selector.xpath('//div[@id="mlfy_main_text"]/h1/text()')
    data = selector.xpath('//div[@class="read-content"]/p/text()')
    tltle = title[0]

输出后的结果类似与:

标题

正文

标题

正文

标题

正文

············

保存到文件

Python自带文件读写功能,我们只需要把以下代码加上即可(空格缩进凭个人喜好,自行调整)

with open('example.txt', 'a') as file:
    file.write(tltle)
for i in data:
    with open('example.txt', 'a') as file:
        file.write("\n        " + i)
with open('example.txt', 'a') as file:
    file.write("\n\n")

最后可以在循环里加上 (非必要)

print(title)

 这样我们就可以知道实时的爬取进度

全部代码

import requests
from lxml import etree
def get_title_url():
    url = 'https://www.uuks5.com/book/801979/'  # 输入我们的url
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0'
    }  # 设置我们的headers
    get = requests.get(url, headers=headers).text  # get(url) 得到我们的网页, text将源网页转化为字符串
    selector = etree.HTML(get)  # 将源码转换为xpath可以识别的TML格式
    data = selector.xpath('//li[@class="lazyrender"]/a/@href')
    return data

for j in get_title_url():
    url = 'https://www.uuks5.com' + j  # 输入我们的url
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0'
    }  # 设置我们的headers
    get = requests.get(url, headers=headers).text  # get(url) 得到我们的网页, text将源网页转化为字符串
    selector = etree.HTML(get)  # 将源码转换为xpath可以识别的TML格式
    title = selector.xpath('//div[@id="mlfy_main_text"]/h1/text()')
    data = selector.xpath('//div[@class="read-content"]/p/text()')
    tltle = title[0]
    with open('example.txt', 'a') as file:
        file.write(tltle)
    for i in data:
        with open('example.txt', 'a') as file:
            file.write("\n        " + i)
    with open('example.txt', 'a') as file:
        file.write("\n\n")
    print(tltle)

效果图

f68fbf5128b04cb88849f7113775d0c1.pngb132b15a693f41aeafd6fe8bd9415198.png489dc5e9d530442bb775fd4d0157f81f.jpeg0d1eddf797f5470a917a3ef3f768464d.jpeg

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Link Line

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值