Ë
    ì¾j�$  ã                   ó:  — d 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dl
Z ej                  «       Zej                  dedd¬«       ej!                  «       \  ZZej&                  dkD  rej&                  ne	Zd	Zd
ZdZdZdZdddœZdZd„ Zd„ Zd„ Zd„ Zd„ Z d„ Z!d„ Z"defd„Z#e$dk(  rpdejJ                  v rdndZ&e&dk(  rdneZ' e(ejJ                  «      d kD  r2ejJ                  d    jS                  «       r eejJ                  d    «      Z' e#e&dk(  e'¬!«       yy)"u$   å²¢å²šåŽ¿äººæ°‘æ”¿åºœ - é€šçŸ¥å…¬å‘Šé    N)ÚBeautifulSoup)Úurljoiné–   z--pagesu   é™�åˆ¶é¡µæ•°)ÚtypeÚdefaultÚhelpz/root/search.dbu   å²¢å²šåŽ¿-é€šçŸ¥å…¬å‘Šu   é€šçŸ¥å…¬å‘Šu	   å²¢å²šåŽ¿z http://www.xzkl.gov.cn/zwyw/tzggzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36zzh-CN,zh;q=0.9)z
User-Agentz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_xzkl_tzgg.pyÚinit_dbr      s2   € ÛØ�?‰?œ7Ó#€DØ‡L�LÐ*Ô+Ø‡L�LÐ+Ô,Ø€Kó    c                 óJ  — | j                   }|d d j                  «       }d|v sd|v sd|v r|j                  dd¬«      S | j                  j	                  dd	«      }d
|j                  «       v sd|j                  «       v r|j                  dd¬«      S |j                  dd¬«      S )NiÐ  s   gb2312s   gbks
   charset=gbÚgbkÚreplace)ÚerrorszContent-TypeÚ Úgb2312zutf-8)ÚcontentÚlowerÚdecodeÚheadersÚget)ÚrÚrawÚ	raw_lowerÚcts       r   Údecode_respr!   '   s�   € Ø
�)‰)€CØ�E�T�
× Ñ Ó"€IØ�IÑ ¨9Ñ!4¸ÈÑ8RØ�z‰z˜%¨	ˆzÓ2Ð2Ø	
�‰�‰�~ rÓ	*€BØ�2—8‘8“:Ñ ¨"¯(©(«*Ñ!4Ø�z‰z˜%¨	ˆzÓ2Ð2Ø�:‰:�g iˆ:Ó0Ð0r   c                 ó   — t        | «      S )u'   ä¿�ç•™ HTML è¡¨æ ¼ç»“æž„ï¼ˆä¸�è½¬ mdï¼‰)Ústr)ÚtableÚargsÚkwargss      r   Útable_to_mdr'   2   s   € äˆu‹:Ðr   c                 óÂ  — g }t        «       }| j                  g d¢d¬«      D �]*  }t        |«      |v rŒ|j                  t        |«      «       |j                  dk(  r t        |«      }|sŒI|j                  |«       Œ[|j                  dk(  rJ|j                  dd«      }|sŒ|j                  d«      st        ||«      n|}|j                  d	|› d
�«       Œ´|j                  dk(  r@|j                  dd¬«      }|sŒÙt        j                  dd|«      }|j                  |«       �Œ|j                  dd¬«      }|s�Œ|j                  |«       �Œ- dj                  |«      S )z7Extract content from TRS_Editor or generic content div.)Úpr$   ÚimgÚh1Úh2Úh3Úh4T©Ú	recursiver$   r*   Úsrcr   Úhttpz![](ú)r)   ú ©Ústripz[^\S\n]+z

)ÚsetÚfind_allÚidÚaddÚnamer'   Úappendr   Ú
startswithr   Úget_textÚreÚsubÚjoin)	Úcontent_divÚ
detail_urlÚpartsÚ	processedÚelÚmdr1   Úfull_srcÚtxts	            r   Úextract_contentrJ   6   s0  € à€EÜ“€IØ×"Ñ"Ò#PÐ\`Ð"Óaó "ˆÜˆb‹6�YÑØØ�‰”b˜“fÔØ�7‰7�gÒÜ˜R“ˆBÚØ—‘˜RÕ Ø�W‰W˜ÒØ—&‘&˜ Ó#ˆCÚØ;>¿>¹>È&Ô;Qœ7 :¨sÔ3ÐWZ�Ø—‘˜t H :¨QÐ/Õ0Ø�W‰W˜Š^Ø—+‘+˜c¨�+Ó.ˆCÚÜ—f‘f˜[¨#¨sÓ3�Ø—‘˜SÖ!à—+‘+˜c¨�+Ó.ˆCÛØ—‘˜SÖ!ð+"ð, �;‰;�uÓÐr   c                 óf  ‡— g }| j                  dd¬«      D �]  }|d   j                  «       j                  «       }|j                  d«      sg|j                  d«      sV|j                  d«      sE|j                  d«      s4|j                  d	«      s#|j                  d
«      s|j                  d«      sŒ�|j	                  d¬«      xs |j                  d«      d   }|d   j                  d«      st        ||d   «      n|d   Št        ˆfd„|D «       «      r�Œ|j                  |‰dœ«       �Œ |S )NÚaT)ÚhrefrM   z.pdfz.docz.docxz.xlsz.xlsxz.rarz.zipr5   ú/éÿÿÿÿr2   c              3   ó.   •K  — | ]  }|d    ‰k(  –— Œ y­w)ÚurlN© )Ú.0rL   Úfull_urls     €r   ú	<genexpr>z&extract_attachments.<locals>.<genexpr>[   s   øè ø€ ÒA°�q˜‘x 8Õ+ÑAùs   ƒ)r;   rQ   )
r8   r6   r   Úendswithr>   Úsplitr=   r   Úanyr<   )ÚsouprC   ÚattachmentsÚa_tagrM   r;   rT   s         @r   Úextract_attachmentsr\   S   sE  ø€ Ø€KØ—‘˜s¨�Ó.ó DˆØ�V‰}×"Ñ"Ó$×*Ñ*Ó,ˆØ�=‰=˜Ô  D§M¡M°&Ô$9¸T¿]¹]È7Ô=SÐW[×WdÑWdÐekÔWlÐpt×p}Ñp}ð  Fô  qGð  KO÷  KXñ  KXð  Y_ô  K`ð  dh÷  dqñ  dqð  rxõ  dyØ—>‘>¨�>Ó-ÒD°·±¸C³ÀÑ1DˆDØAFÀvÁ×AYÑAYÐZ`ÔAa”w˜z¨5°©=Ô9ÐglÐmsÑgtˆHäÓA°[ÔAÖAØ×"Ñ"¨D¸Ñ#BÖCðDð Ðr   c                 óœ  — | dk(  r
t         › d�}nt         › d| dz
  › d�}	 t        j                  |t        d¬«      }|j	                  «        t        |«      }t        |d«      }g }|j                  dd¬«      }|s!t        d| › d�t        j                  ¬	«       g S |j                  d«      }|sg S |j                  dd¬«      D ]²  }	|	j                  d«      }
