From a65862f3ee38554bb4eed5012e8bd68feeaf8ad2 Mon Sep 17 00:00:00 2001 From: jack Date: Wed, 12 Nov 2025 16:33:03 +0800 Subject: [PATCH] first commit --- .DS_Store | Bin 0 -> 8196 bytes 1step.py | 194 ++++++++++++++++++++++++++++++++++++++++++++ 2step.py | 182 +++++++++++++++++++++++++++++++++++++++++ crawl.log | 64 +++++++++++++++ download.log | 121 +++++++++++++++++++++++++++ downloads/.DS_Store | Bin 0 -> 10244 bytes targets.txt | 1 + 7 files changed, 562 insertions(+) create mode 100644 .DS_Store create mode 100644 1step.py create mode 100644 2step.py create mode 100644 crawl.log create mode 100644 download.log create mode 100644 downloads/.DS_Store create mode 100644 targets.txt diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..7cfe16a0b99b3a577799d7e15b8dc58fbf30d0dc GIT binary patch literal 8196 zcmeHMZ)_Ar6rbO=z^+~B7783oD+fi0c##$>&{pwiO8}`BdMzz2a_rr%uwlDfZujoc z+Sr&F|KOkKC*!|FW1`V$Ohki;`b{JnH8ItQiGIL{Ci;O-e)5BFcJ>IgB{7;98+VeK zH#6_OnR#!2Z+71uV+@@|vxTt)V@#&Xsa8YHEQRxVol&G{W*$+HK4T8^n88fu=gKpr z3oTfKVrXl8X~fM|4t9q0S)G8KRvLWhe-D zC%t4S&X5)~ZetI`9+>F?p1UiQv3sn{+{^QKe=O&CIpUtqjXAa-G&g?(sj7P3`~~s? zxkkP#bJQzm0wXB;okn4VkNQ2&$yNGBZoh4nvs!(Z=LUxDT7^)-HZ2l4IB2`3SMKzR zuIY!m8NrYhS;=aN@$pStT2sl*Ev*x& zw&(i$t%6T9tJV7CiQRe6-CM9Ye=zSk#ZlMKYIS+T$rl|Xu(mr+#=h60xmrJ8@Em8a z=i7Xl14DszBH+9ktf67wD+FEPVna5qFQl}hZ}nNUs9mzUX=%THnirtFwP<<6>gzUa zY;D`txpPnNRIOIGSXGxU8!XwropY=MhM%`w({_&xlx;IOI!uqk4eYyZtDq=#Qb)gQ zj9OER>$KX$3SA#6=IrA|JGe({lI3u=@mgIyXwu$ycqZ2}wU=cjuSGGMruYRctc86`;QSOG+z;_%`K`v;21f}(M(0`bMt0ZA1nz!YkQ)}_6}7a z%6p@ubY#B{sc8B(+W8RQxySH>-Z9I)w0T#zt`GZ1je^x%CQxc;qeJbY`S9rxhb!$c z?Z7KU%pO|q0AFsqX@)CtAL@EvMwYd&vYKYQC7VKlo}h>bxvBCLn$jCYH}qmtx><}A zdfPR!O{|;su*0mt#@XZS8TJx8#Xe?d*w^d_c7a`FzXOm^h54vKJsPnJNvy^OY(X2^ z(SdI4#Xj_51c#AB9wtUnK!74jxE~MVAv}yn@HC#q^LPO-;#ItjcW?^t;v;;HFYqP4 z#gF(27w|JKN|ID1RZ9z{`q_xsIsZDB^x}+XypEN9vE>+?!8dofpMyNM? zKt(r+^vdi3)v$Bd&fT}qoq#&Gh(G=%^-Gs6Px83hdTZw;2nx(rV0t^%F05dH@td=Zu)f%Ry{R&2vA+=*VobOr-Bge(j~HpjJ#F&u}F`!GS+p2Pz2P@19gum2DbeQW>y59;{+AHV-Y=+5cp EPr&MI)Bpeg literal 0 HcmV?d00001 diff --git a/1step.py b/1step.py new file mode 100644 index 0000000..db8c225 --- /dev/null +++ b/1step.py @@ -0,0 +1,194 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +异步批量抓取 E-H 画廊图片链接,按专辑保存 json +python eh_crawler.py +""" +from __future__ import annotations + +import asyncio +import json +import logging +import re +import sys +from pathlib import Path +from typing import Dict, List, Optional, Tuple + +import aiofiles +import httpx +from bs4 import BeautifulSoup +from tqdm.asyncio import tqdm_asyncio +from aiopath import AsyncPath + +# -------------------- 可配置常量 -------------------- +CONCURRENCY = 20 # 并发页数 +MAX_PAGE = 100 # 单专辑最大翻页 +RETRY_PER_PAGE = 5 # 单页重试 +TIMEOUT = httpx.Timeout(10.0) # 请求超时 +PROXY = "http://127.0.0.1:7890" # 科学上网代理,不需要留空 +IMG_SELECTOR = "#gdt" # 图片入口区域 +FAILED_RECORD = "failed_keys.json" +LOG_LEVEL = logging.INFO +# ---------------------------------------------------- + +logging.basicConfig( + level=LOG_LEVEL, + format="[%(asctime)s] [%(levelname)s] %(message)s", + handlers=[ + logging.StreamHandler(sys.stdout), + logging.FileHandler("crawl.log", encoding="utf-8"), + ], +) +log = logging.getLogger("eh_crawler") + +# 预编译正则 +ILLEGAL_CHARS = re.compile(r'[<>:"/\\|?*\x00-\x1F]') + + +# -------------------- 工具函数 -------------------- +def clean_folder_name(title: str) -> str: + """清洗文件夹名""" + return ILLEGAL_CHARS.sub("_", title).replace(" ", "").replace("_", "").strip() or "gallery" + + +def load_targets() -> List[str]: + """读取 targets.txt""" + tgt = Path("targets.txt") + if not tgt.exists(): + log.error("targets.txt 不存在,已自动创建,请先填写 URL") + tgt.touch() + sys.exit(0) + lines = [ln.strip() for ln in tgt.read_text(encoding="utf-8").splitlines() if ln.strip()] + if not lines: + log.error("targets.txt 为空,请先填写 URL") + sys.exit(0) + return list(set(lines)) # 去重 + + +def load_failed() -> List[str]: + if Path(FAILED_RECORD).exists(): + try: + return json.loads(Path(FAILED_RECORD).read_text(encoding="utf-8")) + except Exception as exc: + log.warning(f"加载失败记录失败 -> {exc}") + return [] + + +def save_failed(keys: List[str]) -> None: + Path(FAILED_RECORD).write_text(json.dumps(keys, ensure_ascii=False, indent=2), encoding="utf-8") + + +# -------------------- 爬虫核心 -------------------- +async def fetch_page(client: httpx.AsyncClient, url: str) -> Optional[str]: + """获取单页 HTML""" + for attempt in range(1, RETRY_PER_PAGE + 1): + try: + resp = await client.get(url) + resp.raise_for_status() + return resp.text + except httpx.HTTPError as exc: + log.error(f"[{attempt}/{RETRY_PER_PAGE}] 请求失败 {url} -> {exc}") + await asyncio.sleep(2 ** attempt) + return None + + +async def crawl_single_gallery( + client: httpx.AsyncClient, sem: asyncio.Semaphore, gallery_url: str +) -> bool: + """抓取单个画廊,成功返回 True""" + async with sem: + base_url = gallery_url.rstrip("/") + key = base_url.split("/")[-1] # 用最后一截当 key + json_name = f"{key}.json" + + folder_path: Optional[AsyncPath] = None + json_data: Dict[str, str] = {} + img_count = 1 + last_page = False + + for page in range(MAX_PAGE): + if last_page: + break + url = f"{base_url}?p={page}" + html = await fetch_page(client, url) + if html is None: + continue + + soup = BeautifulSoup(html, "lxml") + title = soup.title.string if soup.title else "gallery" + clean_title = clean_folder_name(title) + folder_path = AsyncPath("downloads") / clean_title + await folder_path.mkdir(parents=True, exist_ok=True) + + # 如果 json 已存在则跳过整个画廊 + json_path = folder_path / json_name + if await json_path.exists(): + log.info(f"{json_name} 已存在,跳过") + return True + + log.info(f"当前页码:{page + 1} {url}") + + selected = soup.select_one(IMG_SELECTOR) + if not selected: + log.warning(f"未找到选择器 {IMG_SELECTOR}") + continue + + links = re.findall(r' {json_path} ({len(json_data)} 张)") + return True + else: + log.warning(f"{key} 未解析到任何图片链接") + return False + + +# -------------------- 主流程 -------------------- +async def main() -> None: + targets = load_targets() + failed = load_failed() + if failed: + log.info(f"优先重试上次失败画廊: {len(failed)} 个") + all_urls = list(set(targets + failed)) + + proxy = PROXY if PROXY else None + limits = httpx.Limits(max_keepalive_connections=20, max_connections=50) + async with httpx.AsyncClient( + limits=limits, timeout=TIMEOUT, proxies=proxy, verify=True + ) as client: + sem = asyncio.Semaphore(CONCURRENCY) + results = await tqdm_asyncio.gather( + *[crawl_single_gallery(client, sem, u) for u in all_urls], + desc="Galleries", + total=len(all_urls), + ) + + # 失败持久化 + new_failed = [u for u, ok in zip(all_urls, results) if not ok] + if new_failed: + save_failed(new_failed) + log.warning(f"本轮仍有 {len(new_failed)} 个画廊失败,已写入 {FAILED_RECORD}") + else: + Path(FAILED_RECORD).unlink(missing_ok=True) + log.info("全部画廊抓取完成!") + + +if __name__ == "__main__": + try: + asyncio.run(main()) + except KeyboardInterrupt: + log.info("用户中断,抓取结束") \ No newline at end of file diff --git a/2step.py b/2step.py new file mode 100644 index 0000000..70c1541 --- /dev/null +++ b/2step.py @@ -0,0 +1,182 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +异步批量下载 EH 画廊真实图片 +python download_images.py +""" +from __future__ import annotations + +import asyncio +import json +import logging +import re +import sys +from pathlib import Path +from typing import Dict, List, Optional + +import aiofiles +import httpx +from aiopath import AsyncPath +from tqdm.asyncio import tqdm_asyncio + +# -------------------- 可配置常量 -------------------- +CONCURRENCY = 20 # 并发下载数 +RETRY_PER_IMG = 3 # 单图重试 +TIMEOUT = httpx.Timeout(15.0) # 请求超时 +PROXY = "http://127.0.0.1:7890" # 科学上网代理,不需要留空 +FAILED_RECORD = "failed_downloads.json" +LOG_LEVEL = logging.INFO +# ---------------------------------------------------- + +logging.basicConfig( + level=LOG_LEVEL, + format="[%(asctime)s] [%(levelname)s] %(message)s", + handlers=[ + logging.StreamHandler(sys.stdout), + logging.FileHandler("download.log", encoding="utf-8"), + ], +) +log = logging.getLogger("img_downloader") + +# 预编译正则 +IMG_URL_RE = re.compile(r' List[Dict[str, str]]: + if Path(FAILED_RECORD).exists(): + try: + return json.loads(Path(FAILED_RECORD).read_text(encoding="utf-8")) + except Exception as exc: + log.warning(f"加载失败记录失败 -> {exc}") + return [] + + +def save_failed(failed: List[Dict[str, str]]) -> None: + Path(FAILED_RECORD).write_text(json.dumps(failed, ensure_ascii=False, indent=2), encoding="utf-8") + + +# -------------------- 下载核心 -------------------- +async def download_one( + client: httpx.AsyncClient, sem: asyncio.Semaphore, item: Dict[str, str] +) -> bool: + """下载单张图,成功返回 True""" + img_path, img_url = Path(item["img_path"]), item["img_url"] + + await sem.acquire() + try: + for attempt in range(1, RETRY_PER_IMG + 1): + try: + # 1. 获取详情页 + resp = await client.get(img_url) + resp.raise_for_status() + real_url_match = IMG_URL_RE.search(resp.text) + if not real_url_match: + log.warning(f"未解析到真实图片链接: {img_url}") + return False # <- 这里不会触发 await + real_url = real_url_match.group(1) + + # 2. 下载真实图片(流式) + ext_match = EXT_RE.search(real_url) + ext = ext_match.group(1).lower() if ext_match else "jpg" + final_path = img_path.with_suffix(f".{ext}") + + if await AsyncPath(final_path).exists(): + log.info(f"已存在,跳过: {final_path.name}") + return True + + async with client.stream("GET", real_url) as img_resp: + img_resp.raise_for_status() + await AsyncPath(final_path).parent.mkdir(parents=True, exist_ok=True) + async with aiofiles.open(final_path, "wb") as fp: + async for chunk in img_resp.aiter_bytes(chunk_size=65536): + await fp.write(chunk) + + log.info(f"[OK] {final_path.name}") + return True + + except httpx.HTTPStatusError as exc: + if exc.response.status_code == 429: + wait = 2 ** (attempt - 1) + log.warning(f"[429] 等待 {wait}s 后重试({attempt}/{RETRY_PER_IMG})") + await asyncio.sleep(wait) + else: + log.error(f"[HTTP {exc.response.status_code}] {img_url}") + break + except Exception as exc: + log.error(f"[ERROR] {img_url} -> {exc} ({attempt}/{RETRY_PER_IMG})") + await asyncio.sleep(1) + + return False + finally: + sem.release() + + +# -------------------- 扫描待下载列表 -------------------- +async def scan_tasks() -> List[Dict[str, str]]: + """扫描 downloads/ 下所有 json,返回待下载列表""" + result = [] + root = AsyncPath("downloads") + if not await root.exists(): + return result + + async for json_path in root.rglob("*.json"): + folder = json_path.parent + try: + data: Dict[str, str] = json.loads(await json_path.read_text(encoding="utf-8")) + except Exception as exc: + log.warning(f"读取 json 失败 {json_path} -> {exc}") + continue + + for img_name, img_url in data.items(): + img_path = folder / img_name # 无后缀 + # 异步判断任意后缀是否存在 + exists = False + for ext in (".jpg", ".jpeg", ".png", ".gif", ".webp"): + if await img_path.with_suffix(ext).exists(): + exists = True + break + if not exists: + result.append({"img_path": str(img_path), "img_url": img_url}) + + return result + + +# -------------------- 主流程 -------------------- +async def main() -> None: + # 1. 优先重试上次失败 + failed_tasks = load_failed() + if failed_tasks: + log.info(f"优先重试上次失败任务: {len(failed_tasks)} 张") + + tasks = failed_tasks + await scan_tasks() + if not tasks: + log.info("没有需要下载的图片,收工!") + return + + proxy = PROXY if PROXY else None + limits = httpx.Limits(max_keepalive_connections=20, max_connections=50) + async with httpx.AsyncClient(limits=limits, timeout=TIMEOUT, proxies=proxy, verify=True) as client: + sem = asyncio.Semaphore(CONCURRENCY) + results = await tqdm_asyncio.gather( + *[download_one(client, sem, t) for t in tasks], + desc="Downloading", + total=len(tasks), + ) + + # 统计 & 持久化新失败 + failed_again = [t for t, ok in zip(tasks, results) if not ok] + if failed_again: + save_failed(failed_again) + log.warning(f"本轮仍有 {len(failed_again)} 张下载失败,已写入 {FAILED_RECORD}") + else: + Path(FAILED_RECORD).unlink(missing_ok=True) + log.info("全部下载完成!") + + +if __name__ == "__main__": + try: + asyncio.run(main()) + except KeyboardInterrupt: + log.info("用户中断,下载结束") \ No newline at end of file diff --git a/crawl.log b/crawl.log new file mode 100644 index 0000000..b4cdd1c --- /dev/null +++ b/crawl.log @@ -0,0 +1,64 @@ +[2025-09-26 16:47:21,272] [INFO] HTTP Request: GET https://e-hentai.org/g/3550066/47d6393550?p=0 "HTTP/1.1 200 OK" +[2025-09-26 16:47:36,647] [INFO] HTTP Request: GET https://e-hentai.org/g/3550066/47d6393550?p=0 "HTTP/1.1 200 OK" +[2025-09-26 16:47:56,144] [ERROR] [1/5] 请求失败 https://e-hentai.org/g/3550066/47d6393550?p=0 -> All connection attempts failed +[2025-09-26 16:47:58,634] [INFO] HTTP Request: GET https://e-hentai.org/g/3550066/47d6393550?p=0 "HTTP/1.1 200 OK" +[2025-09-26 16:48:27,339] [INFO] HTTP Request: GET https://e-hentai.org/g/3550066/47d6393550?p=0 "HTTP/1.1 200 OK" +[2025-09-26 16:48:27,365] [INFO] 当前页码:1 https://e-hentai.org/g/3550066/47d6393550?p=0 +[2025-09-26 16:48:27,631] [INFO] HTTP Request: GET https://e-hentai.org/g/3550066/47d6393550?p=1 "HTTP/1.1 200 OK" +[2025-09-26 16:48:27,662] [INFO] 当前页码:2 https://e-hentai.org/g/3550066/47d6393550?p=1 +[2025-09-26 16:48:27,942] [INFO] HTTP Request: GET https://e-hentai.org/g/3550066/47d6393550?p=2 "HTTP/1.1 200 OK" +[2025-09-26 16:48:27,964] [INFO] 当前页码:3 https://e-hentai.org/g/3550066/47d6393550?p=2 +[2025-09-26 16:48:28,243] [INFO] HTTP Request: GET https://e-hentai.org/g/3550066/47d6393550?p=3 "HTTP/1.1 200 OK" +[2025-09-26 16:48:28,270] [INFO] 当前页码:4 https://e-hentai.org/g/3550066/47d6393550?p=3 +[2025-09-26 16:48:28,546] [INFO] HTTP Request: GET https://e-hentai.org/g/3550066/47d6393550?p=4 "HTTP/1.1 200 OK" +[2025-09-26 16:48:28,572] [INFO] 当前页码:5 https://e-hentai.org/g/3550066/47d6393550?p=4 +[2025-09-26 16:48:28,786] [INFO] HTTP Request: GET https://e-hentai.org/g/3550066/47d6393550?p=5 "HTTP/1.1 200 OK" +[2025-09-26 16:48:28,809] [INFO] 当前页码:6 https://e-hentai.org/g/3550066/47d6393550?p=5 +[2025-09-26 16:48:29,034] [INFO] HTTP Request: GET https://e-hentai.org/g/3550066/47d6393550?p=6 "HTTP/1.1 200 OK" +[2025-09-26 16:48:29,055] [INFO] 当前页码:7 https://e-hentai.org/g/3550066/47d6393550?p=6 +[2025-09-26 16:48:29,280] [INFO] HTTP Request: GET https://e-hentai.org/g/3550066/47d6393550?p=7 "HTTP/1.1 200 OK" +[2025-09-26 16:48:29,302] [INFO] 当前页码:8 https://e-hentai.org/g/3550066/47d6393550?p=7 +[2025-09-26 16:48:29,519] [INFO] HTTP Request: GET https://e-hentai.org/g/3550066/47d6393550?p=8 "HTTP/1.1 200 OK" +[2025-09-26 16:48:29,539] [INFO] 当前页码:9 https://e-hentai.org/g/3550066/47d6393550?p=8 +[2025-09-26 16:48:29,753] [INFO] HTTP Request: GET https://e-hentai.org/g/3550066/47d6393550?p=9 "HTTP/1.1 200 OK" +[2025-09-26 16:48:29,773] [INFO] 当前页码:10 https://e-hentai.org/g/3550066/47d6393550?p=9 +[2025-09-26 16:48:29,998] [INFO] HTTP Request: GET https://e-hentai.org/g/3550066/47d6393550?p=10 "HTTP/1.1 200 OK" +[2025-09-26 16:48:30,020] [INFO] 当前页码:11 https://e-hentai.org/g/3550066/47d6393550?p=10 +[2025-09-26 16:48:30,244] [INFO] HTTP Request: GET https://e-hentai.org/g/3550066/47d6393550?p=11 "HTTP/1.1 200 OK" +[2025-09-26 16:48:30,262] [INFO] 当前页码:12 https://e-hentai.org/g/3550066/47d6393550?p=11 +[2025-09-26 16:48:30,267] [INFO] 保存成功 -> downloads/[Pixiv]玲殿下(81002566)2025.09.23-E-HentaiGalleries/47d6393550.json (203 张) +[2025-09-26 16:48:30,269] [INFO] 全部画廊抓取完成! +[2025-09-26 17:12:54,122] [INFO] HTTP Request: GET https://e-hentai.org/g/3550066/47d6393550?p=0 "HTTP/1.1 200 OK" +[2025-09-26 17:12:54,148] [INFO] 当前页码:1 https://e-hentai.org/g/3550066/47d6393550?p=0 +[2025-09-26 17:12:54,372] [INFO] HTTP Request: GET https://e-hentai.org/g/3550066/47d6393550?p=1 "HTTP/1.1 200 OK" +[2025-09-26 17:12:54,396] [INFO] 当前页码:2 https://e-hentai.org/g/3550066/47d6393550?p=1 +[2025-09-26 17:12:54,658] [INFO] HTTP Request: GET https://e-hentai.org/g/3550066/47d6393550?p=2 "HTTP/1.1 200 OK" +[2025-09-26 17:12:54,683] [INFO] 当前页码:3 https://e-hentai.org/g/3550066/47d6393550?p=2 +[2025-09-26 17:12:55,063] [INFO] HTTP Request: GET https://e-hentai.org/g/3550066/47d6393550?p=3 "HTTP/1.1 200 OK" +[2025-09-26 17:12:55,086] [INFO] 当前页码:4 https://e-hentai.org/g/3550066/47d6393550?p=3 +[2025-09-26 17:12:55,447] [INFO] HTTP Request: GET https://e-hentai.org/g/3550066/47d6393550?p=4 "HTTP/1.1 200 OK" +[2025-09-26 17:12:55,474] [INFO] 当前页码:5 https://e-hentai.org/g/3550066/47d6393550?p=4 +[2025-09-26 17:12:55,786] [INFO] HTTP Request: GET https://e-hentai.org/g/3550066/47d6393550?p=5 "HTTP/1.1 200 OK" +[2025-09-26 17:12:55,812] [INFO] 当前页码:6 https://e-hentai.org/g/3550066/47d6393550?p=5 +[2025-09-26 17:12:56,048] [INFO] HTTP Request: GET https://e-hentai.org/g/3550066/47d6393550?p=6 "HTTP/1.1 200 OK" +[2025-09-26 17:12:56,068] [INFO] 当前页码:7 https://e-hentai.org/g/3550066/47d6393550?p=6 +[2025-09-26 17:12:56,294] [INFO] HTTP Request: GET https://e-hentai.org/g/3550066/47d6393550?p=7 "HTTP/1.1 200 OK" +[2025-09-26 17:12:56,314] [INFO] 当前页码:8 https://e-hentai.org/g/3550066/47d6393550?p=7 +[2025-09-26 17:12:56,549] [INFO] HTTP Request: GET https://e-hentai.org/g/3550066/47d6393550?p=8 "HTTP/1.1 200 OK" +[2025-09-26 17:12:56,572] [INFO] 当前页码:9 https://e-hentai.org/g/3550066/47d6393550?p=8 +[2025-09-26 17:12:56,797] [INFO] HTTP Request: GET https://e-hentai.org/g/3550066/47d6393550?p=9 "HTTP/1.1 200 OK" +[2025-09-26 17:12:56,822] [INFO] 当前页码:10 https://e-hentai.org/g/3550066/47d6393550?p=9 +[2025-09-26 17:12:57,117] [INFO] HTTP Request: GET https://e-hentai.org/g/3550066/47d6393550?p=10 "HTTP/1.1 200 OK" +[2025-09-26 17:12:57,139] [INFO] 当前页码:11 https://e-hentai.org/g/3550066/47d6393550?p=10 +[2025-09-26 17:12:57,361] [INFO] HTTP Request: GET https://e-hentai.org/g/3550066/47d6393550?p=11 "HTTP/1.1 200 OK" +[2025-09-26 17:12:57,382] [INFO] 当前页码:12 https://e-hentai.org/g/3550066/47d6393550?p=11 +[2025-09-26 17:12:57,386] [INFO] 保存成功 -> downloads/[Pixiv]玲殿下(81002566)2025.09.23-E-HentaiGalleries/47d6393550.json (203 张) +[2025-09-26 17:12:57,388] [INFO] 全部画廊抓取完成! +[2025-10-21 09:48:05,324] [INFO] HTTP Request: GET https://e-hentai.org/g/3592369/44385b2a36?p=0 "HTTP/1.1 200 OK" +[2025-10-21 09:48:05,341] [INFO] 当前页码:1 https://e-hentai.org/g/3592369/44385b2a36?p=0 +[2025-10-21 09:48:05,572] [INFO] HTTP Request: GET https://e-hentai.org/g/3592369/44385b2a36?p=1 "HTTP/1.1 200 OK" +[2025-10-21 09:48:05,582] [INFO] 当前页码:2 https://e-hentai.org/g/3592369/44385b2a36?p=1 +[2025-10-21 09:48:05,816] [INFO] HTTP Request: GET https://e-hentai.org/g/3592369/44385b2a36?p=2 "HTTP/1.1 200 OK" +[2025-10-21 09:48:05,827] [INFO] 当前页码:3 https://e-hentai.org/g/3592369/44385b2a36?p=2 +[2025-10-21 09:48:05,830] [INFO] 保存成功 -> downloads/[Zefrost]Lumine[GenshinImpact][AIGenerated]-E-HentaiGalleries/44385b2a36.json (39 张) +[2025-10-21 09:48:05,833] [INFO] 全部画廊抓取完成! diff --git a/download.log b/download.log new file mode 100644 index 0000000..f7368e6 --- /dev/null +++ b/download.log @@ -0,0 +1,121 @@ +[2025-10-21 09:50:09,289] [INFO] HTTP Request: GET https://e-hentai.org/s/5dc7e7c9ca/3592369-37 "HTTP/1.1 200 OK" +[2025-10-21 09:50:09,300] [INFO] HTTP Request: GET https://e-hentai.org/s/a289ed6092/3592369-6 "HTTP/1.1 200 OK" +[2025-10-21 09:50:09,306] [INFO] HTTP Request: GET https://e-hentai.org/s/e77d30e253/3592369-20 "HTTP/1.1 200 OK" +[2025-10-21 09:50:09,309] [INFO] HTTP Request: GET https://e-hentai.org/s/e8d19e3ff5/3592369-28 "HTTP/1.1 200 OK" +[2025-10-21 09:50:09,309] [INFO] HTTP Request: GET https://e-hentai.org/s/6d6ab9db19/3592369-17 "HTTP/1.1 200 OK" +[2025-10-21 09:50:09,318] [INFO] HTTP Request: GET https://e-hentai.org/s/0ad0ad6468/3592369-9 "HTTP/1.1 200 OK" +[2025-10-21 09:50:09,322] [INFO] HTTP Request: GET https://e-hentai.org/s/f4f85d3a9d/3592369-38 "HTTP/1.1 200 OK" +[2025-10-21 09:50:09,325] [INFO] HTTP Request: GET https://e-hentai.org/s/5eb45055e4/3592369-16 "HTTP/1.1 200 OK" +[2025-10-21 09:50:09,326] [INFO] HTTP Request: GET https://e-hentai.org/s/1bf21226cf/3592369-36 "HTTP/1.1 200 OK" +[2025-10-21 09:50:09,329] [INFO] HTTP Request: GET https://e-hentai.org/s/1f73a1930b/3592369-8 "HTTP/1.1 200 OK" +[2025-10-21 09:50:09,331] [INFO] HTTP Request: GET https://e-hentai.org/s/c17713f0bc/3592369-19 "HTTP/1.1 200 OK" +[2025-10-21 09:50:09,336] [INFO] HTTP Request: GET https://e-hentai.org/s/e1a514611c/3592369-18 "HTTP/1.1 200 OK" +[2025-10-21 09:50:09,338] [INFO] HTTP Request: GET https://e-hentai.org/s/3c29efdabf/3592369-26 "HTTP/1.1 200 OK" +[2025-10-21 09:50:09,340] [INFO] HTTP Request: GET https://e-hentai.org/s/157ab9c71f/3592369-2 "HTTP/1.1 200 OK" +[2025-10-21 09:50:09,442] [INFO] HTTP Request: GET https://e-hentai.org/s/af0d7dcb70/3592369-3 "HTTP/1.1 200 OK" +[2025-10-21 09:50:09,443] [INFO] HTTP Request: GET https://e-hentai.org/s/1d48859dbf/3592369-39 "HTTP/1.1 200 OK" +[2025-10-21 09:50:09,444] [INFO] HTTP Request: GET https://e-hentai.org/s/610b4330d0/3592369-7 "HTTP/1.1 200 OK" +[2025-10-21 09:50:09,451] [INFO] HTTP Request: GET https://ootkwsb.kwiddigykmru.hath.network/h/491e4290680f99be50445daeb1195b719d07bfcd-231324-1280-1871-wbp/keystamp=1761012000-b6dfac47c9;fileindex=206915210;xres=1280/6.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:09,504] [INFO] HTTP Request: GET https://e-hentai.org/s/f40dd06b93/3592369-10 "HTTP/1.1 200 OK" +[2025-10-21 09:50:09,508] [INFO] HTTP Request: GET https://e-hentai.org/s/a7e73c3fa1/3592369-29 "HTTP/1.1 200 OK" +[2025-10-21 09:50:09,509] [INFO] HTTP Request: GET https://e-hentai.org/s/a0b40a2f83/3592369-27 "HTTP/1.1 200 OK" +[2025-10-21 09:50:09,544] [INFO] HTTP Request: GET https://rgwxucy.aiuzlmvqxtsv.hath.network:2333/h/2154b90a033e96861f84162043af0cb77a0f48e4-242530-1280-1871-wbp/keystamp=1761012000-5047d72bfd;fileindex=206915260;xres=1280/37.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:09,597] [INFO] HTTP Request: GET https://edkvjgk.vuxolcremfnq.hath.network/h/479c43d09cc7c2eed15c0cd69b64dfcd91d01eb2-218708-1280-1806-wbp/keystamp=1761012000-c2bb866bdf;fileindex=206915213;xres=1280/9.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:09,609] [INFO] HTTP Request: GET https://abqwlpg.aarxvsksgsgb.hath.network/h/2d37b57cd28036b69d395d9c717a9b19869b90a3-215060-1280-1871-wbp/keystamp=1761012000-5f129c151a;fileindex=206915223;xres=1280/19.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:09,628] [INFO] [OK] 0006.webp +[2025-10-21 09:50:09,660] [INFO] HTTP Request: GET https://eofajpt.vmzdvwgmbbym.hath.network:10550/h/1a273190063f21c73d8c13595123bef358733377-221852-1280-1871-wbp/keystamp=1761012000-a9046e82fb;fileindex=206915224;xres=1280/20.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:09,707] [INFO] HTTP Request: GET https://souqynf.xwnmkbyawzlw.hath.network/h/32970dd6c082aeb78d664faeaa4a6d2d1257c61c-249830-1280-1871-wbp/keystamp=1761012000-0e26ffcb90;fileindex=206915264;xres=1280/38.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:09,730] [INFO] HTTP Request: GET https://lvwpmir.kvkgycutnwul.hath.network/h/f856bce9c53f86f508e0a7bd0bd787a901ac41bd-192884-1280-1871-wbp/keystamp=1761012000-2d1d5f9608;fileindex=206915222;xres=1280/18.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:09,739] [INFO] [OK] 0009.webp +[2025-10-21 09:50:09,748] [INFO] [OK] 0037.webp +[2025-10-21 09:50:09,759] [INFO] [OK] 0019.webp +[2025-10-21 09:50:09,776] [INFO] HTTP Request: GET https://fjhhobt.crleptkdnaih.hath.network:9999/h/eca0d63cbef2ce4799a5fcb54fc27a363add6f8e-254418-1280-1871-wbp/keystamp=1761012000-e7491ad660;fileindex=206915206;xres=1280/2.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:09,781] [INFO] [OK] 0020.webp +[2025-10-21 09:50:09,783] [INFO] HTTP Request: GET https://zdfyyze.xlnvhrtompao.hath.network:8472/h/f3b93d2eaf86644298998640c8c12f3a28ccf4df-220886-1280-1871-wbp/keystamp=1761012000-42f53f2658;fileindex=206915257;xres=1280/36.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:09,784] [INFO] HTTP Request: GET https://rgwxucy.aiuzlmvqxtsv.hath.network:2333/h/761c4a67a633cb78a53d48160bf091fc5e3389df-246580-1280-1871-wbp/keystamp=1761012000-846ba026cf;fileindex=206915233;xres=1280/29.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:09,800] [INFO] [OK] 0038.webp +[2025-10-21 09:50:09,806] [INFO] HTTP Request: GET https://azpbfqg.xycyegvkityr.hath.network/h/c0b2f298de3b5664755fa6d15aaad77df7300ac9-250078-1280-1871-wbp/keystamp=1761012000-6bbbce8e1f;fileindex=206915266;xres=1280/39.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:09,808] [INFO] HTTP Request: GET https://zdfyyze.xlnvhrtompao.hath.network:8472/h/8a519096aa5aef773cf1221afdf63e3595974303-137712-1280-876-wbp/keystamp=1761012000-3f39084973;fileindex=206915232;xres=1280/28.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:09,877] [INFO] [OK] 0018.webp +[2025-10-21 09:50:09,917] [INFO] HTTP Request: GET https://e-hentai.org/s/c3086cd37a/3592369-30 "HTTP/1.1 200 OK" +[2025-10-21 09:50:09,942] [INFO] HTTP Request: GET https://dtnasqs.kvkgycutnwul.hath.network/h/20c17a63376f2a5f9bad449d842b0b27bbaa0e57-209450-1280-1871-wbp/keystamp=1761012000-6b30f2619c;fileindex=206915212;xres=1280/8.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:09,949] [INFO] HTTP Request: GET https://tfduazx.wsttelgpaeyt.hath.network/h/0e075486fb14aeb39124063ea4dd6ec046a880d9-210868-1280-1871-wbp/keystamp=1761012000-b9e1d48fe1;fileindex=206915211;xres=1280/7.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:09,955] [INFO] [OK] 0002.webp +[2025-10-21 09:50:09,967] [INFO] HTTP Request: GET https://guihapy.hbspagyqqtxb.hath.network:40890/h/1cd65af761b8a18f883848d111f0fed050bd33af-147364-1280-876-wbp/keystamp=1761012000-b112f8e9e6;fileindex=206915231;xres=1280/27.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:09,972] [INFO] HTTP Request: GET https://keqaltd.jguqrykeppde.hath.network/h/8f893bf3b714bc0490c55303cc8dd822e221c826-168160-1280-1871-wbp/keystamp=1761012000-552e344f8c;fileindex=206915207;xres=1280/3.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:10,006] [INFO] [OK] 0028.webp +[2025-10-21 09:50:10,008] [INFO] [OK] 0036.webp +[2025-10-21 09:50:10,013] [INFO] [OK] 0029.webp +[2025-10-21 09:50:10,013] [INFO] [OK] 0039.webp +[2025-10-21 09:50:10,073] [INFO] HTTP Request: GET https://e-hentai.org/s/978a8534fe/3592369-11 "HTTP/1.1 200 OK" +[2025-10-21 09:50:10,082] [INFO] HTTP Request: GET https://e-hentai.org/s/68c135402c/3592369-21 "HTTP/1.1 200 OK" +[2025-10-21 09:50:10,085] [INFO] HTTP Request: GET https://e-hentai.org/s/034d7dbbe9/3592369-1 "HTTP/1.1 200 OK" +[2025-10-21 09:50:10,089] [INFO] HTTP Request: GET https://e-hentai.org/s/b4d07cf983/3592369-31 "HTTP/1.1 200 OK" +[2025-10-21 09:50:10,107] [INFO] [OK] 0007.webp +[2025-10-21 09:50:10,121] [INFO] HTTP Request: GET https://e-hentai.org/s/79edc10e97/3592369-12 "HTTP/1.1 200 OK" +[2025-10-21 09:50:10,124] [INFO] HTTP Request: GET https://bnmmlpg.deaiusnxncea.hath.network:1443/h/a97c0aa83fcd713cd992f43530c2579215f53cd7-239002-1280-1871-wbp/keystamp=1761012000-d880bc702d;fileindex=206915220;xres=1280/16.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:10,129] [INFO] [OK] 0027.webp +[2025-10-21 09:50:10,130] [INFO] [OK] 0008.webp +[2025-10-21 09:50:10,159] [INFO] HTTP Request: GET https://e-hentai.org/s/e58ace2a4e/3592369-22 "HTTP/1.1 200 OK" +[2025-10-21 09:50:10,162] [INFO] [OK] 0003.webp +[2025-10-21 09:50:10,173] [INFO] HTTP Request: GET https://e-hentai.org/s/7ca92ebded/3592369-32 "HTTP/1.1 200 OK" +[2025-10-21 09:50:10,192] [INFO] HTTP Request: GET https://vrbufha.vmfgucyvqdnc.hath.network:54200/h/3aefc20ea425d02066eabb3cc1e50e5704af76ef-187914-1280-1711-wbp/keystamp=1761012000-a2d6a67f93;fileindex=206915221;xres=1280/17.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:10,340] [INFO] HTTP Request: GET https://e-hentai.org/s/812f2f038d/3592369-23 "HTTP/1.1 200 OK" +[2025-10-21 09:50:10,342] [INFO] HTTP Request: GET https://mpikyhe.aiuzlmvqxtsv.hath.network:2333/h/753164bc8dc4542e0c230f638b4386ca8619cbe2-297430-1280-1979-wbp/keystamp=1761012000-d82874661b;fileindex=206915225;xres=1280/21.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:10,343] [INFO] HTTP Request: GET https://e-hentai.org/s/074e08084e/3592369-33 "HTTP/1.1 200 OK" +[2025-10-21 09:50:10,344] [INFO] HTTP Request: GET https://e-hentai.org/s/9c2a986a28/3592369-14 "HTTP/1.1 200 OK" +[2025-10-21 09:50:10,357] [INFO] HTTP Request: GET https://ivvskci.fzrmljssagym.hath.network:8440/h/15c1d8922362585a3dbf144c8826939be4081874-142306-1280-876-wbp/keystamp=1761012000-f889d50289;fileindex=206915244;xres=1280/32.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:10,358] [INFO] HTTP Request: GET https://e-hentai.org/s/4d1b0f3229/3592369-13 "HTTP/1.1 200 OK" +[2025-10-21 09:50:10,361] [INFO] HTTP Request: GET https://e-hentai.org/s/8cc11eedf4/3592369-24 "HTTP/1.1 200 OK" +[2025-10-21 09:50:10,366] [INFO] [OK] 0016.webp +[2025-10-21 09:50:10,395] [INFO] HTTP Request: GET https://bkfffat.gndccnejxjhr.hath.network:11000/h/6f1ad3290e12aca2721e58c081921f4d09e99e4a-135842-1280-818-wbp/keystamp=1761012000-6fcdb7b47a;fileindex=206915237;xres=1280/30.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:10,398] [INFO] HTTP Request: GET https://e-hentai.org/s/d076c1acce/3592369-5 "HTTP/1.1 200 OK" +[2025-10-21 09:50:10,407] [INFO] HTTP Request: GET https://gkapxvr.tkxtucyyuokp.hath.network:5589/h/257cefeaa4e419fb0ea973b04ee1ce115eb17433-143432-1280-876-wbp/keystamp=1761012000-e92f233cfc;fileindex=206915240;xres=1280/31.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:10,417] [INFO] HTTP Request: GET https://rszxnyz.zvpgrcysqbsg.hath.network:9487/h/bd610b3c48497bb478a1497204d160dc16d92002-210912-1280-1871-wbp/keystamp=1761012000-0175ca693c;fileindex=206915216;xres=1280/12.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:10,424] [INFO] HTTP Request: GET https://e-hentai.org/s/2a6dd97367/3592369-34 "HTTP/1.1 200 OK" +[2025-10-21 09:50:10,466] [INFO] [OK] 0032.webp +[2025-10-21 09:50:10,466] [INFO] [OK] 0030.webp +[2025-10-21 09:50:10,552] [INFO] [OK] 0017.webp +[2025-10-21 09:50:10,581] [INFO] HTTP Request: GET https://uamvwcc.dnaecumvegal.hath.network/h/eca101db83cdb56102ad266fe733f2e4ff6d8127-231550-1280-1871-wbp/keystamp=1761012000-961d434035;fileindex=206915227;xres=1280/23.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:10,586] [INFO] HTTP Request: GET https://kkyodzg.zcemqwwmmmnm.hath.network:10443/h/f1141462591835e3f0690e76e44932a9808095fd-227984-1280-1871-wbp/keystamp=1761012000-40bbfb0967;fileindex=206915214;xres=1280/10.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:10,587] [INFO] [OK] 0021.webp +[2025-10-21 09:50:10,594] [INFO] HTTP Request: GET https://oecbenb.nklfziorgpct.hath.network/h/285f142ab77ba95bd880dc8696befe80d1b4824c-178230-1280-1871-wbp/keystamp=1761012000-d77335899a;fileindex=206915209;xres=1280/5.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:10,596] [INFO] [OK] 0031.webp +[2025-10-21 09:50:10,614] [INFO] HTTP Request: GET https://scetefj.vybkgxtakdgj.hath.network:53999/h/7098e0c0a6f9ee59a7b203acb4a70abecee6b56f-203292-1280-1871-wbp/keystamp=1761012000-1535eba479;fileindex=206915205;xres=1280/1.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:10,616] [INFO] HTTP Request: GET https://tbvldoq.iaenqdfkpngs.hath.network:37828/h/a82a2fd04e6bd61c53bc7e3e4ef562780145d80d-217098-1280-1871-wbp/keystamp=1761012000-4920ac50c7;fileindex=206915215;xres=1280/11.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:10,618] [INFO] HTTP Request: GET https://e-hentai.org/s/a371ec0c01/3592369-15 "HTTP/1.1 200 OK" +[2025-10-21 09:50:10,624] [INFO] HTTP Request: GET https://zkwstjw.fzrmljssagym.hath.network/h/d140ded4f67a8fd900662363e3d6ad3603c4f083-217186-1280-1871-wbp/keystamp=1761012000-2364d9ff32;fileindex=206915217;xres=1280/13.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:10,637] [INFO] [OK] 0012.webp +[2025-10-21 09:50:10,695] [INFO] [OK] 0005.webp +[2025-10-21 09:50:10,731] [INFO] [OK] 0023.webp +[2025-10-21 09:50:10,736] [INFO] HTTP Request: GET https://nynqbxc.fqwheaagiqwm.hath.network/h/624290c99f27508b2b9d3e744c1c19f6e89fe5b2-214622-1280-1871-wbp/keystamp=1761012000-dc67546278;fileindex=206915218;xres=1280/14.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:10,740] [INFO] HTTP Request: GET https://nynqbxc.fqwheaagiqwm.hath.network/h/64940e0c9d9dcfbe44766f168b42de206f1bab2e-203374-1280-1871-wbp/keystamp=1761012000-4ce1461501;fileindex=206915247;xres=1280/33.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:10,747] [INFO] HTTP Request: GET https://tjelitm.wudbjgwegqea.hath.network:8002/h/15eee1dfb95499144b5fc68fd29441de14cbc811-241544-1280-1871-wbp/keystamp=1761012000-b38884a626;fileindex=206915226;xres=1280/22.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:10,790] [INFO] HTTP Request: GET https://e-hentai.org/s/18199002ef/3592369-25 "HTTP/1.1 200 OK" +[2025-10-21 09:50:10,792] [INFO] HTTP Request: GET https://e-hentai.org/s/e8f6dba369/3592369-35 "HTTP/1.1 200 OK" +[2025-10-21 09:50:10,821] [INFO] [OK] 0011.webp +[2025-10-21 09:50:10,850] [INFO] [OK] 0001.webp +[2025-10-21 09:50:10,854] [INFO] HTTP Request: GET https://pgymasw.nghujfsbvlwr.hath.network:1024/h/7830f171c2e6a6079c63d02a51808cbc20db0ef0-216106-1280-1871-wbp/keystamp=1761012000-5c4d4e2949;fileindex=206915228;xres=1280/24.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:10,866] [INFO] [OK] 0013.webp +[2025-10-21 09:50:10,891] [INFO] [OK] 0022.webp +[2025-10-21 09:50:10,892] [INFO] [OK] 0033.webp +[2025-10-21 09:50:10,902] [INFO] [OK] 0014.webp +[2025-10-21 09:50:10,909] [INFO] HTTP Request: GET https://xtrkjip.qialcjprjsjy.hath.network:32342/h/c94e5c3bc32877a80e789b17dc44a4de2c8c0e0b-204386-1280-1871-wbp/keystamp=1761012000-beef96ea24;fileindex=206915250;xres=1280/34.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:11,042] [INFO] [OK] 0024.webp +[2025-10-21 09:50:11,087] [INFO] HTTP Request: GET https://zyzursa.xwnmkbyawzlw.hath.network/h/fdd055dc8b74984aa2aee5a761c6fbe4f284b9ad-246060-1280-1871-wbp/keystamp=1761012000-13f52032e1;fileindex=206915254;xres=1280/35.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:11,116] [INFO] HTTP Request: GET https://byravvz.aqhqjktsvooz.hath.network:10550/h/cc5b5c5d9f67270847048df1944d2fddc1f316c1-226938-1280-1871-wbp/keystamp=1761012000-855cbeeab0;fileindex=206915219;xres=1280/15.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:11,170] [INFO] HTTP Request: GET https://dpoonwl.vmfgucyvqdnc.hath.network:54200/h/190563367f45e65e9a265b89670e5a48c97b5d70-145580-1280-876-wbp/keystamp=1761012000-1a6d164095;fileindex=206915229;xres=1280/25.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:11,175] [INFO] [OK] 0010.webp +[2025-10-21 09:50:11,178] [INFO] [OK] 0034.webp +[2025-10-21 09:50:11,376] [INFO] [OK] 0035.webp +[2025-10-21 09:50:11,378] [INFO] [OK] 0015.webp +[2025-10-21 09:50:11,388] [INFO] [OK] 0025.webp +[2025-10-21 09:50:15,028] [ERROR] [ERROR] https://e-hentai.org/s/b196df0720/3592369-4 -> (1/3) +[2025-10-21 09:50:16,319] [INFO] HTTP Request: GET https://e-hentai.org/s/b196df0720/3592369-4 "HTTP/1.1 200 OK" +[2025-10-21 09:50:17,525] [INFO] HTTP Request: GET https://ywfviwx.cjvambnkjwfw.hath.network/h/bee0622509a464a1227f66a781d88baa1ddf3cad-266006-1280-1871-wbp/keystamp=1761012000-29e47aca95;fileindex=206915230;xres=1280/26.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:18,149] [INFO] [OK] 0026.webp +[2025-10-21 09:50:21,327] [ERROR] [ERROR] https://e-hentai.org/s/b196df0720/3592369-4 -> (2/3) +[2025-10-21 09:50:22,638] [INFO] HTTP Request: GET https://e-hentai.org/s/b196df0720/3592369-4 "HTTP/1.1 200 OK" +[2025-10-21 09:50:23,355] [INFO] HTTP Request: GET https://rfnbhfn.bmipocmfowxa.hath.network/h/999ef03dd73f17fbe139e124d438e9880617bcdb-157866-1280-1871-wbp/keystamp=1761012000-114cdaa4d5;fileindex=206915208;xres=1280/4.webp "HTTP/1.1 200 OK" +[2025-10-21 09:50:23,517] [INFO] [OK] 0004.webp +[2025-10-21 09:50:23,518] [INFO] 全部下载完成! diff --git a/downloads/.DS_Store b/downloads/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..2cb4512e0678de2baab69ed6a95695da81feaaf9 GIT binary patch literal 10244 zcmeHMTWl0n82K-e)`lCRTaMR;r=kr_n`*;bwnUE~m)WA4`sM>8W9GPJpA^`jzrVn|tFSsX z7eJ+*l$oR#=VRaUSuvelo0yfN`ogSSD$I&}N4YXj>+S39R|W@+lx@Y0WBQ0%;n39V zCbc`G=V(g$Q?{8Mx115RGLSu^44EvCskldZx@Wo*;zwjIMYY-@19)hFFTpjk}= zLynzs+q_^Ss+x8513JYra(X*Oq)-d^Xk8OLjMJxQ9FjG$h?pb!?EJ;cR;*fIzp-h1 zYe#3-Oodvx;Le4LGDPdZa*e}=p6SgSX?Jum;iPmcZCFS8bB1FiO})oTjO&$Bvn`Z7D1ria;Qr+LJ*=wGef&Db!vw`Fvyg;`mn zt&`OR>v0GO5u#S9lT}CV8KcE2T%$@OQ`2&_Ybj1BT|E$K8x;uv;6plLK4hLtmjn*_O_sQMLStVUoDP!n4(ZapaFg$27W z`4{_gSWTNr40_-&*l+?)!D)CC-iPz>1zdz5;V1YFuE3v&C}9yQI1ejO#VTBhHMj~_ zVl2cV;op z$C4w&k%w^%UCa?rjuKNI#mDe* zd;*`uXYo0F-eb#49$Q|;v-mom!#D6PJdYpZNBA**f}i6zcnQC|iW7Tha{_;z3r^(X z8OyY-BQ#clo3kGy&;kSk1OfyC1OfyC1a5*rk!TO|^Zy+;{{R0bQG(_GfdGO3GXhxL z9&c}@H@MMnYJS!prt%OKe(`?OLV7M#@h;r%9mkWxkK@<+HvgE$YmfQ1X(2s#^7GtD XiqrgC{%1gt|Ig*|T#*0YhWY