利用爬虫爬取网页小说

embedded/2024/11/25 0:14:00/

需求分析

安装requests包

pip	install	requests

在这里插入图片描述

在这里插入图片描述

目录采集地址:
h t t p s : / / w w w . 3 b q g . c c / b o o k / 60417 / https://www.3bqg.cc/book/60417/ https://www.3bqg.cc/book/60417/
章节采集地址:
h t t p s : / / w w w . 3 b q g . c c / b o o k / 60417 / 1. h t m l https://www.3bqg.cc/book/60417/1.html https://www.3bqg.cc/book/60417/1.html

pycharm代码实现

python">#导入requests模块和re模块
import  requests,re#要爬取的网址
url="https://www.3bqg.cc/book/60417"#伪造请求#声明一个身份代理信息,随便进入一个网页检查——网络——标头即可找到User-Agent
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0"
}
#发起一个伪造请求
# requests.get(url1,headers=headers)
#接收服务器返回的数据
response=requests.get(url,headers=headers)#设置响应编码
response.encoding="UTF-8"#查看响应数据
content=response.text
#print(content)
python">#正则提取章节名称和链接
p=r'<a href ="(.*?)"\>(第.*?)>'
chs=re.findall(p,content,re.DOTALL)
#print(chs)
#提取出来后章节链接与章节名在一个列表中

注意

re.DOTALL:这是一个标志,告诉正则表达式模块 .(点)元字符应该匹配包括换行符在内的任意字符。通常情况下,. 不匹配换行符,但当你使用 re.DOTALL 标志时,它将匹配任何字符,包括换行符。如果不使用 re.DOTALL 标志, . 不匹配换行符,所以无法匹配整个多行字符串。

re.findall 是 Python 的 re(正则表达式)模块中的一个函数,它的作用是在一个字符串中查找所有与正则表达式匹配的部分,并将它们作为一个列表返回。

python">#声明一个字典
chapter=dict()
for ch in chs:#以章节名做key,地址做valuechapter[ch[1]]="https://www.3bqg.cc"+ch[0]
#print(chapter)
#导入jasn模块
import json
with open('chapters.txt','wt',encoding='utf-8') as file:#将 chapter 字典转换为 JSON 格式的字符串,并将其写入到 file 变量所引用的文件中json.dump(chapter, file)#加载需要的目录
with open('chapters.txt',encoding='utf-8') as file:ac=json.load(file)#print(ac)#伪造请求
headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0"
}
import random,timefor title , url in ac.items():with open("道诡异仙.txt",mode="at",encoding='utf-8') as file:print(f"准备采集:{title}")#发起伪造请求res=requests.get(url,headers=headers)#设置数据编码res.encoding=("UTF-8")#分析数据格式consequence=res.text# print(consequence)#定义正则表达式,匹配数据a=r'<div id="chaptercontent"+\s+class="Readarea+\s+ReadAjax_content">(.*?)</div>'#打印获取的某一章的内容#第一种fangfa#content=re.findall(a,consequence,re.DOTALL)#print(content)#第二种方法# 只有一条数据,可以用re.searchcontent=re.search(a,consequence,re.DOTALL)#使用content.group()获取第一个捕获组的内容content=content.group(1)#print(content)#提取出汉字的正则表达式=r'[\u4e00-\u9fff]+'content2=re.findall(r'[\u4e00-\u9fff]+', content)content2="\n".join(content2)#print(content2)#保存到文件file.write("\n\n"+title+"\n\n")#标题file.write(content2)#内容time.sleep(random.randint(2,4))print(f"{title}章节采集完成")#测试,采集一次#break

结果

在这里插入图片描述
在这里插入图片描述


http://www.ppmy.cn/embedded/140242.html

相关文章

【ArcGIS微课1000例】0132:从多个GIS视角认识与攀登珠穆朗玛峰

文章目录 1. Map Viewer中打开2. 场景查看器中打开3. ArcGIS中打开4. QGIS中打开5. Globalmapper中打开6. ArcGIS Earth中打开官网地址:https://www.arcgis.com/home/item.html?id=504a23373ab84536b7760c0add1e0c1c 1. Map Viewer中打开 以下展示不同底图样式的珠穆朗玛峰壮…

python语言基础

1. 基础语法 Q: Python 中的变量与数据类型有哪些&#xff1f; A: Python 支持多种数据类型&#xff0c;包括数字&#xff08;整数 int、浮点数 float、复数 complex&#xff09;、字符串 str、列表 list、元组 tuple、字典 dict 和集合 set。每种数据类型都有其特定的用途和…

云讷科技Kerloud无人飞车专利发布

云讷科技Kerloud无人飞车获得了“一种室内外两用的四旋翼无人飞车”的实用新型专利证书&#xff0c;作为科教社区第一款四旋翼飞车&#xff0c;这项技术结合了无人机和无人车的优势&#xff0c;提供了一种能够在多种环境下使用的多功能飞行器。 这项设计的优势如下&#xff…

vue2 src_Todolist全局总线事件版本

main.js //引入Vue import Vue from "vue"; //引入App import App from ./App;//关闭Vue的生产提示 Vue.config.productionTip false;new Vue({el: #app,render: h > h(App),beforeCreate() {//事件总线Vue.prototype.$bus this;} });App.vue <template>…

【CSP CCF记录】201903-2第16次认证 二十四点

题目 样例1输入 10 934x3 54x5x5 7-9-98 5x6/5x4 3579 1x19-9 1x9-5/9 8/56x9 6x7-3x6 6x44/5 样例1输出 Yes No No Yes Yes No No No Yes Yes 样例1解释 思路 参考&#xff1a;CCF小白刷题之路---201903-2 二十四点&#xff08;C/C 100分&#xff09;_ccf认证小白-CSDN博客 …

Linux 的CENTOS7扩容3T空间

1、简化描述操作过程 查看新硬盘的盘符 转换硬盘分区方式 新硬盘创建分区表 格式化新硬盘分区表 将分区扩容到cl目录 将分区增加到具体的cl-home目录 2、详细配置过程 查看当前硬盘 fdisk -l 修改分区格式 parted /dev/sdb 转换硬盘分区方式 MBR分区方式转…

Docker 容器自动启动设置

在 Docker 中&#xff0c;可以通过设置容器的重启策略来实现容器的自动启动。这意味着&#xff0c;当 Docker 守护进程启动时&#xff0c;它可以自动启动特定的容器&#xff0c;无论是因为系统重启还是 Docker 服务本身的重启。 设置容器自动启动 要设置容器自动启动&#xf…

如何进行模板特化和偏特化?

函数模板特化‌&#xff1a; 当函数模板在特定类型下的实现需要特别处理时&#xff0c;可以使用函数模板特化。例如&#xff0c;对于比较字符串的大小&#xff0c;可以使用特化的Max函数&#xff1a; template<typename T> T Max(T t1, T t2) { return (t1 > t2) ? …