Ë
    Æq«jò,  ã                   óº   — d Z ddlZddlZddlZddlZddlZddlmZ ddlm	Z	 dZ
dZedz   ZdZd	Zd
ZdZdedz   dœZd„ Zd„ Zdd„Zd„ Zd„ Zd„ Zedk(  r e«        yy)uº  è€’é˜³å¸‚äººæ°‘æ”¿åºœ â€” é«˜æ–°æŠ€æœ¯äº§ä¸šå¼€å�‘åŒº é€šçŸ¥å…¬å‘Šçˆ¬è™«
URL: http://www.leiyang.gov.cn/xxgk/bmxxgkml/zfpcjg/sjjkfq/tzgg/
CMS: å�šå±±ç§‘æŠ€ (boshan) æ”¿åºœé—¨æˆ·ç³»ç»Ÿ
åˆ—è¡¨: div.submiInfor > ul > li > a, 5æ�¡/é¡µ, å…±14é¡µ70æ�¡(2015-09~2026-05)
åˆ†é¡µ: /tzgg/pages/{N}.html (ç¬¬1é¡µ=index.html)
è¯¦æƒ…: /tzgg/{YYYYMMDD}/i{ID}.html
  æ ‡é¢˜: meta ArticleTitle
  æ—¥æœŸ: meta PubDate
  æ­£æ–‡: div#div_content.general_article
é    N)ÚBeautifulSoup)Úurljoinz/root/search.dbzhttp://www.leiyang.gov.cnz!/xxgk/bmxxgkml/zfpcjg/sjjkfq/tzggu   è€’é˜³é«˜æ–°åŒº-é€šçŸ¥å…¬å‘Šu   æ¹–å�—zcrawl_leiyang_tzgg.pyé   z[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0 Safari/537.36ú/index.html)z
User-AgentÚRefererc                 óv  ‡— | s| S | D �cg c]  }t        |t        «      sŒ|‘Œ }}t        |«      t        | «      k7  r| S t        «       g }}| D ])  }||vsŒ|j	                  |«       |j                  |«       Œ+ |D �‡cg c]&  Št        ‰«      dk\  rt        ˆfd„|D «       «      s‰‘Œ( }}|r|S |S c c}w c c}w )u=  å‰”é™¤ã€Œå®¹å™¨æ®µã€�ï¼šfind_all(['p','div']) ä¼šå�Œæ—¶æ”¶ä¸‹å®¹å™¨ <div> ä¸Žå®ƒå†…éƒ¨çš„ <p>ï¼Œ
    å¯¼è‡´å�Œä¸€å†…å®¹é‡�å¤�ï¼ˆå®¹å™¨é‚£ä»½å¸¸è¿˜è¢« get_text(strip=True) æ‹�å¹³ï¼‰ã€‚
    åˆ¤æ�®ï¼šæŸ�æ®µè¢«åˆ—è¡¨å†…å�¦ä¸€æ®µå®Œå…¨åŒ…å�« â†’ å®ƒæ˜¯å®¹å™¨æ®µ â†’ å‰”é™¤ã€‚ä¿�æŠ¤ï¼šå‰”é™¤å�Žä¸ºç©ºåˆ™åŽŸæ ·è¿”å›žã€‚
    é(   c              3   ó:   •K  — | ]  }|‰uxr |xr |‰v –— Œ y ­w©N© )Ú.0ÚbÚas     €ú'/root/gov_crawler/crawl_leiyang_tzgg.pyú	<genexpr>z(_drop_container_parts.<locals>.<genexpr>0   s&   øè ø€ Ò(SÈ¨°!¨Ò)D¸Ò)D¸aÀ1¸fÓ)DÑ(Sùs   ƒ)Ú
