Ë
    V_ŠjP#  ã                   ót  — 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
dZdZd	d
ddœZd„ Zdd„Zd„ Zd„ Zd„ Zd d„Zedk(  roddlZ ej,                  d¬«      Zej1                  dedd¬«       ej1                  ddd¬«       ej5                  «       Z eej8                  ej:                  ¬«       yy)!u�   é•‡æ±Ÿç»�æµŽæŠ€æœ¯å¼€å�‘åŒº - é€šå‘Šå…¬ç¤ºçˆ¬è™«
ç«™ç‚¹: www.zjna.gov.cn
æ �ç›®: /zjna/tztg/xxgk_list.shtml (é€šçŸ¥é€šå‘Š+ä¾¿æ°‘/åŠžäº‹å…¬ç¤º)
é    N)Údatetime)ÚBeautifulSoupzhttp://www.zjna.gov.cnz/zjna/tztg/z/root/search.dbzwww.zjna.gov.cn-tztgzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36z`text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8zzh-CN,zh;q=0.9,en;q=0.8)z
User-AgentÚAcceptzAccept-Languagec                  óZ   — t        j                  t        «      } | j                  d«       | S )NzPRAGMA journal_mode=WAL)Úsqlite3ÚconnectÚDB_PATHÚexecute)Úconns    ú$/root/gov_crawler/crawl_zjna_tztg.pyÚinit_dbr      s"   € Ü�?‰?œ7Ó#€DØ‡L�LÐ*Ô+Ø€Kó    c                 óì   — 	 t        j                  | t        |d¬«      }d|_        |j                  dk(  r|j
                  S y # t        $ r(}t        d|› �t        j                  ¬«       Y d }~y d }~ww xY w)NF)ÚheadersÚtimeoutÚverifyzutf-8éÈ   z  [ERROR] fetch failed: )Úfile)
