初学——爬取新笔趣阁案例最新

2024-02-01 17:20

本文主要是介绍初学——爬取新笔趣阁案例最新,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这是作为新人小白的我第一次写博客,想想还是挺激动的。

首先写代码前,希望大家明白一件事。

代码的规范性。——————真的非常非常非常非常非常重要!

在这之前,我还没体会到代码规范的重要性,直到昨天,我收集项目实例的时候。——头都要大了

同样的需求,代码却千奇百怪,形形色色。我翻烂了github csdn都没找到能看懂的东东。

直到遇见它.......

作为一个爬虫萌新,分享要爬的当然是——————新笔趣阁啦

需求: 输入小说的ID实现爬取整本小说就是这串数字

ps:后面我用异步整出来 再分享异步操作

项目效果:

说再多不给人看都是耍流氓 来上效果

爬取的思路:

项目要用到的模块

import requests
import requests
from lxml import etree
from tqdm import tqdm  # 进度条模块

一、明确需求

先打开网址https://www.xbiquge.la/  随便打开一本小说的链接 任意打开一章节 我们来获取它的数据

# 构造请求头处理反爬 
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'}
# 请求网页内容 赋值给response
response = requests.get('https://www.xbiquge.la/10/10489/4535761.html',headers=headers)
# 答应网页的文本内容
print(response.text)

咦,请求网页返回的数据出现了乱码,这就需要我们解码了

加一行代码自动解码

response.encoding = response.apparent_encoding

 

二、解析数据

我们需要的数据有了,接下来是不是要解析数据啦

解析数据 我这里采用的是xpath解析,当然你也可以采用re bs4 css解析

用标签选择器定位到我们需要的文章标题的内容

这里对应的便是标题的内容了

右键 copy  ----copy xpath

同理 我们再获取小说的的内容

需要注意 我们这里提取到的是小说的列表

 

# 构建解析对象
tree = etree.HTML(response.text)
# 小说标题
title = tree.xpath('//div[@class="bookname"]/h1/text()')[0]
# 小说内容 返回的是列表
content_list = tree.xpath('//*[@id="content"]//text()')
# 将小说列表转化为字符串的形式
content_str = ''.join(content_list)
print(title,content_str)

这里你打印字符串 可能会缺少东西  没错的蛤 写入文件就正常了

三 持久化存储

file_name = f"{novel_name}.txt"
# 一定要记得加后缀.txt mode 保存方式 a是追加保存 encoding是保存编码
with open(file_name,mode='a',encoding='utf-8') as f:
# 写入标题f.write(title)
# 写入换行f.write('\n')
# 写入小说内容f.write(content)

保存一章小说这样就写完了,那如何获取完整的小说呢

这里的参数此时不用注意 是函数的参数 后面看完整代码即可 讲的是思路

整本小说爬虫

既然知道怎么爬取单章节内容了,那你是不是知道所有章节的url 使用函数传参到爬取单章节内容的代码 是不是就可以爬取全部内容了

我们用xpath解析首页的html内容提取 所有小说的url和小说的名字

 

所有的单章的url地址都在 dd 标签当中,但是这个url地址是不完整的,所以爬取下来的时候,要拼接url地址。

前面的前缀名+href的内容

def get_all_url(html_url):# 调用请求网页函数 获取到的是某个小说的首页response = get_response(html_url)# 解析我们需要的小说章节标题 章节url内容# 构成解析对象tree = etree.HTML(response.text)# 首页的所有章节urlall_url = tree.xpath('//*[@id="list"]/dl/dd/a/@href')# 小说的名字novel_name = tree.xpath('//*[@id="info"]/h1/text()')for url in tqdm(all_url):novel_url = 'https://www.xbiquge.la/'+url# 给get第一页函数传入参数 小说名字和链接get_one_novel(novel_name,novel_url)

tqdm的用法小伙伴们可以自行搜索学习 是一个进度条的效果

 

爬起整本小说代码

注释写的很详细 这是我结合很多大佬/很多案例总结出的,目前我认为的最优方法。

需要有python基础噢 有不懂得可以在下面交流讨论 

咱们下期见 ~~~~~

