#!/usr/bin/env python3 """ 批量抓取法律文书模板内容 """ import os import re import json import time import subprocess import html BASE_URL = "https://www.court.gov.cn" TEMPLATE_DIR = "/root/.openclaw/workspace/知识库/法律文书模板库/最高人民法院" URL_LIST_FILE = "/root/.openclaw/workspace/知识库/法律文书模板库/全部模板URL列表.json" PROGRESS_FILE = "/root/.openclaw/workspace/知识库/法律文书模板库/抓取进度.json" DONE_FILE = "/root/.openclaw/workspace/知识库/法律文书模板库/已完成抓取.json" # 分类映射 - 根据URL推断类别 CATEGORY_MAP = { # 当事人参考 - 起诉状、答辩状类 "181": "起诉状类", "187": "起诉状类", "196": "起诉状类", "203": "起诉状类", "14": "上诉状类", "379": "上诉状类", "754": "上诉状类", "613": "再审类", "755": "再审类", "216": "答辩状类", "224": "答辩状类", "753": "答辩状类", # 保全类 "126": "保全类", "113": "保全类", "131": "保全类", "133": "保全类", "137": "保全类", "141": "保全类", "94": "保全类", "98": "保全类", "277": "保全类", "319": "保全类", "325": "保全类", "328": "保全类", "331": "保全类", "333": "保全类", "336": "保全类", "339": "保全类", "341": "保全类", "345": "保全类", "348": "保全类", "760": "保全类", "761": "保全类", # 证据类 "74": "证据类", "76": "证据类", "79": "证据类", "82": "证据类", "87": "证据类", "91": "证据类", "102": "证据类", # 执行类 "4": "执行类", "10": "执行类", "12": "执行类", "18": "执行类", "20": "执行类", "24": "执行类", "28": "执行类", "31": "执行类", "35": "执行类", "40": "执行类", "43": "执行类", "49": "执行类", "54": "执行类", "58": "执行类", "61": "执行类", "63": "执行类", "65": "执行类", "69": "执行类", "75": "执行类", "77": "执行类", "164": "执行类", "166": "执行类", "169": "执行类", "173": "执行类", "175": "执行类", "179": "执行类", "184": "执行类", "190": "执行类", "193": "执行类", "197": "执行类", "204": "执行类", "208": "执行类", "212": "执行类", "221": "执行类", "228": "执行类", "248": "执行类", "255": "执行类", "258": "执行类", "262": "执行类", "266": "执行类", "270": "执行类", "275": "执行类", "282": "执行类", "286": "执行类", "290": "执行类", "295": "执行类", "300": "执行类", "302": "执行类", "304": "执行类", "306": "执行类", "309": "执行类", "311": "执行类", "312": "执行类", "316": "执行类", "320": "执行类", "322": "执行类", "327": "执行类", "332": "执行类", "338": "执行类", "342": "执行类", "346": "执行类", "349": "执行类", "352": "执行类", "354": "执行类", "357": "执行类", "360": "执行类", "362": "执行类", "365": "执行类", "372": "执行类", "374": "执行类", "376": "执行类", "377": "执行类", "380": "执行类", "382": "执行类", "394": "执行类", "403": "执行类", "405": "执行类", "409": "执行类", "411": "执行类", "417": "执行类", "420": "执行类", "427": "执行类", "431": "执行类", "434": "执行类", "437": "执行类", "438": "执行类", "441": "执行类", "443": "执行类", "445": "执行类", "447": "执行类", "449": "执行类", "452": "执行类", "454": "执行类", "457": "执行类", "461": "执行类", "463": "执行类", "467": "执行类", "484": "执行类", "490": "执行类", "494": "执行类", "498": "执行类", "501": "执行类", "503": "执行类", "508": "执行类", "512": "执行类", "524": "执行类", "527": "执行类", "539": "执行类", "543": "执行类", "549": "执行类", "553": "执行类", "639": "执行类", "640": "执行类", "642": "执行类", "646": "执行类", "648": "执行类", "651": "执行类", "652": "执行类", "653": "执行类", # 申请书类 "22": "申请书类", "51": "申请书类", "59": "申请书类", "66": "申请书类", "113": "申请书类", "118": "申请书类", "131": "申请书类", "133": "申请书类", "137": "申请书类", "139": "申请书类", "141": "申请书类", "143": "申请书类", "159": "申请书类", "231": "申请书类", "235": "申请书类", "241": "申请书类", "250": "申请书类", "272": "申请书类", "280": "申请书类", "287": "申请书类", "293": "申请书类", "299": "申请书类", "402": "申请书类", "407": "申请书类", "432": "申请书类", "466": "申请书类", "469": "申请书类", "473": "申请书类", "476": "申请书类", "479": "申请书类", "485": "申请书类", "492": "申请书类", "499": "申请书类", "507": "申请书类", "513": "申请书类", "521": "申请书类", "526": "申请书类", "534": "申请书类", "538": "申请书类", "545": "申请书类", "554": "申请书类", "560": "申请书类", "564": "申请书类", "571": "申请书类", "591": "申请书类", "594": "申请书类", "602": "申请书类", "616": "申请书类", "622": "申请书类", "625": "申请书类", "630": "申请书类", "632": "申请书类", "635": "申请书类", "637": "申请书类", "654": "申请书类", "763": "申请书类", "764": "申请书类", "765": "申请书类", "766": "申请书类", "768": "申请书类", "769": "申请书类", "770": "申请书类", "771": "申请书类", "772": "申请书类", "773": "申请书类", "781": "申请书类", # 通知书类 "123": "通知书类", "125": "通知书类", "128": "通知书类", "130": "通知书类", "132": "通知书类", "134": "通知书类", "135": "通知书类", "136": "通知书类", "138": "通知书类", "164": "通知书类", "169": "通知书类", "458": "通知书类", "460": "通知书类", "462": "通知书类", "465": "通知书类", "542": "通知书类", "614": "通知书类", "615": "通知书类", "656": "通知书类", "657": "通知书类", "658": "通知书类", "659": "通知书类", "660": "通知书类", "661": "通知书类", "662": "通知书类", "682": "通知书类", "683": "通知书类", "684": "通知书类", "685": "通知书类", "686": "通知书类", "687": "通知书类", "688": "通知书类", "689": "通知书类", "690": "通知书类", "691": "通知书类", "692": "通知书类", "693": "通知书类", "694": "通知书类", "696": "通知书类", "699": "通知书类", "701": "通知书类", "703": "通知书类", "704": "通知书类", "705": "通知书类", "707": "通知书类", "708": "通知书类", "709": "通知书类", "712": "通知书类", "717": "通知书类", "718": "通知书类", "720": "通知书类", "724": "通知书类", "728": "通知书类", "731": "通知书类", "733": "通知书类", # 判决书类 "5": "判决书类", "7": "判决书类", "9": "判决书类", "11": "判决书类", "13": "判决书类", "19": "判决书类", "21": "判决书类", "57": "判决书类", "71": "判决书类", "73": "判决书类", "78": "判决书类", "81": "判决书类", "83": "判决书类", "129": "判决书类", "150": "判决书类", "152": "判决书类", "154": "判决书类", "156": "判决书类", "171": "判决书类", "174": "判决书类", "176": "判决书类", "177": "判决书类", "178": "判决书类", "180": "判决书类", "182": "判决书类", "185": "判决书类", "186": "判决书类", "188": "判决书类", "236": "判决书类", "239": "判决书类", "243": "判决书类", "260": "判决书类", "276": "判决书类", "289": "判决书类", "292": "判决书类", "296": "判决书类", "305": "判决书类", "317": "判决书类", "321": "判决书类", "323": "判决书类", "324": "判决书类", "347": "判决书类", "356": "判决书类", "358": "判决书类", "367": "判决书类", "369": "判决书类", "371": "判决书类", "383": "判决书类", "385": "判决书类", "388": "判决书类", "391": "判决书类", "395": "判决书类", "396": "判决书类", "404": "判决书类", "406": "判决书类", "471": "判决书类", "552": "判决书类", "555": "判决书类", # 裁定书类 "1": "裁定书类", "8": "裁定书类", "15": "裁定书类", "17": "裁定书类", "23": "裁定书类", "25": "裁定书类", "27": "裁定书类", "29": "裁定书类", "30": "裁定书类", "32": "裁定书类", "34": "裁定书类", "36": "裁定书类", "38": "裁定书类", "39": "裁定书类", "41": "裁定书类", "44": "裁定书类", "60": "裁定书类", "62": "裁定书类", "64": "裁定书类", "85": "裁定书类", "93": "裁定书类", "96": "裁定书类", "97": "裁定书类", "99": "裁定书类", "100": "裁定书类", "101": "裁定书类", "103": "裁定书类", "105": "裁定书类", "106": "裁定书类", "107": "裁定书类", "108": "裁定书类", "110": "裁定书类", "111": "裁定书类", "112": "裁定书类", "114": "裁定书类", "116": "裁定书类", "119": "裁定书类", "121": "裁定书类", "199": "裁定书类", "200": "裁定书类", "201": "裁定书类", "205": "裁定书类", "206": "裁定书类", "207": "裁定书类", "209": "裁定书类", "210": "裁定书类", "213": "裁定书类", "214": "裁定书类", "215": "裁定书类", "217": "裁定书类", "219": "裁定书类", "222": "裁定书类", "223": "裁定书类", "226": "裁定书类", "227": "裁定书类", "229": "裁定书类", "230": "裁定书类", "232": "裁定书类", "234": "裁定书类", "237": "裁定书类", "245": "裁定书类", "246": "裁定书类", "247": "裁定书类", "249": "裁定书类", "252": "裁定书类", "253": "裁定书类", "256": "裁定书类", "261": "裁定书类", "263": "裁定书类", "265": "裁定书类", "267": "裁定书类", "269": "裁定书类", "271": "裁定书类", "273": "裁定书类", "274": "裁定书类", "278": "裁定书类", "279": "裁定书类", "281": "裁定书类", "284": "裁定书类", "285": "裁定书类", "288": "裁定书类", "291": "裁定书类", "294": "裁定书类", "297": "裁定书类", "298": "裁定书类", "301": "裁定书类", "303": "裁定书类", "308": "裁定书类", "310": "裁定书类", "313": "裁定书类", "315": "裁定书类", "326": "裁定书类", "330": "裁定书类", "334": "裁定书类", "340": "裁定书类", "344": "裁定书类", "364": "裁定书类", "366": "裁定书类", "408": "裁定书类", "410": "裁定书类", "413": "裁定书类", "415": "裁定书类", "416": "裁定书类", "419": "裁定书类", "422": "裁定书类", "435": "裁定书类", "439": "裁定书类", "440": "裁定书类", "444": "裁定书类", "446": "裁定书类", "448": "裁定书类", "450": "裁定书类", "451": "裁定书类", "453": "裁定书类", "455": "裁定书类", "456": "裁定书类", "459": "裁定书类", "464": "裁定书类", "468": "裁定书类", "470": "裁定书类", "472": "裁定书类", "474": "裁定书类", "475": "裁定书类", "477": "裁定书类", "478": "裁定书类", "480": "裁定书类", "481": "裁定书类", "482": "裁定书类", "483": "裁定书类", "486": "裁定书类", "488": "裁定书类", "489": "裁定书类", "491": "裁定书类", "493": "裁定书类", "495": "裁定书类", "497": "裁定书类", "500": "裁定书类", "502": "裁定书类", "504": "裁定书类", "506": "裁定书类", "509": "裁定书类", "510": "裁定书类", "514": "裁定书类", "515": "裁定书类", "516": "裁定书类", "517": "裁定书类", "519": "裁定书类", "520": "裁定书类", "522": "裁定书类", "525": "裁定书类", "529": "裁定书类", "530": "裁定书类", "532": "裁定书类", "533": "裁定书类", "537": "裁定书类", "540": "裁定书类", "541": "裁定书类", "544": "裁定书类", "547": "裁定书类", "548": "裁定书类", "551": "裁定书类", "556": "裁定书类", "557": "裁定书类", "558": "裁定书类", "561": "裁定书类", "563": "裁定书类", "570": "裁定书类", "573": "裁定书类", "575": "裁定书类", "577": "裁定书类", "578": "裁定书类", "581": "裁定书类", "586": "裁定书类", "589": "裁定书类", "596": "裁定书类", "599": "裁定书类", "601": "裁定书类", "603": "裁定书类", "605": "裁定书类", "606": "裁定书类", "608": "裁定书类", "610": "裁定书类", "612": "裁定书类", "618": "裁定书类", "619": "裁定书类", "621": "裁定书类", "624": "裁定书类", "626": "裁定书类", "627": "裁定书类", "628": "裁定书类", "629": "裁定书类", "631": "裁定书类", "633": "裁定书类", "634": "裁定书类", "636": "裁定书类", "638": "裁定书类", "641": "裁定书类", "643": "裁定书类", "644": "裁定书类", "645": "裁定书类", "647": "裁定书类", "649": "裁定书类", "650": "裁定书类", "655": "裁定书类", "674": "裁定书类", "679": "裁定书类", "680": "裁定书类", "681": "裁定书类", "702": "裁定书类", "706": "裁定书类", "710": "裁定书类", "719": "裁定书类", "721": "裁定书类", "723": "裁定书类", "725": "裁定书类", "726": "裁定书类", "727": "裁定书类", "729": "裁定书类", "730": "裁定书类", "732": "裁定书类", "734": "裁定书类", "735": "裁定书类", "739": "裁定书类", "740": "裁定书类", "742": "裁定书类", "743": "裁定书类", "746": "裁定书类", "747": "裁定书类", "748": "裁定书类", "749": "裁定书类", "750": "裁定书类", "751": "裁定书类", "752": "裁定书类", "762": "裁定书类", "767": "裁定书类", # 调解书类 "238": "调解书类", "242": "调解书类", "244": "调解书类", "251": "调解书类", "254": "调解书类", "257": "调解书类", "259": "调解书类", "268": "调解书类", "399": "调解书类", "401": "调解书类", "557": "调解书类", # 决定书类 "92": "决定书类", "95": "决定书类", "146": "决定书类", "155": "决定书类", "418": "决定书类", "421": "决定书类", "423": "决定书类", "426": "决定书类", "429": "决定书类", "523": "决定书类", "528": "裁定书类", "531": "决定书类", "542": "决定书类", "550": "决定书类", "558": "决定书类", "561": "决定书类", "570": "决定书类", "587": "决定书类", "591": "决定书类", "597": "决定书类", "601": "决定书类", "606": "决定书类", "609": "决定书类", "611": "决定书类", "719": "决定书类", "721": "决定书类", "723": "决定书类", "725": "决定书类", "726": "决定书类", "729": "决定书类", "734": "决定书类", "735": "决定书类", "739": "决定书类", "740": "决定书类", "742": "决定书类", # 函类 "28": "函类", "31": "函类", "35": "函类", "48": "函类", "52": "函类", "53": "函类", "56": "函类", "86": "函类", "88": "函类", "90": "函类", "124": "函类", "354": "函类", "412": "函类", "467": "函类", "484": "函类", "490": "函类", "566": "函类", "568": "函类", "585": "函类", "592": "函类", "598": "函类", "605": "函类", "615": "函类", "618": "函类", "619": "函类", "624": "函类", "626": "函类", "627": "函类", "629": "函类", "631": "函类", "633": "函类", "634": "函类", "636": "函类", "638": "函类", "641": "函类", "643": "函类", "644": "函类", "645": "函类", "647": "函类", "649": "函类", "650": "函类", "657": "函类", "672": "函类", "673": "函类", "675": "函类", "676": "函类", "677": "函类", "678": "函类", "746": "函类", "747": "函类", "748": "函类", "749": "函类", "750": "函类", "751": "函类", # 国家赔偿类 "436": "国家赔偿类", "446": "国家赔偿类", "487": "国家赔偿类", "515": "国家赔偿类", "525": "国家赔偿类", "529": "国家赔偿类", "541": "国家赔偿类", "550": "国家赔偿类", "558": "国家赔偿类", "573": "国家赔偿类", "621": "国家赔偿类", "695": "国家赔偿类", "697": "国家赔偿类", "698": "国家赔偿类", "700": "国家赔偿类", "702": "国家赔偿类", "706": "国家赔偿类", "710": "国家赔偿类", "719": "国家赔偿类", "721": "国家赔偿类", "723": "国家赔偿类", "725": "国家赔偿类", "726": "国家赔偿类", "727": "国家赔偿类", "729": "国家赔偿类", "730": "国家赔偿类", "740": "国家赔偿类", "742": "国家赔偿类", "743": "国家赔偿类", # 笔录类 "144": "笔录类", "145": "笔录类", "149": "笔录类", "268": "笔录类", "373": "笔录类", "665": "笔录类", "666": "笔录类", "667": "笔录类", "668": "笔录类", "669": "笔录类", } def get_html(url): """使用curl获取页面HTML""" try: result = subprocess.run( ['curl', '-s', '-L', '-A', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', url], capture_output=True, text=True, timeout=30 ) return result.stdout except Exception as e: print(f"Error fetching {url}: {e}") return "" def extract_template_content(page_html, url): """从模板详情页提取内容""" import html as html_module # 提取标题 title_match = re.search(r'