ÚrequestsÚgetÚHEADERSÚencodingÚstatus_codeÚtextÚ	ExceptionÚprintÚsysÚstderr)Úurlr   ÚrespÚes       r   Ú
fetch_pager"      sf   € ðÜ�|‰|˜C¬¸'È%ÔPˆØˆŒØ×Ñ˜sÒ"Ø—9‘9ÐØøÜò ÜÐ(¨¨Ð,´3·:±:Õ>Üûðús   ‚>A Á	A3ÁA.Á.A3c                 ó  — g }t        | d«      }|j                  dd¬«      D �]Z  }|j                  dd¬«      D �]@  }|j                  d«      }|r|j                  d	«      sŒ)|d	   j	                  «       }|j                  d
«      sŒN|j                  d«      r
t        |z   }n|j                  d«      rnt        dz   |z   }|j                  d«      xs |j                  d¬«      xs dj	                  «       }t        j                  dd|«      }|sŒØ|j                  dd¬«      }|r|j                  d¬«      nd}	t        j                  d|	«      }
|
r|
j                  d«      nd}	|j                  |||	dœ«       �ŒC �Œ] |S )u2   è§£æž�åˆ—è¡¨é¡µï¼Œè¿”å›ž (url, title, date) åˆ—è¡¨úhtml.parserÚulÚpageList©Úclass_ÚliF)Ú	recursiveÚaÚhrefú.shtmlú/ÚhttpÚtitleT©ÚstripÚ z\s+ú ÚspanÚtimeú(\d{4}-\d{2}-\d{2})é   )r   r0   Úpub_date)r   Úfind_allÚfindr   r2   ÚendswithÚ
startswithÚBASE_URLÚget_textÚreÚsubÚsearchÚgroupÚappend)ÚhtmlÚitemsÚsoupr%   r)   r+   r,   r0   Ú	date_spanr9   Ú
date_matchs              r   Ú
parse_listrJ   *   sh  € à€EÜ˜˜}Ó-€Dà�m‰m˜D¨ˆmÓ4ó NˆØ—+‘+˜d¨e�+Ó4ó 	NˆBØ—‘˜“ˆAÙ˜AŸE™E &œMØØ�V‘9—?‘?Ó$ˆDØ—=‘= Ô*Øà�‰˜sÔ#Ü $‘‘Ø—‘ Ô(Øä #‘~¨Ñ,�à—U‘U˜7“^ÒC q§z¡z¸ zÓ'=ÒCÀ×JÑJÓLˆEÜ—F‘F˜6 3¨Ó.ˆEÙØàŸ™ ¨v˜Ó6ˆIÙ9B�y×)Ñ)°Ð)Ô5ÈˆHÜŸ™Ð#9¸8ÓDˆJÙ.8�z×'Ñ'¨Ô*¸bˆHØ�L‰L °À8ÑLÖMò1	NðNð4 €Lr   c                 óÂ  ‡— t        | d«      }|j                  dd¬«      }|r|j                  d¬«      nd}|sL|j                  d«      }|r9|j                  d¬«      }t        j                  d	d|«      }|j                  «       }d}|j                  dd
¬«      }|r7t        j                  d|j                  «       «      }	|	r|	j                  d«      }|j                  dd¬«      }
|
s|j                  dd¬«      }
g }|j                  dd¬«      }|r |j                  d«      D ]Œ  }|j                  dd«      Š‰j                  d«      s t        j                  j                  |‰«      Š|j                  d¬«      xs t        j                  j!                  ‰«      }|j#                  ‰|dœ«       ŒŽ d}d}|
�rä|
j                  d«      D ]¶  }|j                  dd«      Št%        ˆfd„dD «       «      sŒ*‰j                  d«      s t        j                  j                  |‰«      Š|j                  d¬«      xs t        j                  j!                  ‰«      }t%        ˆfd„|D «       «      rŒ£|j#                  ‰|dœ«       Œ¸ |
j                  ddg«      D ]  }|j'                  «        Œ t)        «       }|
j                  d«      D ]e  }|j                  d«      }|rt%        d„ |D «       «      nd}|sŒ-|j                  d¬«      }||v rŒD|j+                  |«       |t-        |«      dz   z  }Œg t        t-        |
«      d«      }|j                  d«      D ]  }|j'                  «        Œ |j                  dd¬«      }t        j                  dd|«      }|r|d |z   z  }t/        |j                  «       «      d!k  r"d"|› d#|› d$�}|D ]  }|d%|d   › d&|d'   › d(�z  }Œ ||||fS ))u   è§£æž�è¯¦æƒ…é¡µr$   ÚdivÚbiaotir'   Tr1   r3   r0   u4   \s*[|]\s*é•‡æ±Ÿç»�æµŽæŠ€æœ¯å¼€å�‘åŒºç®¡ç�†å§”å‘˜ä¼š$zarticle-attrr7   r8   zarticle-contentzarticle-content-bodyzarticle-appendixsr+   r,   r/   )r   r0   c              3   ó@   •K  — | ]  }‰j                  |«      –— Œ y ­w)N)r<   )Ú.0Úextr,   s     €r   ú	<genexpr>zparse_detail.<locals>.<genexpr>w   s   øè ø€ Ò}¨#�4—=‘= ×%Ñ}ùs   ƒ)	z.docz.docxz.pdfz.xlsz.xlsxz.zipz.rarz.pptz.pptxc              3   ó.   •K  — | ]  }|d    ‰k(  –— Œ y­w)r   N© )rO   r+   r,   s     €r   rQ   zparse_detail.<locals>.<genexpr>{   s   øè ø€ ÒA°˜1˜U™8 tÕ+ÑAùs   ƒÚscriptÚstyleÚtableÚtrc              3   óV   K  — | ]!  }t        |j                  d «      «      dk\  –— Œ# y­w)Útdé   N)Úlenr:   )rO   Úrows     r   rQ   zparse_detail.<locals>.<genexpr>…   s#   è ø€ ÒH¸Cœ3˜sŸ|™|¨DÓ1Ó2°aÕ7ÑHùs   ‚')Fz

)Ú	separatorr2   z\n{4,}u   

[è¡¨æ ¼]
é   z<p><a href="z">z	</a></p>
u
   
