Ë
    V_Šj>%  ã                   óp  — 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	Zd
dddœZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zdefd„Zedk(  reeZdej4                  v rKej4                  j7                  d«      Zedz    eej4                  «      k  r eej4                  edz      «      Z ee¬«       yy)uÊ  é€šåŸŽåŽ¿äººæ°‘æ”¿åºœ - ç”Ÿæ€�çŽ¯å¢ƒ

é€šåŸŽåŽ¿æ”¿åºœä¿¡æ�¯å…¬å¼€å¹³å�° > æ³•å®šä¸»åŠ¨å…¬å¼€å†…å®¹ > å…¬ç›Šäº‹ä¸šå»ºè®¾ > ç”Ÿæ€�çŽ¯å¢ƒ

List: ul.info-list > li > a href="detail_url"
Pagination: createPageHTML(25, 0, "index", "shtml", "pages clearfix", 518)
  P1: http://www.zgtc.gov.cn/xxgk/xxgkml/gysyjs/hjbh/
  P2+: http://www.zgtc.gov.cn/xxgk/xxgkml/gysyjs/hjbh/index_{N-1}.shtml
  20 items/page, max 25 pages
Detail: /xxgk/xxgkml/gysyjs/hjbh/YYYYMM/tYYYYMMDD_ID.shtml
  Title: Meta ArticleTitle (complete)
  Date: Meta PubDate (YYYY-MM-DD HH:MM)
  Content: div.mlxl-content-box-two > div.view.TRS_UEDITOR > p paragraphs + tables
  Attachments: div.mlxl-content-box-two > div#appendix or a[href$=.pdf|.doc|...]
é    N)ÚBeautifulSoup)Úurljoinz/root/search.dbu"   é€šåŸŽåŽ¿äººæ°‘æ”¿åºœ-ç”Ÿæ€�çŽ¯å¢ƒu   æ¹–åŒ—z.http://www.zgtc.gov.cn/xxgk/xxgkml/gysyjs/hjbhé   zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36zJtext/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8zzh-CN,zh;q=0.9)z
User-AgentÚAcceptzAccept-Languagez·INSERT OR IGNORE INTO gov_raw
    (site_name, source_url, page_url, title, publish_date, summary, content, category, attachments, group_name)
    VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)c                  ó|   — dd l } | j                  t        «      }|j                  d«       |j                  d«       |S )Nr   zPRAGMA journal_mode=WALzPRAGMA busy_timeout=5000)Úsqlite3ÚconnectÚDB_PATHÚexecute)r   Úconns     ú$/root/gov_crawler/crawl_zgtc_hjbh.pyÚinit_dbr   &   s2   € ÛØ�?‰?œ7Ó#€DØ‡L�LÐ*Ô+Ø‡L�LÐ+Ô,Ø€Kó    c                  ó  — t        j                  «       } | j                  j                  t        «       	 | j                  dd¬«       | j                  t        dz   d¬«       | S # t        $ r}t        d|› �«       Y d}~| S d}~ww xY w)z3Create a session with proper cookies for WAF bypasszhttp://www.zgtc.gov.cn/é   ©Útimeoutú/z[WARN] Session init: N)	ÚrequestsÚSessionÚheadersÚupdateÚHEADERSÚgetÚBASE_URLÚ	ExceptionÚprint)ÚsessionÚes     r   Úinit_sessionr    .   s}   € ä×ÑÓ €GØ‡O�O×Ñœ7Ô#ð+Ø�‰Ð-°rˆÔ:Ø�‰”H˜s‘N¨BˆÔ/ð €Nøô ò +ÜÐ% a SÐ)×*Ð*Ø€Nûð+ús   µ-A$ Á$	BÁ-BÂBc                 ó¬  — |dk(  r
t         dz   }nt         › d|dz
  › d�}	 | j                  |d¬«      }d|_        |j                  dk7  rt	        d	|› d