|
r|
j                  d«      sŒ(|
d   j                  «       }|
j                  dd«      xs |
j                  d¬«      }|sŒd|	j                  d«      }|r|j                  d¬«      nd}t        t         dz   |«      }|j!                  |||dœ«       Œ´ t        d| › dt#        |«      › d�«       |S # t
        $ r-}t        d| › d|› �t        j                  ¬	«       g cY d
}~S d
}~ww xY w) z9page_num: 1-based. index.html = 1, index_1.html = 2, etc.é   z/index.htmlz/index_z.htmlé   ©r   Útimeoutz  [ERR] page z: ©ÚfileNúhtml.parserÚdivzaon-con©Úclass_z  [WARN] page z: no aon-con foundÚulÚliFr/   rL   rM   Útitler   Tr5   ÚspanrN   )rj   rQ   Údatez  Page z items)ÚBASE_URLÚrequestsr   ÚHEADERSÚraise_for_statusÚ	ExceptionÚprintÚsysÚstderrr!   r   Úfindr8   r6   r>   r   r<   Úlen)Úpage_numrQ   r   ÚeÚhtmlrY   ÚitemsÚaonrh   ri   r[   rM   rj   Ú	date_spanÚdate_strrC   s                   r   Úextract_list_pager~   `   sÁ  € à�1‚}Ü�
˜+Ð&‰ä�
˜' (¨1¡* ¨UÐ3ˆðÜ�L‰L˜¤g°rÔ:ˆØ	×ÑÔô
 �q‹>€DÜ˜˜}Ó-€DØ€Eà
�)‰)�E )ˆ)Ó
,€CÙÜ�˜x˜jÐ(:Ð;Ä#Ç*Á*ÕMØˆ	à	�‰�$‹€BÙØˆ	à�k‰k˜$¨%ˆkÓ0ò LˆØ—‘˜“ˆÙ˜EŸI™I fÔ-ØØ�V‰}×"Ñ"Ó$ˆØ—	‘	˜' 2Ó&ÒD¨%¯.©.¸t¨.Ó*DˆÙØà—G‘G˜F“Oˆ	Ù5>�9×%Ñ%¨DÐ%Ô1ÀBˆäœX¨™^¨TÓ2ˆ
Ø�‰˜u¨ZÀÑJÕKðLô 
ˆG�H�:˜R¤ E£
˜|¨6Ð
2Ô3Ø€LøôC ò Ü�˜h˜Z r¨!¨Ð-´C·J±JÕ?Ø�	ûðús    ,F Æ	GÆ"GÇ GÇGc                 óŠ  ‡— 	 t        j                  | t        d¬«      }|j                  «        t        |«      }t        |d«      }|j                  d«      }|r|j                  d¬«      nd}|sS|j                  d«      }|r@|j                  d¬«      }t        j                  d	d|«      }t        j                  d
d|«      }d}|j                  dd¬«      }t        j                  d|«      }	|	r|	j                  d«      }|s)t        j                  d|«      }	|	r|	j                  d«      }|s)t        j                  d|«      }	|	r|	j                  d«      }d}
|j                  dd¬«      xs= |j                  dd¬«      xs( |j                  dd¬«      xs |j                  dd¬«      }|rt        || «      }
n�|j                  d«      }|rz|j                  g d¢«      D ]  }|j                  «        Œ dD ](  Š|j                  dˆfd„¬«      }|sŒt        || «      }
 n |
s#|j                  dd¬«      }t!        |«      dkD  r|}
t#        || «      }t!        |
j%                  «       «      dk  r<d|xs | j'                  d«      d   › d| › d �}|r|D ]  }|d!|d"   › d|d#   › d �z  }Œ |}
|||
|fS # t        $ r	 d d d g fcY S w xY w)$Nr_   r`   rd   r+   Tr5   r   rj   u   [-_|]\s*é€šçŸ¥å…¬å‘Š.*$u    [-_|]\s*å²¢å²šåŽ¿äººæ°‘æ”¿åºœ.*$r4   u(   å�‘å¸ƒæ—¶é—´[ï¼š:]\s*(\d{4}-\d{2}-\d{2})r^   u%   æ—¥\s*æœŸ[ï¼š:]\s*(\d{4}-\d{2}-\d{2})z(\d{4}-\d{2}-\d{2})\sre   Ú
TRS_Editorrf   r   znews-contentzarticle-contentÚbody)ÚscriptÚstyleÚnavÚheaderÚfooter)r€   r   ÚzoomÚarticleÚnewsc                 ó   •— | xr ‰| v S )NrR   )ÚcÚclss    €r   ú<lambda>z extract_detail.<locals>.<lambda>Ã   s   ø€ ¸º¸cÀQ¸h€ r   é2   é   ú[rN   rO   z](r3   u   

é™„ä»¶ï¼š[r;   rQ   )rn   r   ro   rp   rq   r!   r   ru   r>   r?   r@   ÚsearchÚgrouprJ   r8   Ú	decomposerv   r\   r6   rW   )rQ   r   ry   rY   r+   rj   Úmtr}   Ú	body_textÚmr   rB   r�   Útagre   rI   rZ   ÚfallbackrL   rŒ   s                      @r   Úextract_detailr™   Ž   sà  ø€ ð$Ü�L‰L˜¤g°rÔ:ˆØ	×ÑÔô �q‹>€DÜ˜˜}Ó-€Dð 
�‰�4‹€BÙ')ˆB�K‰K˜dˆKÔ#¨r€EÙØ�Y‰Y�wÓˆÙØ—K‘K d�KÓ+ˆEä—F‘FÐ5°r¸5ÓAˆEÜ—F‘FÐ>ÀÀEÓJˆEð €HØ—‘˜c¨�Ó.€IÜ
�	‰	Ð=¸yÓI€AÙØ—7‘7˜1“:ˆÙÜ�I‰IÐ>À	ÓJˆÙØ—w‘w˜q“zˆHÙÜ�I‰IÐ.°	Ó:ˆÙØ—w‘w˜q“zˆHð €GØ—)‘)˜E¨,�)Ó7ò =Ø—)‘)˜E¨)�)Ó4ò=à—)‘)˜E¨.�)Ó9ò=ð —)‘)˜EÐ*;�)Ó<ð ñ Ü! +¨sÓ3‰ð �y‰y˜Ó ˆÙà—}‘}Ò%SÓTò  �Ø—‘•ð ð Lò �Ø—i‘i Ó.F�iÓG�ÚÜ-¨c°3Ó7�GÙð	ñ
 à—m‘m C¨t�mÓ4�Ü�s“8˜b’=Ø!�Gä% d¨CÓ0€Kô ˆ7�=‰=‹?Ó˜bÒ Ø�uÒ2 §	¡	¨#£¨rÑ 2Ð3°2°c°U¸!Ð<ˆÙØ ò F�Ø˜n¨Q¨v©Y¨K°r¸!¸E¹(¸À1ÐEÑE‘ðFàˆà�(˜G [Ð0Ð0øôK ò $Ø�T˜4 Ð#Ò#ð$ús   ƒ,J0 Ê0KËKFc                 ó”  — t        «       }|j                  «       }d}d}d}t        d|dz   «      D �]%  }t        |«      }|t	        |«      z  }|s �n|D ]ô  }	|	d   }