isinstanceÚstrÚlenÚsetÚaddÚappendÚany)ÚpartsÚpÚpsÚseenÚuniqr   Úkeeps        ` r   Ú_drop_container_partsr      sÇ   ø€ ñ
 ØˆØÖ	1�œj¨¬CÕ0Š!Ð	1€BÐ	1Ü
ˆ2ƒw”#�e“*ÒØˆô “˜ˆ$€DØò (ˆØ�DŠ=Ø�H‰H�QŒK˜Ÿ™ Q�ð(ð ÷ V�!Ü˜“F˜b’L¤SÓ(SÈdÔ(SÔ%Sò ð V€Dð Váˆ4Ð!˜TÐ!ùò 
2ùòVs   ŠB1 B1Á>+B6c                 ó<   — t        | t        j                  d¬«       y )NT)ÚfileÚflush)ÚprintÚsysÚstderr)Úmsgs    r   Úlogr'   4   s   € Ü	ˆ#”C—J‘J dÖ+ó    c                 ó  — t        |«      D ]3  }	 t        j                  | t        d¬«      }d|_        |j
                  c S  y
# t        $ r9}t        d| › d|dz   › d|› d|› �«       t        j                  d	«       Y d }~Œtd }~ww xY w)Né   )ÚheadersÚtimeoutzutf-8z	  [WARN] u    è¯·æ±‚å¤±è´¥(é   ú/z): é   Ú )
ÚrangeÚrequestsÚgetÚHEADERSÚencodingÚtextÚ	Exceptionr'   ÚtimeÚsleep)ÚurlÚretriesÚattemptÚrÚes        r   Úfetchr?   8   s…   € Ü˜“>ò ˆð	Ü—‘˜S¬'¸2Ô>ˆAØ ˆAŒJØ—6‘6ŠMð	ð øô ò 	Ü�)˜C˜5 ¨w°q©y¨k¸¸7¸)À3ÀqÀcÐJÔKÜ�J‰J�q�M‰Mûð	ús   �.AÁ	BÁ/B Â Bc                 óh  — | dk  r
t         dz   }nt         › d| › d�}t        |«      }|sg S t        |d«      }|j                  dd¬«      }|sg S g }|j	                  d	«      D ]Î  }|j                  d
«      }|sŒ|j                  dd«      }|j                  d«      st        t        |«      }|j                  d¬«      }	t        j                  dd|	«      j                  «       }	t        j                  d|j                  «       «      }
|
r|
j                  d«      nd}|j                  |	||dœ«       ŒÐ |S )u)   æŠ“åˆ—è¡¨é¡µ, è¿”å›ž [{title, url, date}]r-   r   z/pages/z.htmlúhtml.parserÚdivÚ
submiInfor©Úclass_Úlir   Úhrefr0   ÚhttpT©Ústripu   ^(?:&middot;|Â·|&nbsp;|\s)+ú(20\d{2}-\d{2}-\d{2}))Útitler:   Údate)ÚLIST_DIRr?   r   ÚfindÚfind_allr3   Ú
startswithr   ÚBASEÚget_textÚreÚsubrJ   ÚsearchÚgroupr   )Úpgr:   ÚhtmlÚsoupÚinfoÚitemsrF   r   rG   rL   ÚdmrM   s               r   Ú
crawl_listr^   D   s$  € à	ˆQ‚wÜ˜Ñ&‰ä�
˜' "  UÐ+ˆÜ�‹:€DÙØˆ	Ü˜˜}Ó-€DØ�9‰9�U <ˆ9Ó0€DÙØˆ	Ø€EØ�m‰m˜DÓ!ò BˆØ�G‰G�C‹LˆÙØØ�u‰u�V˜RÓ ˆØ�‰˜vÔ&Üœ4 Ó&ˆDØ—
‘
 �
Ó&ˆä—‘Ð5°r¸5ÓA×GÑGÓIˆä�Y‰YÐ/°·±³Ó?ˆÙ ˆr�x‰x˜Œ{ bˆØ�‰˜u¨T¸4Ñ@ÕAðBð €Lr(   c                 ó¾	  ‡‡— t        | «      }|syt        |d«      }d}|j                  dddi¬«      }|r$|j                  d«      r|d   j	                  «       }|sA|j                  d	d
¬«      }|r,|j
                  D ]  }d|vsŒd|vsŒ|j	                  «       } n d}|j                  dddi¬«      }|r=|j                  d«      r,t        j                  d|d   «      }	|	r|	j                  d«      }d}
|j                  d	d¬«      }|�rÏg }t        «       Š|j                  dd¬«      D ]Ž  }|d   }t        j                  d|t        j                  «      sŒ.|j                  d«      st        t        |«      }|j                  d¬«      xs d}|‰vsŒj‰j!                  |«       |j#                  ||dœ«       Œ� |j                  dd¬«      D ]x  }|j                  dd«      }|sŒ|j                  d«      st        t        |«      }|j                  d¬«      xs d}|‰vsŒT‰j!                  |«       |j#                  ||dœ«       Œz g }|j                  g d¢d¬ «      D �]   }|j$                  d!k7  r|j'                  d!«      rŒ%|j$                  d	k(  r|j                  d"«      d#v rŒH|j'                  d	d$¬«      rŒ\|j'                  d%¬«      s$|j                  d&«      rd%|j                  d&«      v rŒ“|j$                  d'k(  r,d(„ Št)        ˆˆfd)„|j                  ddg«      D «       «      }|rŒÎt+        |«      j	                  «       }|sŒê|j$                  d'k(  rA|j                  d!«      r�Œ|j                  d'd*¬ «      }|rt+        |«      j	                  «       }|j$                  d	k(  r7|j'                  d	«      r&|j                  d'd!g«      s|j#                  |«       �Œ€|j$                  d+v s�Œ�|j#                  |«       �Œ£ t-        |«      }d,j/                  |«      j	                  «       }
g }|
j1                  d,«      D ]Q  }|j	                  «       }|sŒt        j2                  d-d|«      j	                  «       sŒ<||vsŒA|j#                  |«       ŒS d,j/                  |«      j	                  «       }
|r$d.j/                  d/„ |D «       «      }|
r|
d,z   |z   n|}
|||
fS )0u   è¿”å›ž (title, date, content))NNNrA   r0   ÚmetaÚnameÚArticleTitle)ÚattrsÚcontentrB   Ú
subjectCenrD   u   é¦–é¡µu   é€šçŸ¥å…¬å‘ŠÚPubDaterK   r-   Údiv_content)Úidr   T)rG   rG   z*\.(pdf|doc|docx|xls|xlsx|zip|rar|wps|txt)$rH   rI   u   é™„ä»¶)ra   r:   Úspanúedui-pdfúdata-pdf)r   rB   Útable)Ú	recursiverl   rh   )ÚxgwdPÚqrcodern   ÚfilelinkÚclassr   c                 ó  — d}| j                   dk(  r| j                  dd«      }n8| j                   dk(  r)d| j                  d«      xs g v r| j                  dd«      }|r!|j                  d«      st        t        |«      }|S )	u0   æ��å�–å…ƒç´ çš„æ–‡ä»¶URL(ç›¸å¯¹+ç»�å¯¹å½’ä¸€åŒ–)r0   r   rG   ri   rj   rq   rk   rH   )ra   r3   rQ   r   rR   )ÚelÚus     r   Ú_att_urlz extract_detail.<locals>._att_url¦   sr   € à�AØ—w‘w #’~ØŸF™F 6¨2Ó.™ØŸ™ FÒ*¨z¸b¿f¹fÀW»oÒ>SÐQSÑ/TØŸF™F :¨rÓ2˜Ù §¡¨fÔ!5Ü#¤D¨!Ó,˜Ø�Hr(   c              3   óB   •K  — | ]  } ‰|«      r ‰|«      ‰v –— Œ y ­wr   r   )r   rs   ru   Úseen_atts     €€r   r   z!extract_detail.<locals>.<genexpr>°   s*   øè ø€ ò Là¹hÀr¼lñ ˜R“L HÔ,ñLùs   ƒF)r   rl   z

ú<[^>]+>ú
c              3   ó:   K  — | ]  }d |d   › d|d   › d�–— Œ y­w)z<p><a href="r:   z">ra   z</a></p>Nr   )r   Úatts     r   r   z!extract_detail.<locals>.<genexpr>Ô   s(   è ø€ Ò!lÐY\ L°°U±°¸B¸sÀ6¹{¸mÈ8Ô"TÑ!lùs   ‚)r?   r   rO   r3   rJ   Ústripped_stringsrT   rV   rW   r   rP   ÚIrQ   r   rR   rS   r   r   ra   Úfind_parentr   r   r   ÚjoinÚsplitrU   )r:   rY   rZ   rL   ÚmtÚscÚlinerM   ÚmdÚmrd   ÚdcÚattachmentsr   rG   ra   ÚspÚpdfr   ÚnodeÚhas_attÚhtml_strÚinner_pÚ
uniq_partsÚpartÚpart_strippedÚ	att_linksru   rw   s                              @@r   Úextract_detailr’   c   s™  ù€ ä�‹:€DÙØÜ˜˜}Ó-€Dà€EØ	�‰�6 &¨.Ð!9ˆÓ	:€BÙ	ˆb�f‰f�YÔØ�9‘×#Ñ#Ó%ˆÙØ�Y‰Y�u \ˆYÓ2ˆÙà×+Ñ+ò �Ø 4Ò'¨NÀ$Ò,FØ ŸJ™J›L�EÙðð
 €DØ	�‰�6 &¨)Ð!4ˆÓ	5€BÙ	ˆb�f‰f�YÔÜ�I‰IÐ.°°9±Ó>ˆÙØ—7‘7˜1“:ˆDà€GØ	�‰�5˜]ˆÓ	+€BÚ	àˆÜ“5ˆØ—‘˜S t�Ó,ò 	DˆAØ�V‘9ˆDÜ�y‰yÐFÈÌbÏdÉdÕSØ—‘ vÔ.Ü"¤4¨Ó.�DØ—z‘z¨�zÓ-Ò9°�Ø˜xÒ'Ø—L‘L Ô&Ø×&Ñ&°¸TÑ'BÕCð	Dð —+‘+˜f¨Z�+Ó8ò 	CˆBØ—&‘&˜ RÓ(ˆCÚØ—~‘~ fÔ-Ü!¤$¨Ó,�CØ—{‘{¨�{Ó.Ò:°(�Ø˜hÒ&Ø—L‘L Ô%Ø×&Ñ&°¸SÑ'AÕBð	Cð ˆà—K‘KÒ 5À�KÓFó +	'ˆDà�y‰y˜GÒ#¨×(8Ñ(8¸Ô(AØØ�y‰y˜EÒ! d§h¡h¨t£nÐ8KÑ&KØØ×Ñ ¨'ÐÔ2Øà×Ñ zÐÔ2°t·x±xÀÔ7HÈZÐ[_×[cÑ[cÐdkÓ[lÑMlØà�y‰y˜CÒò	ô ô Là"Ÿm™m¨S°&¨MÓ:ôLó L�ñ ØÜ˜4“y—‘Ó(ˆHÙØà�y‰y˜CÒà—9‘9˜WÔ%ÙØŸ)™) C°5˜)Ó9�Ùä" 7›|×1Ñ1Ó3�HØ�y‰y˜EÒ! d×&6Ñ&6°uÔ&=ÀdÇiÁiÐQTÐV]ÐP^ÔF_Ø—‘˜XÖ&Ø—‘˜nÓ,Ø—‘˜XÖ&ðW+	'ôX & eÓ,ˆØ—+‘+˜eÓ$×*Ñ*Ó,ˆàˆ
Ø—M‘M &Ó)ò 	1ˆDØ ŸJ™J›LˆMÙ Øä—6‘6˜* b¨-Ó8×>Ñ>Ô@ØØ JÒ.Ø×!Ñ! -Õ0ð	1ð —+‘+˜jÓ)×/Ñ/Ó1ˆÙØŸ	™	Ñ!lÐ`kÔ!lÓlˆIÙ6=�g Ñ&¨Ò2À9ˆGØ�$˜ÐÐr(   c                  óò  — dd l } | j                  «       }|j                  dt        d¬«       |j	                  «       }t        dt        |j                  t        «      «      }t        j                  t        d¬«      }|j                  d«       |j                  «       }|j                  d«       |j                  d	«       dx}x}}t        «       }	t        d|dz   «      D �]Û  }
t!        d
|
› d�«       t#        |
«      }|st!        d«        �n±t!        dt%        |«      › d�«       |D �]�  }|d   |	v rŒ|	j'                  |d   «       |j                  d|d   f«       |j)                  «       r|dz  }ŒLt!        d|d   › d|d   d d › �«       t+        |d   «      \  }}}|s|d   }|s|d   }|rt%        |«      dk  r"t!        d|rt%        |«      nd› d�«       |dz  }Œ¸t-        j.                  dd|«      d d }t-        j.                  dd|«      j1                  «       }t-        j2                  d|«      rdnd}	 |j                  d||||d   |d   |t4        t6        t8        |df«      }|j:                  }|j                  d ||t4        |f«       |j=                  «        |dz  }tA        jB                  d!«       �Œ“ �ŒÞ tE        d"|› d#|› d$|› d%||z   |z   › �«       y # t        j>                  $ r |dz  }Y ŒSw xY w)&Nr   z--pagesr-   )ÚtypeÚdefaulté   )r,   zPRAGMA busy_timeout=10000a¬  CREATE TABLE IF NOT EXISTS gov_raw (id INTEGER PRIMARY KEY, site_name TEXT, source_url TEXT, page_url TEXT, title TEXT, publish_date TEXT, date_rank INTEGER DEFAULT 0, summary TEXT, status TEXT, category TEXT DEFAULT '', visits INTEGER DEFAULT 0, content TEXT DEFAULT '', tags TEXT DEFAULT '', industry TEXT DEFAULT 'other', attachments TEXT DEFAULT '', group_name TEXT, has_table INTEGER DEFAULT 0, script_name TEXT DEFAULT '')zgCREATE VIRTUAL TABLE IF NOT EXISTS gov_search USING fts5(title, site_name, summary, tokenize='trigram')u   --- ç¬¬u   é¡µ ---u   åˆ—è¡¨ä¸ºç©º, å�œæ­¢ç¿»é¡µu   æ‰¾åˆ°u   æ�¡r:   z'SELECT id FROM gov_raw WHERE page_url=?z  [rM   z] rL   é-   é2   u       æ­£æ–‡è¿‡çŸ­(u	   ), è·³è¿‡rx   r0   éÈ   z\s+ú z<tablezªINSERT INTO gov_raw (title, summary, content, page_url, source_url, publish_date, site_name, script_name, group_name, has_table, date_rank) VALUES (?,?,?,?,?,?,?,?,?,?,?)zJINSERT INTO gov_search (rowid, title, site_name, summary) VALUES (?,?,?,?)g      à?u	   
æ–°å¢ž: u
     é‡�å¤�: u
     è¿‡çŸ­: u
     æ€»è®¡: )#ÚargparseÚArgumentParserÚadd_argumentÚintÚ