import requestsfrom lxml import etree
from tqdm import tqdmdef get_response(html_url):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'}response = requests.get(url=html_url,headers=headers)response.encoding = response.apparent_encodingreturn responsedef save(novel_name,title,content):""":param novel_name::param title::param content::return:"""file_name = f"{novel_name}.txt"# 一定要记得加后缀.txt mode 保存方式 a是追加保存 encoding是保存编码with open(file_name,mode='a',encoding='utf-8') as f:# 写入标题f.write(title)# 写入换行f.write('\n')# 写入小说内容f.write(content)def get_one_novel(name,novel_url):# 小说章节内容获取 #调用请求网页数据函数response = get_response(novel_url)# 构建解析对象tree = etree.HTML(response.text)# 小说标题title = tree.xpath('//div[@class="bookname"]/h1/text()')[0]# 小说内容 返回的是列表content_list = tree.xpath('//*[@id="content"]//text()')content_str = ''.join(content_list)save(name,title,content_str)def get_all_url(html_url):# 调用请求网页函数 获取到的是某个小说的首页response = get_response(html_url)# 解析我们需要的小说章节标题 章节url内容# 构成解析对象tree = etree.HTML(response.text)# 首页的所有章节urlall_url = tree.xpath('//*[@id="list"]/dl/dd/a/@href')# 小说的名字novel_name = tree.xpath('//*[@id="info"]/h1/text()')for url in tqdm(all_url):novel_url = 'https://www.xbiquge.la/'+url# 给get第一页函数传入参数 小说名字和链接get_one_novel(novel_name,novel_url)if __name__ == '__main__':novel_id = input('输入书名ID:格式:/15/15409/')url = f'https://www.xbiquge.la{novel_id}'get_all_url(url)

 

 

 

 

这篇关于初学——爬取新笔趣阁案例最新的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/667928

相关文章

Java方法重载与重写之同名方法的双面魔法(最新整理)

《Java方法重载与重写之同名方法的双面魔法(最新整理)》文章介绍了Java中的方法重载Overloading和方法重写Overriding的区别联系,方法重载是指在同一个类中,允许存在多个方法名相同... 目录Java方法重载与重写:同名方法的双面魔法方法重载(Overloading):同门师兄弟的不同绝

Springboot3 ResponseEntity 完全使用案例

《Springboot3ResponseEntity完全使用案例》ResponseEntity是SpringBoot中控制HTTP响应的核心工具——它能让你精准定义响应状态码、响应头、响应体,相比... 目录Spring Boot 3 ResponseEntity 完全使用教程前置准备1. 项目基础依赖(M

C++11中的包装器实战案例

《C++11中的包装器实战案例》本文给大家介绍C++11中的包装器实战案例,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录引言1.std::function1.1.什么是std::function1.2.核心用法1.2.1.包装普通函数1.2.

Redis 命令详解与实战案例

《Redis命令详解与实战案例》本文详细介绍了Redis的基础知识、核心数据结构与命令、高级功能与命令、最佳实践与性能优化,以及实战应用场景,通过实战案例,展示了如何使用Redis构建高性能应用系统... 目录Redis 命令详解与实战案例一、Redis 基础介绍二、Redis 核心数据结构与命令1. 字符

Python多任务爬虫实现爬取图片和GDP数据

《Python多任务爬虫实现爬取图片和GDP数据》本文主要介绍了基于FastAPI开发Web站点的方法,包括搭建Web服务器、处理图片资源、实现多任务爬虫和数据可视化,同时,还简要介绍了Python爬... 目录一. 基于FastAPI之Web站点开发1. 基于FastAPI搭建Web服务器2. Web服务

通过DBeaver连接GaussDB数据库的实战案例

《通过DBeaver连接GaussDB数据库的实战案例》DBeaver是一个通用的数据库客户端,可以通过配置不同驱动连接各种不同的数据库,:本文主要介绍通过DBeaver连接GaussDB数据库的... 目录​一、前置条件​二、连接步骤​三、常见问题与解决方案​1. 驱动未找到​2. 连接超时​3. 权限不

Java中的随机数生成案例从范围字符串到动态区间应用

《Java中的随机数生成案例从范围字符串到动态区间应用》本文介绍了在Java中生成随机数的多种方法,并通过两个案例解析如何根据业务需求生成特定范围的随机数,本文通过两个实际案例详细介绍如何在java中... 目录Java中的随机数生成:从范围字符串到动态区间应用引言目录1. Java中的随机数生成基础基本随

SpringMVC配置、映射与参数处理​入门案例详解

《SpringMVC配置、映射与参数处理​入门案例详解》文章介绍了SpringMVC框架的基本概念和使用方法,包括如何配置和编写Controller、设置请求映射规则、使用RestFul风格、获取请求... 目录1.SpringMVC概述2.入门案例①导入相关依赖②配置web.XML③配置SpringMVC

Mysql利用binlog日志恢复数据实战案例

《Mysql利用binlog日志恢复数据实战案例》在MySQL中使用二进制日志(binlog)恢复数据是一种常见的用于故障恢复或数据找回的方法,:本文主要介绍Mysql利用binlog日志恢复数据... 目录mysql binlog核心配置解析查看binlog日志核心配置项binlog核心配置说明查看当前所

Java中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例解析

《Java中的分布式系统开发基于Zookeeper与Dubbo的应用案例解析》本文将通过实际案例,带你走进基于Zookeeper与Dubbo的分布式系统开发,本文通过实例代码给大家介绍的非常详... 目录Java 中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例一、分布式系统中的挑战二