|j                  d|
f«       |j                  «       rŒ,t        |
«      \  }}}}|s|dz  }ŒD|xs |	d   }|xs |	d   }|rt        j                  |d¬«      nd	}|r|d d
 n|j                  «       }|s|}	 |j                  t        t        |
|
|j                  «       |||t        |t        f
«       |j                  «        |j                   dkD  r|dz  }| sŒî|dk\  sŒô n | s�Œ|dk\  s�Œ& n |j+                  «        t%        dt        › �«       t%        d|› d|› d|› �«       |S # t"        $ r-}t%        d|› �t&        j(                  ¬«       |dz  }Y d }~Œƒd }~ww xY w)Nr   r^   rQ   z)SELECT id FROM gov_raw WHERE page_url = ?rj   rl   F)Úensure_asciir   éÈ   z  DB error: rb   é   z
[DONE] z  New: z
, Errors: z, Listed total: )r   ÚcursorÚranger~   rv   r   Úfetchoner™   ÚjsonÚdumpsr6   ÚSQLÚ	SITE_NAMEÚCATEGORYÚGROUPÚcommitÚrowcountrq   rr   rs   rt   Úclose)Ú	test_modeÚ	max_pagesr   ÚcurÚtotalr   Útotal_listedÚpnrz   ÚitemrQ   rj   r}   r   rZ   Úfinal_titleÚ
final_dateÚatt_jsonÚsummaryrx   s                       r   Úcrawlrµ   Ú   sä  € Ü‹9€DØ
�+‰+‹-€CØ€EØ€FØ€Lä�A�y 1‘}Ó%ó )ˆÜ! "Ó%ˆØœ˜E›
Ñ"ˆáÚàò 	ˆDØ�u‘+ˆCØ�K‰KÐCÀcÀVÔLØ�|‰|Œ~Øä4BÀ3Ó4GÑ1ˆE�8˜W kÙØ˜!‘�ØàÒ0 4¨¡=ˆKØ!Ò1 T¨&¡\ˆJÙFQ”t—z‘z +¸EÕBÐWYˆHÙ(/�w˜t ‘}°[×GÑGÓIˆGÙØ%�ð
Ø—‘œCÜ˜s C¨×):Ñ):Ó)<¸jØ˜W¤h°¼%ð"ô ð —‘”Ø—<‘< !Ò#Ø˜Q‘J�Eò
 ˜U a›ZÙð?	óB ˜ !œÙðS)ðV 	‡J�J„LÜ	ˆI”i�[Ð
!Ô"Ü	ˆG�E�7˜* V HÐ,<¸\¸NÐ
KÔLØ€Løô ò Ü˜ Q CÐ(¬s¯z©zÕ:Ø˜!‘•ûðús   Ã!AFÆ	GÆ#GÇGÚ__main__z--testÚtestÚfullr�   r^   )rª   r«   )*Ú__doc__r¡   r?   rs   rn   Úbs4r   Úurllib.parser   ÚMAX_PAGES_DEFAULTÚargparseÚ_APÚArgumentParserÚ
_AP_PARSERÚadd_argumentÚintÚparse_known_argsÚ_AP_ARGSÚ_ÚpagesÚ	MAX_PAGESr   r¤   r¥   r¦   rm   ro   r£   r   r!   r'   rJ   r\   r~   r™   rµ   Ú__name__ÚargvÚmodeÚmax_prv   ÚisdigitrR   r   r   ú<module>rÍ      sC  ðá *ß × Ý Ý  ØÐ ó ØˆS×ÑÓ!€
Ø 
× Ñ ˜	¨°Q¸^Ð Ô LØ×)Ñ)Ó+�€ˆ!Ø&Ÿn™n¨qÒ0ˆH�NŠNÐ6G€	à
€Ø$€	Ø€Ø€Ø-€ð DØ'ñ€ð
-€ò
ò1òòò:
ò+ò\I1ðX  Yó 5ðp ˆzÒØ §¡Ñ)‰6¨v€DØ˜’‰A Y€EÙ
ˆ3�8‰8ƒ}�qÒ˜SŸX™X a™[×0Ñ0Ô2Ù�C—H‘H˜Q‘KÓ ˆÙ	�T˜V‘^°Ö6ð r   