parse_argsÚmaxÚminÚpagesÚ	MAX_PAGESÚsqlite3ÚconnectÚDBÚexecuteÚcursorr   r1   r'   r^   r   r   Úfetchoner’   rT   rU   rJ   rV   ÚSITEÚSCRIPTÚGROUPÚ	lastrowidÚcommitÚIntegrityErrorr8   r9   r#   )r›   ÚapÚargsr¢   ÚconnÚcÚ	total_newÚ	total_dupÚ
total_skipr   rX   r\   ÚitemrL   rM   rd   ÚsummaryÚ	has_tableÚcurÚrids                       r   Úmainr¼   Ù   sü  € ÛØ	×	 Ñ	 Ó	"€BØ‡O�O�I¤C°€OÔ3Ø�=‰=‹?€DÜ�”3�t—z‘z¤9Ó-Ó.€Eä�?‰?œ2 rÔ*€DØ‡L�LÐ,Ô-Ø�‰‹€AØ‡I�Ið  }ô  ~Ø‡I�IÐwÔxà)*Ð*€IÐ*�	˜JÜ‹5€DÜ�A�u˜q‘yÓ!ó 'ˆÜˆg�b�T˜Ð!Ô"Ü˜2“ˆÙÜÐ,Ô-ÚÜˆf”S˜“Z�L Ð$Ô%Øó  	ˆDØ�E‰{˜dÑ"ØØ�H‰H�T˜%‘[Ô!Ø�I‰IÐ?À$ÀuÁ+ÀÔPØ�z‰zŒ|Ø˜Q‘�	ØÜ�#�d˜6‘l�^ 2 d¨7¡m°C°RÐ&8Ð%9Ð:Ô;Ü#1°$°u±+Ó#>Ñ ˆE�4˜ÙØ˜W™�ÙØ˜F‘|�Ùœc '›l¨RÒ/ÜÐ'¹¬¨G¬ÀQÐ'GÀyÐQÔRØ˜a‘�
ØÜ—f‘f˜Z¨¨WÓ5°d°sÐ;ˆGÜ—f‘f˜V S¨'Ó2×8Ñ8Ó:ˆGÜŸY™Y y°'Ô:™ÀˆIð
Ø—i‘ið AØ˜G W¨d°5©k¸4À¹;ÈÌdÔTZÔ\aÐclÐnoÐpór�ð —m‘m�Ø—	‘	ÐfØ ¤t¨WÐ5ô7à—‘”Ø˜Q‘�	ô �J‰J�sŽOòA 	ð'ôP 
ˆJ�y�k ¨I¨;°jÀÀÈJÐW`ÐajÑWjÐkuÑWuÐVvÐ
wÕxøô ×)Ñ)ò Ø˜Q‘’	ðús   È8A*KËK6Ë5K6Ú__main__)é   )Ú__doc__r2   r¤   rT   r$   r8   Úbs4r   Úurllib.parser   r¦   rR   rN   rª   r¬   r«   r£   r4   r   r'   r?   r^   r’   r¼   Ú__name__r   r(   r   ú<module>rÃ      sŒ   ðñ	÷ (× 'Ó 'Ý Ý  à€Ø"€ØÐ5Ñ5€Ø%€Ø€Ø	 €Ø€	àoØ˜-Ñ'ñ€ò"ò,,ó	òò>s òl7yðt ˆzÒÙ…Fð r(   