import requests
from lxml import etree
import time # 用于控制请求间隔
# 初始链接
url = 'https://www.biqooge.com/13_13515/8585526.html'
# 使用 'with open' 语句打开文件进行追加写入
with open('斗罗大陆.txt', 'a', encoding='utf-8') as f: # 使用 'a' 模式以追加内容
while True:
# 伪装自己
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0'
}
try:
session = requests.Session()
response = session.get(url, headers=headers)
response.raise_for_status() # 检查请求是否成功
response.encoding = "gbk"
# 解析内容
e = etree.HTML(response.text)
info = e.xpath('//div[@id="content"]/text()')
title = e.xpath('//div[@class="bookname"]/h1/text()')
next_url = e.xpath('//a[text()="下一章"]/@href') # 提取下一章节的链接
# 清理文本
title = title[0].strip() if title else '无标题'
info = ''.join([text.strip() for text in info]).replace('\r\n', '\n')
print(title)
print(info)
# 写入内容
f.write(title + '\n\n' + info + '\n\n')
# 如果有下一章节,则继续
if next_url:
url = 'https://www.biqooge.com' + next_url[0] # 拼接基本 URL
else:
print("没有更多章节了。")
break # 退出循环
time.sleep(1) # 控制请求间隔,避免过于频繁
except requests.exceptions.RequestException as req_err:
print(f"请求错误: {req_err}")
break # 发生请求错误时退出循环
except Exception as e:
print(f"其他错误: {e}")
break # 发生其他错误时退出循环
# 不需要再额外打开文件保存内容
-
使用
with open
('斗罗大陆.txt', 'a', encoding='utf-8') as f:
语句可以确保文件在写入后自动关闭。以'a'
模式打开文件允许追加内容,而不会覆盖原有内容。 -
文件内容保存:每次成功提取章节后,标题和内容都会追加到
斗罗大陆.txt
文件中。 -
异常处理:在请求或解析过程中捕获任何异常,以确保程序的健壮性。
-
请求间隔:使用
time.sleep(1)
控制请求频率,避免对目标网站造成过大负担。 - 简化了异常处理:将文件写入的异常处理移除,因为只需在
with
块内进行一次写入。 - 移除冗余的文件打开操作:代码最后不需要再次打开文件来保存内容。
- 清晰的循环结构:确保了异常处理和逻辑流的清晰,避免了多重嵌套的情况。
- 保持写入逻辑:
f.write()
调用的位置保持在 try 块内,这样可以确保写入成功后才进行下一步。 - 测试代码确保在运行此代码时已经安装了必要的库(
requests
和lxml
)。可以通过以下命令安装:pip install requests lxml