通过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

 

 

### 编写Python爬虫程序抓取番茄小说网内容 为了实现从番茄小说网站抓取小说内容将其保存本地文件的功能,可以按照以下方法构建爬虫程序。以下是详细的说明: #### 安装所需依赖库 在开始之前,需要安装几个重要的Python库以支持数据抓取和处理功能: ```bash pip install requests beautifulsoup4 lxml pandas openpyxl ``` - `requests`:用于发起HTTP请求[^1]。 - `beautifulsoup4` 和 `lxml`:用于解析HTML页面结构。 - `pandas`:用于将数据整理成表格形式以便后续操作。 #### 抓取流程概述 通过分析目标网站(如番茄小说),通常会涉及以下几个主要步骤: 1. **访问主页**:利用`requests.get()`函数加载指定URL下的网页源码。 2. **提取链接列表**:使用`BeautifulSoup`定位所有指向具体章节或者书籍详情页的超链接地址。 3. **逐章读取正文内容**:进入每一个单独章节页面后,继续采用相同方式抽取纯文字部分作为最终成果之一。 4. **保存至文件系统**:最后把收集来的全部段落按顺序组合起来存入TXT文档或者其他格式当中去。 下面给出一段示范性的代码片段展示上述逻辑的具体实施办法: ```python import os import time from bs4 import BeautifulSoup as soup import requests def fetch_chapter(url): headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0 Safari/537.36'} response = requests.get(url=url,headers=headers) html_content=response.text parsed_html=soup(html_content,"lxml") title=parsed_html.find('h1').get_text() content_div=parsed_html.select_one("#content").stripped_strings full_txt="" for line in content_div: full_txt+=line+"\n" return {"title":title , "text":full_txt} if __name__=='__main__': base_url="https://www.tomatobooks.com/book/chapters/" output_folder="./novels/" if not os.path.exists(output_folder): os.mkdir(output_folder) chapter_links=["chapter_{}.html".format(i+1)for i in range(10)] for link in chapter_links[:]: abs_link=base_url+link try: result=fetch_chapter(abs_link) filename=os.path.join(output_folder,result["title"]+".txt") with open(filename,'w',encoding='utf8')as fobj: fobj.write(result['text']) print(f"{result['title']} 已成功下载.") time.sleep(2)# 防止频繁请求被封禁 except Exception as e: print(e) continue ``` 此脚本实现了基本的小说章节抓取与存储功能,考虑到了一定的异常处理机制以及合理的等待间隔设置以防IP封锁等问题发生[^2]。 --- ###
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Link Line

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

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

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

打赏作者

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

抵扣说明:

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

余额充值