é™„ä»¶: [z](r   ú))r   r;   r?   r@   rA   r2   rB   rC   r:   r   r=   r   ÚcompatÚurljoinÚosÚpathÚbasenamerD   ÚanyÚ	decomposeÚsetÚaddÚstrr[   )rE   r   rG   Útitle_elr0   Ú	title_tagÚtr9   Úattr_divrI   Úcontent_divÚattachmentsÚappendix_divÚa_tagÚ	att_titleÚcontentÚtables_htmlÚtagÚ
seen_textsrV   ÚrowsÚhas_dataÚtxtÚcontent_div_cleanÚattr,   s                            @r   Úparse_detailr|   K   sÕ  ø€ ä˜˜}Ó-€Dð �y‰y˜ xˆyÓ0€HÙ-5ˆH×Ñ DÐÔ)¸2€EÙØ—I‘I˜gÓ&ˆ	ÙØ×"Ñ"¨Ð"Ó.ˆAÜ—‘ÐNÐPRÐTUÓVˆAØ—G‘G“IˆEð €HØ�y‰y˜ ~ˆyÓ6€HÙÜ—Y‘YÐ5°x×7HÑ7HÓ7JÓKˆ
ÙØ!×'Ñ'¨Ó*ˆHð —)‘)˜EÐ*;�)Ó<€KÙØ—i‘i Ð.D�iÓEˆð €KØ—9‘9˜UÐ+>�9Ó?€LÙØ!×*Ñ*¨3Ó/ò 	BˆEØ—9‘9˜V RÓ(ˆDØ—?‘? 6Ô*Ü—‘×.Ñ.¨s°DÓ9�ØŸ™¨T˜Ó2ÒL´b·g±g×6FÑ6FÀtÓ6LˆIØ×Ñ t°iÑ@ÕAð	Bð €GØ€KÚà ×)Ñ)¨#Ó.ò 	JˆEØ—9‘9˜V RÓ(ˆDÜÓ}Ð1|Ô}Õ}Ø—‘ vÔ.Ü#Ÿ?™?×2Ñ2°3¸Ó=�DØ!ŸN™N°˜NÓ6ÒP¼"¿'¹'×:JÑ:JÈ4Ó:P�	ÜÓA°[ÔAÕAØ×&Ñ&¨t¸iÑ'HÕIð	Jð ×'Ñ'¨°7Ð(;Ó<ò 	ˆCØ�M‰M�Oð	ô “Uˆ
Ø ×)Ñ)¨'Ó2ò 		/ˆEØ—>‘> $Ó'ˆDÙLP”sÑHÀ4ÔHÔHÐV[ˆHÙØØ—.‘. t�.Ó,ˆCØ�jÑ ØØ�N‰N˜3ÔØœ3˜u›:¨Ñ.Ñ.‰Kð		/ô *¬#¨kÓ*:¸MÓJÐØ$×-Ñ-¨gÓ6ò 	ˆCØ�M‰M�Oð	ð $×,Ñ,°vÀTÐ,ÓJˆÜ—&‘&˜ F¨GÓ4ˆÙØÐ'¨+Ñ5Ñ5ˆGä
ˆ7�=‰=‹?Ó˜bÒ Ø    R¨ w¨jÐ9ˆØò 	CˆCØ˜ S¨¡\ N°"°S¸±Z°LÀÐBÑB‰Gð	Cð �'˜8 [Ð0Ð0r   c                 ó
  — dd l }|r|j                  |d¬«      nd}t        j                  «       j	                  d«      }	t        t        |«      «      dz  dz   }
| j                  d|||||||||
f	«       | j                  «        y )	Nr   F)Úensure_asciiz[]z%Y-%m-%d %H:%M:%Sé
   r8   uû   
        INSERT OR REPLACE INTO gov_raw 
        (page_url, site_name, source_url, title, publish_date, summary, content, attachments, date_rank, status, category, visits)
        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 'published', 'é€šå‘Šå…¬ç¤º', 0)
    )	ÚjsonÚdumpsr   ÚnowÚstrftimeÚabsÚhashr
   Úcommit)r   Úpage_urlr0   Úsummary_textÚpublish_datero   Ú	site_namer€   Úattachments_jsonr‚   Úlevels              r   Úsave_articler�   Ÿ   sƒ   € ÛÙFQ�t—z‘z +¸E�zÔBÐW[ÐÜ
�,‰,‹.×
!Ñ
!Ð"5Ó
6€CÜ”�X“Ó "Ñ$ qÑ(€EØ‡L�Lð ð �I˜x¨°¸lÈLÐZjÐlqÐ	rô	tð
 	‡K�K…Mr   é   c                 óÚ  — t        «       }d}d}t        «       }t        | «      D �]ž  }|dk(  rt        t        z   dz   }nt        t        z   d|dz   › d�z   }t        d|dz   › d|› �«       t        |«      }|st        d|dz   › d	�«        �n;t        |«      }	|	D �
cg c]  }
|
d
   |vsŒ|
