#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ blgpdf: Blogger 月別アーカイブを PDF 化(Playwright → PyMuPDF) - 例: ./blgpdf 202506 202509 # 2025年6月〜9月を順次処理 - 出力: ./YYYY-MM.pdf - ロジック: 1) https://koshix.blogspot.com/YYYY/MM/ を取得 2) 1日が含まれていない場合のみ「前の投稿」を1回だけ辿る 3) 各ページを Playwright(Chromium) で PDF 化(背景/JS 完了待ち/自動スクロール) 4) PyMuPDF で“実質白紙”ページを除去 5) 1枚に結合し YYYY-MM.pdf へ保存 """ import argparse import os import re import sys import time from pathlib import Path from urllib.parse import urljoin, urlparse import fitz # PyMuPDF import numpy as np import requests from bs4 import BeautifulSoup # ---- Playwright 同期 API を利用 from playwright.sync_api import sync_playwright BASE = "https://koshix.blogspot.com" def yyyymm_iter(start_yyyymm: str, end_yyyymm: str): sy = int(start_yyyymm[:4]) sm = int(start_yyyymm[4:]) ey = int(end_yyyymm[:4]) em = int(end_yyyymm[4:]) y, m = sy, sm while (y < ey) or (y == ey and m <= em): yield y, m m += 1 if m == 13: y += 1 m = 1 def month_url(year: int, month: int) -> str: # あなたのブログ構成に合わせて固定 return f"{BASE}/{year:04d}/{month:02d}/" def fetch_html(url: str, timeout=30) -> str: headers = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Safari/605.1.15" } r = requests.get(url, headers=headers, timeout=timeout) r.raise_for_status() return r.text def page_contains_day1(html: str, year: int, month: int) -> bool: """ Blogger の記事内