python爬虫之抓取小说(逆天邪神)
2022/3/7 1:15:13
本文主要是介绍python爬虫之抓取小说(逆天邪神),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
2022-03-06 23:05:11
申明:自我娱乐,对自我学习过程的总结。
正文:
环境:
-
系统:win10,
-
python版本:python3.10.2,
-
工具:pycharm。
项目目标:
-
实现对单本小说的更新判断,省去人工登录浏览器看小说的繁琐操作。
-
如果小说内容更新了,那么自动下载你没看过的小说内容到本地,并保存为txt格式。
-
对项目代码封装成可单独运行在win10上的exe文件。
最终效果:都已实现。可以判断小说更新了没;更新了就下载下来;通过调整小说的已看章节数(就是你上次浏览小说章节位置记录)可以达到直接保存整本小说。
项目实现流程:
1. 主程序
我这里只写了一个main.py,就一个主函数解决了。
# 这个是一个爬取小说的工具 # 内容针对逆天邪神 # 功能1:是判断小说是否更新,如果更新就下载下来 # 功能2:下载整本小说(单线程),一般都是自动下载最新更新的几章,单线程足够。——懒 import requests import re from bs4 import BeautifulSoup import os if __name__ == '__main__': novel_url = "https://www.bige3.com/book/1030/" # 逆天邪神 return_value = is_update(novel_url) # 更新章节数 if return_value == 0: print("小说尚未更新!") else: print("小说已更新" + str(return_value) +"章!") print("正在下载已更新的小说......") download_novel(return_value) # os.system("pause") # 调试时注释掉,封装时打开,用于观察结果
2. 功能函数
2.1 功能函数is_update()
def is_update(url): heards = { "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36" } try: resp = requests.get(url, headers=heards) resp.raise_for_status() # 检查Response状态码,若不是200则产生HttpError异常 resp.encoding = 'utf-8' except: print("爬取失败") resp = re.findall(r'<a href =.*?>(.*?)</a>', resp.text) # print("请求返回的列表中的最后一章是:" + resp[-1]) with open("小说更新记录.txt", "r", encoding='utf-8') as f: # 打开文件 data = f.read() # 读取文件 # print("source_novel_data is:" + str(data)) if data == str(resp[-1]): # print("===章节一致,小说尚未更新!") return 0 else: # print("!==小说更新啦,并将更新值加入到小说更新记录.txt") data_num = re.findall(r'\d+', data) # list data_num = ''.join(data_num) # str resp_num = re.findall(r'\d+', resp[-1]) resp_num = ''.join(resp_num) gap_num = int(resp_num)-int(data_num) # 更新章节数 with open("小说更新记录.txt", "w", encoding='utf-8') as f: # 打开文件 f.write(str(resp[-1])) # 读取文件 print("writing is ok!") return gap_num
2.2 功能函数download_novel(return_value)
# 单线程方式 def download_novel(return_value): if return_value >= 1: for i in range(1, return_value+1, 1): print(i) with open("小说更新记录.txt", "r", encoding='utf-8') as f: # 打开文件 data = f.read() # 读取文件 str data_num = re.findall(r'\d+', data) # list data_num = ''.join(data_num) # str download_num = int(data_num)+1-(i-1) # print(download_num) print(novel_url+str(download_num)+'.html') resp = requests.get(novel_url+str(download_num)+'.html') # print(resp.content) soup = BeautifulSoup(resp.text, 'lxml') soup.select('#chaptercontent') mytxt = soup.text[soup.text.find('下一章'):soup.text.rfind('『点此报错')] mytxt = mytxt[3:] mytxt = mytxt.strip() mytxt = mytxt.replace(' ', '\n') novel_save_location = "./novel_downloads/逆天邪神第"+str(download_num-1)+"章.txt" with open(novel_save_location, "w", encoding='utf-8') as f: # 打开文件 f.write(mytxt) print("下载完毕!") else: print("invalid parameter!")
注意:
-
调试时要创建文件夹
novel_downloads
,并标注为Exclusion,防止pycharm自动创建索引,使电脑卡顿。 -
封装后的main.exe要保证它所在的路径下有两个东西:文件夹
novel_downloads
和文件小说更新记录.txt
。 -
初始阶段保证文件
小说更新记录.txt
里有个数字就行,随便啥(1 or 1935等)
全部代码:(直接能爬)
# 这个是一个爬取小说的工具 # 内容针对逆天邪神 # 功能1:是判断小说是否更新,如果更新就下载下来 # 功能2:下载整本小说(单线程),一般都是自动下载最新更新的几章,单线程足够。——懒 import requests from lxml import etree import re from bs4 import BeautifulSoup import os def is_update(url): heards = { "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36" } try: resp = requests.get(url, headers=heards) resp.raise_for_status() # 检查Response状态码,若不是200则产生HttpError异常 resp.encoding = 'utf-8' except: print("爬取失败") resp = re.findall(r'<a href =.*?>(.*?)</a>', resp.text) # print("请求返回的列表中的最后一章是:" + resp[-1]) with open("小说更新记录.txt", "r", encoding='utf-8') as f: # 打开文件 data = f.read() # 读取文件 # print("source_novel_data is:" + str(data)) if data == str(resp[-1]): # print("===章节一致,小说尚未更新!") return 0 else: # print("!==小说更新啦,并将更新值加入到小说更新记录.txt") data_num = re.findall(r'\d+', data) # list data_num = ''.join(data_num) # str resp_num = re.findall(r'\d+', resp[-1]) resp_num = ''.join(resp_num) gap_num = int(resp_num)-int(data_num) # 更新章节数 with open("小说更新记录.txt", "w", encoding='utf-8') as f: # 打开文件 f.write(str(resp[-1])) # 读取文件 print("writing is ok!") return gap_num # 单线程方式 def download_novel(return_value): if return_value >= 1: for i in range(1, return_value+1, 1): print(i) with open("小说更新记录.txt", "r", encoding='utf-8') as f: # 打开文件 data = f.read() # 读取文件 str data_num = re.findall(r'\d+', data) # list data_num = ''.join(data_num) # str download_num = int(data_num)+1-(i-1) # print(download_num) print(novel_url+str(download_num)+'.html') resp = requests.get(novel_url+str(download_num)+'.html') # print(resp.content) soup = BeautifulSoup(resp.text, 'lxml') soup.select('#chaptercontent') mytxt = soup.text[soup.text.find('下一章'):soup.text.rfind('『点此报错')] mytxt = mytxt[3:] mytxt = mytxt.strip() mytxt = mytxt.replace(' ', '\n') novel_save_location = "./novel_downloads/逆天邪神第"+str(download_num-1)+"章.txt" with open(novel_save_location, "w", encoding='utf-8') as f: # 打开文件 f.write(mytxt) print("下载完毕!") else: print("invalid parameter!") if __name__ == '__main__': novel_url = "https://www.bige3.com/book/1030/" # 逆天邪神 return_value = is_update(novel_url) if return_value == 0: print("小说尚未更新!") else: print("小说已更新" + str(return_value) +"章!") print("正在下载已更新的小说......") download_novel(return_value) os.system("pause")
缺点:单线程,没有用到异步协程,也没有用线程池实现对小说下载章节数较多时的快速下载优势。之后有空再优化代码,并实现相应的功能。
实现效果:
例如章节是目前是
最新章节为:1936章 灾厄奏鸣 ,我改个数字演示。
不改话,就没有新章节更新:
改后跑起来,应该是
对应的文件夹里是:
打开后内容是:
Over!!!!!
封装问题
步骤:
-
在pycharm项目路径下打开终端输入:
pip install pyinstaller
-
cd到项目的.py文件路径下
cd .\study_capture\novel_capture\
-
执行:
pyinstaller -F .\main.py
结果是:
项目中用到的知识点:
这里面可以有些在优化程序时被我给去掉了,嘿嘿
请求网页数据
resp = requests.get(url, headers=heards)
python中list与string的转换
data_num = re.findall(r'\d+', data) # 正则出来的是list data_num = ''.join(data_num) # str
小说章节数的确认
resp = re.findall(r'<a href =.*?>(.*?)</a>', resp.text)
TXT文本的读取
encoding='utf-8' 是有必要的,不然会报错。
with open("小说更新记录.txt", "r", encoding='utf-8') as f: # 打开文件 data = f.read() # 读取文件
TXT文本的回写
with open("小说更新记录.txt", "w", encoding='utf-8') as f: # 打开文件 f.write(str(resp[-1])) # 读取文件
BS4对HTML进行值的筛选
#表示识别标签
soup = BeautifulSoup(resp.text, 'lxml') soup.select('#chaptercontent')
取列表元素最后一个
resp[-1]
将列表中的章节数字拿出
data_num = re.findall(r'\d+', data) # list
python特定位置的字符串截取
soup.text str型 find('下一章') 左边开始第一个索引 rfind('『点此报错') 右边开始第一个索引
mytxt = soup.text[soup.text.find('下一章'):soup.text.rfind('『点此报错')]
字符串的拼接:
novel_save_location = "./novel_downloads/逆天邪神第"+str(download_num-1)+"章.txt"
小说保存时:
1.里面有空白,直接用
mytxt = mytxt.strip()
时没有去掉,不知道啥原因。我记得听网课说是:去掉空格,空白,换行符,其他好像都去了,最后还剩小说之间一些空白。
解决方式:因为没有发现是啥符号(notepad++),于是之间将空白拿过来用(copy)。
mytxt=mytxt.replace(' ', '\n') #目的是:在TXT文本中句子太长,于是我直接在每句话结束后换行。效果还行,与网站对比。
感谢观看!!!第一次写,好慢,好菜,回去写作业去了。呜呜呜
这篇关于python爬虫之抓取小说(逆天邪神)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-24Python编程基础详解
- 2024-11-21Python编程基础教程
- 2024-11-20Python编程基础与实践
- 2024-11-20Python编程基础与高级应用
- 2024-11-19Python 基础编程教程
- 2024-11-19Python基础入门教程
- 2024-11-17在FastAPI项目中添加一个生产级别的数据库——本地环境搭建指南
- 2024-11-16`PyMuPDF4LLM`:提取PDF数据的神器
- 2024-11-16四种数据科学Web界面框架快速对比:Rio、Reflex、Streamlit和Plotly Dash
- 2024-11-14获取参数学习:Python编程入门教程