Python爬虫爬取网页小说

分析

注意:不同小说url不同,不同小说需采用的正则也不同

1.安装requests包

python 复制代码
pip install requests

2.导入必要的库

re模块用于进行正则表达式相关的操作,比如使用正则表达式在获取到的网页文本内容中匹配提取特定格式的信息。

resquests模块用于进行正则表达式相关的操作,比如使用正则表达式在获取到的网页文本内容中匹配提取特定格式的信息。

json模块用于处理 JSON 数据,方便将整理好的数据结构(字典)转换为 JSON 格式并保存到文件中。

小说选取

这里选取三国演义作为教学案例

检查页面源代码可得目录采集地址:

https://sanguo.5000yan.com/

目录采集代码实现

注意:不同小说url不同,不同小说需采用的正则也不同

python 复制代码
#导入必要的库
import re
import requests
import json
url="https://sanguo.5000yan.com/"
headers={
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
}
#发起伪造请求
response=requests.get(url,headers=headers)
#设置响应编码
response.encoding='UTF-8'
#查看相应数据
content=response.text
    #正则表达式匹配
p=r'<a target="(.*?)"\s+ href="(.*?)">(第.*?)</a>'
#提取匹配到的数据到列表中
chs=re.findall(p,content,re.DOTALL)

chapter=dict()
for ch in chs:
    chapter[ch[2]]=ch[1]
#最终的章节和链接数据
print(chapter)
#保存数据为json格式到文件
#文件可替换为自己的文件
with open('C:/Users/33692/Desktop/程序/chapter/mulu.txt',mode='wt',encoding='UTF-8') as file:
    json.dump(chapter,file)

部分代码解析

python 复制代码
chs=re.findall(p,content,re.DOTALL)

re.findall 是 re 模块提供的用于在字符串中基于正则表达式进行全面查找匹配的函数,其基本语法格式为 re.findall(pattern, string, flags=0),各参数含义如下:

pattern:对应代码中的 p,是一个定义好的正则表达式模式,用于精确描述要查找的文本的具体样式、特征等。例如,若 p 为r"<div>.*?</div>,表示要查找所有符合以 div开头、以 /div结尾的内容(这里 .*? 是非贪婪匹配模式,用于获取中间的文本内容)。

string:就是这里的 content,代表要进行查找操作的目标文本字符串。在这段代码的上下文中,content 通常是通过向网页发送请求获取到的网页源代码等文本信息(前面通过 response.text 获取到的网页文本内容),但也可以是其他任意符合字符串格式的文本数据,具体取决于应用场景。

flags:为可选参数,用于设定正则表达式的匹配行为,这里使用的 re.DOTALL 就是其中一种常用的标志选项。

re.DOTALL:

在正则表达式里,默认情况下 .(点号)这个元字符只能匹配除换行符之外的任意单个字符。但在实际处理类似网页 HTML 代码、文档等具有多行结构的文本时,很多时候希望 . 可以匹配包括换行符在内的所有字符,这时就需要使用 re.DOTALL 标志来改变 . 的默认匹配行为。

章节采集代码实现

python 复制代码
import requests,re
import time,random
import json
#加载需要采集的目录
with open('C:/Users/33692/Desktop/程序/chapter/mulu.txt',encoding='utf-8') as file:
    chs=json.load(file)
headers={
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
}
#遍历循环,发起伪造请求
for title,url in chs.items():
    print(f"准备采集:{title}")
    #发起伪造请求
    response=requests.get(url,headers=headers)
    #设置编码格式
    response.encoding="utf-8"
    html=response.text

    #正则匹配
    p=r'<div class="grap"><div>(.*?)</div></div>'
    content=re.findall(p,html,re.DOTALL)
    text=content[0]
	#正则去掉无关字符:\n\t等
    new_text = re.sub(r'[\r\n\t&lrdquoiv<>nbsp/;]', '', text)
    #转换为破折号
    clean_text = new_text.replace('&mdash;&mdash;', '------')

    with open('C:/Users/33692/Desktop/程序/chapter/三国演义.txt',mode="at",encoding='utf-8') as file:
        #保存文件
        file.write("\n\n"+title+"\n\n")
        file.write(clean_text)
        file.write("\n\n-------------------\n\n")
    #模拟用户请求,每次休眠5-10秒
    time.sleep(random.randint(1,5))
    print(f"{title}采集完成")

结果截图


相关推荐
bryant_meng17 分钟前
【python】OpenCV—Image Moments
开发语言·python·opencv·moments·图片矩
若亦_Royi41 分钟前
C++ 的大括号的用法合集
开发语言·c++
KevinRay_43 分钟前
Python超能力:高级技巧让你的代码飞起来
网络·人工智能·python·lambda表达式·列表推导式·python高级技巧
Captain823Jack1 小时前
nlp新词发现——浅析 TF·IDF
人工智能·python·深度学习·神经网络·算法·自然语言处理
资源补给站2 小时前
大恒相机开发(2)—Python软触发调用采集图像
开发语言·python·数码相机
Captain823Jack2 小时前
w04_nlp大模型训练·中文分词
人工智能·python·深度学习·神经网络·算法·自然语言处理·中文分词
m0_748247552 小时前
Web 应用项目开发全流程解析与实战经验分享
开发语言·前端·php
6.942 小时前
Scala学习记录 递归调用 练习
开发语言·学习·scala
PieroPc2 小时前
Python 自动化 打开网站 填表登陆 例子
运维·python·自动化
FF在路上3 小时前
Knife4j调试实体类传参扁平化模式修改:default-flat-param-object: true
java·开发语言