|j                  › �«       g S 	 t        |j                  d«      }|j                  dt        j                  dt        j                  «      ¬«      }|st	        d	|› d�«       g S g }|j                  d«      D ]µ  }|j                  d«      }	|	sŒ|	j                  dd«      }
|
sŒ,t        ||
«      }|	j                  d¬«      }|sŒM|j                  d«      }d}|r|j                  d¬«      }|s+t        j                  d|j                  «       «      }|r|d   }|j!                  |||dœ«       Œ· t	        d|› dt#        |«      › d�«       |S # t
        $ r}t	        d|› d|› �«       g cY d}~S d}~ww xY w)z$Extract article items from list pageé   r   z/index_z.shtmlr   r   úutf-8éÈ   z[WARN] Page z: HTTP z[ERROR] Page ú: Núhtml.parserÚulz	info-list©Úclass_z: no info-list foundÚliÚaÚhrefÚ T©ÚstripÚspanz20\d{2}[-/]\d{1,2}[-/]\d{1,2}r   )ÚtitleÚurlÚdatez  Page z items)r   r   ÚencodingÚstatus_coder   r   r   ÚtextÚfindÚreÚcompileÚIÚfind_allr   Úget_textÚfindallÚappendÚlen)r   Úpage_numr2   Úrr   Úsoupr'   Úitemsr*   r+   r,   Ú
detail_urlr1   Ú	date_spanÚdate_strÚdatess                   r   Úextract_list_pagerH   ;   sà  € à�1‚}Ü˜‰n‰ä�
˜' (¨Q¡, ¨vÐ6ˆðØ�K‰K˜ RˆKÓ(ˆØˆŒ
Ø�=‰=˜CÒÜ�L  
¨'°!·-±-°ÐAÔBØˆIð  ô ˜Ÿ™ Ó/€DØ	�‰�4¤§
¡
¨<¼¿¹Ó >ˆÓ	?€BÙÜ�˜X˜JÐ&:Ð;Ô<Øˆ	à€EØ�k‰k˜$Óò LˆØ�G‰G�C‹LˆÙØØ�u‰u�V˜RÓ ˆÙØä˜S $Ó'ˆ
ð —
‘
 �
Ó&ˆÙØð
 —G‘G˜F“Oˆ	ØˆÙØ ×)Ñ)°Ð)Ó5ˆHÙÜ—J‘JÐ?ÀÇÁÃÓOˆEÙØ  ™8�à�‰˜u¨ZÀÑJÕKð7Lô: 
