""" Script Name: Description: 获取 aabook.xyz 数据, prompt: 我们需要访问 https://aabook.xyz/read-{chapid}.html 这个地址,并解析其中的元素,发起下载链接,格式化返回的数据,以下是需求详细描述: chapid 参数,它代表的是小说编号,我们定义一个映射,比如 novel_map = {350316:'novel1', ...} 等等 我们遍历 novel_map,对每一个key值,假设为 novel_id,传入上面的URL,组成一个访问地址,获取它的内容,它是一个HTML页面;把对应的 value 记为 novel_name;创建 {novel_name}.txt 文件; 我们解析它的 body 中的

第三章 惊人的任务

标签,获得对应的 title; 我们解析它的 body 中的
标签,得到里面的链接地址,拼上访问域名,就是 next_page 的地址;如果标签不存在,则说明已经全部读取完毕; 在 body中有一段 javascript 代码,$.get("./_getcontent.php?id="+chapid+"&v=f2cd0JFa_wH0alpBjF4xgS2WFKyo0mQijsHgPQhZmBEjKCEP0wes", 我们需要解析出它访问的地址,加上域名,得到真正的内容 content_url; 访问 content_url ,获取它的内容,解析 body 中所有

标签的内容,每一部分都是一个段落,我们定义为 part; 解析part中的内容,把其中诸如 feng情书库 这样的内容直接去掉,它是网站的隐藏水印;其特征是用 任意 HTML 标签包裹着的部分, <{label} class="" >XXXX 其中label可能为任意的字符串; 我们把 title 写入到 {novel_name}.txt 中;并循环写入所有的 part ,注意每次写入一个part,都添加换行。 如果有 next_page, 那么就继续这个过程,一直到全部完成,这样我们就完成了 novel_id 对应的小说的下载。 继续遍历 novel_map,完成所有小说的下载。 请你理解上述需求,并写出对应的python代码。 Author: [Your Name] Created Date: YYYY-MM-DD Last Modified: YYYY-MM-DD Version: 1.0 Modification History: - YYYY-MM-DD [Your Name]: - YYYY-MM-DD [Your Name]: - YYYY-MM-DD [Your Name]: """ import re import os import requests from bs4 import BeautifulSoup import time import random import logging import config # 日志配置 from aabook_list import novel_map config.setup_logging() # User-Agent 列表 user_agents = [ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.67", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:90.0) Gecko/20100101 Firefox/90.0", "Mozilla/5.0 (Linux; Android 10; SM-G973F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Mobile Safari/537.36" ] dir_prefix = './aabook' # 定义获取页面内容的函数,带重试机制 def get_page_content(url, max_retries=100, sleep_time=5, default_timeout=10): retries = 0 # 随机选择一个 User-Agent headers = { 'User-Agent': random.choice(user_agents) } while retries < max_retries: try: response = requests.get(url, headers=headers, timeout=default_timeout, stream=True) response.raise_for_status() return response.text # 请求成功,返回内容 except requests.RequestException as e: retries += 1 logging.info(f"Warn fetching page {url}: {e}. Retrying {retries}/{max_retries}...") if retries >= max_retries: logging.error(f"Failed to fetch page {url} after {max_retries} retries.") return None time.sleep(sleep_time) # 休眠指定的时间,然后重试 # 解析内容中的水印部分 def clean_watermarks(html): """ 过滤掉带有 class 属性的水印标签及其内部内容,保留其他标签结构。 """ # 使用正则表达式匹配并移除任何带有 class 属性的 HTML 标签及其内容 cleaned_html = re.sub(r'<[^>]+class="[^"]+">.*?]+>', '', html, flags=re.DOTALL) return cleaned_html def process_paragraph(paragraph): # 获取完整的 HTML 结构,而不是 get_text() paragraph_html = str(paragraph) # 移除水印标签 cleaned_html = clean_watermarks(paragraph_html) # 使用 BeautifulSoup 解析移除水印标签后的 HTML 并提取文本 soup = BeautifulSoup(cleaned_html, 'html.parser') cleaned_text = soup.get_text().strip() return cleaned_text # 从 script 标签中提取 content_url def extract_content_url(soup, base_url, chapid): # 找到所有