‘Œ }}
|	D ]  }
|j                  |
d
   «       Œ t        dt        |	«      › dt        |«      › d�«       |s|dkD  rt        d«        nÆ|D ]¾  }|d
   }|d   }|d   }|r$|j                  d|f«      j                  «       }|rŒ8t        d|d d › d�«       t        |«      }|s|dz  }t        d|› �«       Œkt        ||«      \  }}}}|s|r|}|r0t        ||||||t        «       |dz  }t        d|› d|d d › d�«       Œ´t        d«       ŒÀ �Œ¡ |j                  «        t        d|› d|› �«       y c c}
w )Nr   zxxgk_list.shtmlÚ
xxgk_list_r8   r-   z[PAGE z] z  [WARN] Page z unreachable, stoppingr   z  Found z articles (z new)z  No new items, stoppingr0   r9   z/SELECT page_url FROM gov_raw WHERE page_url = ?z
  [FETCH] é2   z...z#  [ERROR] detail page unreachable: u       âœ“ saved [u       âœ— empty title, skippedz
[DONE] Total: z articles, Errors: )r   rg   Úranger>   Ú	LIST_PATHr   r"   rJ   rh   r[   r
   Úfetchoner|   r�   Ú	SITE_NAMEÚclose)Ú	max_pagesÚincrementalr   ÚtotalÚerrorsÚ	seen_urlsÚpageÚlist_urlrE   rF   ÚitÚunique_itemsÚitemr   r0   Ú	list_dateÚexistingÚdetail_htmlÚdetail_titlers   r9   ro   s                         r   Úcrawlr¥   ¬   sE  € Ü‹9€DØ€EØ€FÜ“€Iä�iÓ ó 47ˆØ�1Š9Ü¤)Ñ+Ð.?Ñ?‰Hä¤)Ñ+°
¸4À¹6¸(À&Ð.IÑIˆHä��t˜A‘v�h˜b  
Ð+Ô,Ü˜(Ó#ˆÙÜ�N 4¨¡6 (Ð*@ÐAÔBÚä˜4Ó ˆà%*ÖI˜r¨b°©i¸yÒ.HšÐIˆÐIØò 	%ˆBØ�M‰M˜"˜U™)Õ$ð	%ä�œ˜U›˜ K´°LÓ0AÐ/BÀ%ÐHÔIáØ�aŠxÜÐ0Ô2Ùà ò 	7ˆDØ�u‘+ˆCØ˜‘MˆEØ˜ZÑ(ˆIáØŸ<™<ØEÈÀvóç‘(“*ð ñ Øä�J˜u S b˜z˜l¨#Ð.Ô/Ü$ S›/ˆKÙØ˜!‘�ÜÐ;¸C¸5ÐAÔBØä;GÈÐUXÓ;YÑ8ˆL˜' 8¨[Ù¡	Ø$�áÜ˜T 3¨°g¸xÈÔV_Ô`Ø˜‘
�Ü˜¨ z°°LÀÀ"Ð4EÐ3FÀcÐJÕKäÐ4Õ6ò9	7ð147ðl 	‡J�J„LÜ	Ð˜U˜GÐ#6°v°hÐ
?Õ@ùòS Js   ÂG(Â'G(Ú__main__u!   é•‡æ±Ÿç»�å¼€åŒºé€šå‘Šå…¬ç¤ºçˆ¬è™«)Údescriptionz--max-pagesu   æœ€å¤§çˆ¬å�–é¡µæ•°)ÚtypeÚdefaultÚhelpz--incrementalÚ
store_trueu   å¢žé‡�æ¨¡å¼�)Úactionrª   )r—   r˜   )é   )rŽ   F)Ú__doc__r   r   r@   r   rb   r   Úbs4r   r>   r“   r	   r•   r   r   r"   rJ   r|   r�   r¥   Ú__name__ÚargparseÚArgumentParserÚparserÚadd_argumentÚintÚ
parse_argsÚargsr—   r˜   rS   r   r   ú<module>r¸      sß   ðñó
 Û Û 	Û 
Û 	Ý Ý à#€Ø€	Ø
€Ø"€	ð DØpØ0ñ€òó
	òòBQ1òh
ó=Að@ ˆzÒÛØ$ˆX×$Ñ$Ð1TÔU€FØ
×Ñ˜¨C¸ÐAUÐÔVØ
×Ñ˜°À>ÐÔRØ×ÑÓ€DÙ	�D—N‘N°×0@Ñ0@ÖAð r   