ˆG�H�:˜R¤ E£
˜|¨6Ð
2Ô3Ø€LøôS ò Ü�˜h˜Z r¨!¨Ð-Ô.Ø�	ûðús    AF- Æ-	GÆ6GÇGÇGc                 óâ  — 	 | j                  |d¬«      }d|_        |j                  dk7  ry	 t        |j                  d	«      }d
}|j                  ddt        j                  dt        j                  «      i¬«      }|r4|j                  dd
«      j                  «       r|d   j                  «       }nN|j                  d«      }|r;|j                  d¬«      }	t        j                  dd
|	«      j                  «       }	|	r|	}d
}
|j                  ddt        j                  dt        j                  «      i¬«      }|r3|j                  dd
«      j                  «       r|d   j                  «       }
d
}g }|j                  dt        j                  dt        j                  «      ¬«      }|s5|j                  dt        j                  dt        j                  «      ¬«      }|�rx|j                  dt        j                  dt        j                  «      ¬«      }|s|}g }|j                  ddgd¬«      D ]h  }|j                  dk(  r(|j                  dd¬«      }|sŒ(|j!                  |«       Œ:|j                  dk(  sŒJt#        |«      }|sŒX|j!                  |«       Œj |s&|j                  dd¬«      }|r|j!                  |«       dj%                  |«      }|j                  d«      D ]p  }|j                  d d
«      }t        j&                  d!|t        j                  «      sŒ;|j                  d¬«      xs d"}t)        ||«      }|j!                  ||d#œ«       Œr |rt+        |j                  «       «      d$k  r*|xs |}d%|› d&|› d'�}|r|D ]  }|d(|d   › d)|d*   › d+�z  }Œ |xs ||
||rt-        j.                  |d,¬-«      d.œS d
d.œS # t        $ r}t	        d|dd › d|› �«       Y d}~yd}~ww xY w)/z%Extract full detail from article pager   r   r#   r$   Nz    [ERROR] éP   r%   r&   r-   ÚmetaÚnameÚArticleTitle)ÚattrsÚcontentr1   Tr.   u   [-_|\s]*é€šåŸŽåŽ¿æ”¿åºœç½‘\s*$ÚPubDateÚdivzmlxl-content-box-twor(   zmlxl-contentzview|TRS|TRS_UEDITOR|trs_paperÚpÚtable)Ú	recursiveú z

r+   r,   z"\.(pdf|doc|docx|xls|xlsx|rar|zip)$u   é™„ä»¶)rL   r2   é   z<p><a href="z">z</a></p>z
[z](r2   ú)F)Úensure_ascii)r1   r3   rO   Úattachments)r   r4   r5   r   r   r   r6   r7   r8   r9   r:   r/   r<   Úsubr;   rL   r>   Útable_to_markdownÚjoinÚsearchr   r?   ÚjsonÚdumps)r   r2   Ú
list_titlerA   r   rB   r1   Ú
meta_titleÚt_tagÚtrF   Ú	meta_daterO   rY   Úbox2ÚeditorÚcontent_partsÚchildÚtxtÚmdÚa_tagr,   Úatt_nameÚatt_urlÚtitle_from_contentÚatts                             r   Úextract_detailrp   t   sÀ  € ðØ�K‰K˜ RˆKÓ(ˆØˆŒ
Ø�=‰=˜CÒØð  ô ˜Ÿ™ Ó/€Dð €EØ—‘˜6¨&´"·*±*¸_ÌbÏdÉdÓ2SÐ)T�ÓU€JÙ�j—n‘n Y°Ó3×9Ñ9Ô;Ø˜9Ñ%×+Ñ+Ó-‰ð —	‘	˜'Ó"ˆÙØ—‘ T�Ó*ˆAÜ—‘Ð8¸"¸aÓ@×FÑFÓHˆAÙØ�ð €HØ—	‘	˜&¨´·±¸JÌÏÉÓ1MÐ(N�	ÓO€IÙ�Y—]‘] 9¨bÓ1×7Ñ7Ô9Ø˜YÑ'×-Ñ-Ó/ˆð €GØ€Kà�9‰9�U¤2§:¡:Ð.EÄrÇtÁtÓ#Lˆ9ÓM€DÙà�y‰y˜¤r§z¡z°/Ä2Ç4Á4Ó'HˆyÓIˆâà—‘˜5¬¯©Ð4UÔWY×W[ÑW[Ó)\�Ó]ˆÙØˆFð ˆØ—_‘_ c¨7 ^¸t�_ÓDò 	-ˆEØ�z‰z˜SÒ Ø—n‘n S°�nÓ5�ÚØ!×(Ñ(¨Õ-Ø—‘˜wÓ&Ü& uÓ-�ÚØ!×(Ñ(¨Õ,ð	-ñ Ø—/‘/ #¨T�/Ó2ˆCÙØ×$Ñ$ SÔ)à—+‘+˜mÓ,ˆð —]‘] 3Ó'ò 	GˆEØ—9‘9˜V RÓ(ˆDÜ�y‰yÐ>ÀÄbÇdÁdÕKØ Ÿ>™>°˜>Ó5ÒA¸�Ü! # tÓ,�Ø×"Ñ"¨H¸WÑ#EÕFð	Gñ ”c˜'Ÿ-™-›/Ó*¨RÒ/Ø"Ò0 jÐØ    RÐ(:Ð';¸8ÐDˆÙØ"ò >�Ø˜S  V¡ ¨R°°E±
¨|¸1Ð=Ñ=‘ð>ð Ò$˜*ØØÙFQ”t—z‘z +¸EÔBñ	ð ð XZñ	ð øô[ ò Ü�˜S  "˜X˜J b¨¨Ð,Ô-Üûðús   ‚)O Ï	O.ÏO)Ï)O.c                 ó   — t        | «      S )u'   ä¿�ç•™ HTML è¡¨æ ¼ç»“æž„ï¼ˆä¸�è½¬ mdï¼‰)Ústr)rS   ÚargsÚkwargss      r   r[   r[   Ð   s   € äˆu‹:Ðr   c                 óÊ  — 	 |j                  d«      xs dd d }|j                  t        t        |j                  dd«      |j                  d«      |j                  d«      |j                  dd«      ||j                  dd«      t        |j                  dd«      df
«       | j                  «        y	# t        $ r(}t        d
|› �«       | j                  «        Y d }~yd }~ww xY w)NrO   r-   r$   Ú
source_urlÚpage_urlr1   Úpublish_daterY   Tz    [DB ERROR] F)	r   r   Ú
INSERT_SQLÚ	SITE_NAMEÚCATEGORYÚcommitr   r   Úrollback)r   ÚcurÚrecÚsummaryr   s        r   Úinsert_to_dbr�   Ô   sÉ   € ðØ—7‘7˜9Ó%Ò+¨¨T¨cÐ2ˆØ�‰”JÜØ�G‰G�L "Ó%Ø�G‰G�JÓØ�G‰G�GÓØ�G‰G�N BÓ'ØØ�G‰G�I˜rÓ"ÜØ�G‰G�M 2Ó&Øð!
ô 	ð 	�‰ŒØøÜò Ü� ˜sÐ#Ô$Ø�‰ŒÜûðús   ‚B.B1 Â1	C"Â:CÃC"Fc           	      óò  — t        «       }t        «       }|j                  «       }d}d}d}t        d|dz   «      D �]  }t	        ||«      }	|	st        d|› d�«        nå|t        |	«      z  }|	D ]º  }
|j                  d|
d   f«       |j                  «       rt        d|
d   d d	 › d
�«       Œ?t        ||
d   |
d   «      }|s|dz  }t        d|
d   d d › �«       Œn|
d   t        dz   |d   |d   |d   |d   dœ}t        |||«      sŒ›|dz  }t        d|d   d d › d|d   › d�«       Œ¼ t        j                  d«       �Œ |j                  «        t        d|› d|› �«       |rt        d|› d|› d�«       |S )Nr   r"   z  [STOP] Page z is empty, stoppingz)SELECT id FROM gov_raw WHERE page_url = ?r2   z    [SKIP] already exists: r1   é2   z...z     [ERROR] detail unreachable: é<   r   r3   rO   rY   )rw   rv   r1   rx   rO   rY   z    + z (rW   z
[DONE] Total: z articles, Errors: u     (åˆ—è¡¨é¡µå…± u    æ�¡, å…¶ä¸­ u    æ�¡è¯¦æƒ…ä¸�å�¯è¾¾))r    r   ÚcursorÚrangerH   r   r?   r   Úfetchonerp   r   r�   ÚtimeÚsleepÚclose)Ú	test_modeÚ	max_pagesr   r   r~   ÚtotalÚerrorsÚtotal_listedÚpnrC   ÚitemÚdetailr   s                r   Úcrawlr“   ë   sÏ  € Ü‹n€GÜ‹9€DØ
�+‰+‹-€Cà€EØ€FØ€Lä�A�y 1‘}Ó%ó $ˆÜ! '¨2Ó.ˆÙÜ�N 2 $Ð&9Ð:Ô;Ùàœ˜E›
Ñ"ˆàò 	JˆDà�K‰KÐCÀdÈ5ÁkÀ^ÔTØ�|‰|Œ~ÜÐ3°D¸±MÀ#À2Ð4FÐ3GÀsÐKÔLØô $ G¨T°%©[¸$¸w¹-ÓHˆFÙØ˜!‘�ÜÐ8¸¸e¹ÀSÀbÐ9IÐ8JÐKÔLØð ! ™KÜ&¨™nØ ™Ø & v¡Ø! )Ñ,Ø% mÑ4ñˆCô ˜D # sÕ+Ø˜‘
�Ü˜˜v g™¨s°Ð3Ð4°B°v¸f±~Ð6FÀaÐHÕIð3	Jô8 	�
‰
�1ŽðI$ðL 	‡J�J„LÜ	Ð˜U˜GÐ#6°v°hÐ
?Ô@ÙÜÐ   ¨m¸F¸8ÐCWÐXÔYØ€Lr   Ú__main__z--max-pagesr"   )rŒ   )Ú__doc__r^   r8   Úsysrˆ   r   Úbs4r   Úurllib.parser   r
   rz   r{   r   Ú	MAX_PAGESr   ry   r   r    rH   rp   r[   r�   r“   Ú__name__ÚmpÚargvÚindexÚidxr?   Úint© r   r   ú<module>r¡      sá   ðñ÷ %× $Ó $Ý Ý  à
€Ø0€	Ø€Ø;€Ø€	ð DØZØ'ñ€ð-€
ò
ò
ò6òrYòxòð.  Yó 3ðl ˆzÒØ	€BØ˜Ÿ™Ñ Ø�h‰h�n‰n˜]Ó+ˆØ�‰7‘S˜Ÿ™“]Ò"Ù�S—X‘X˜c A™gÑ&Ó'ˆBÙ	�BÖð r   