Ë
    ¡Š£j/  ã                   óv  — 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mZ dZ	dZ
dZdZdd	d
dœZdZh d£Zd„ Zd#d„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd$d„Zedk(  rb ej6                  e	› d�¬«      Zej;                  ddd¬«       ej;                  ded ¬!«       ej?                  «       Z  ee jB                  ¬"«       yy)%u‚   
ä¸œè�¥åŒº-é€šçŸ¥å…¬å‘Š çˆ¬è™«
http://www.dyq.gov.cn/col/col39314/index.html
TRS CMS, JPage åˆ†é¡µç³»ç»Ÿ, é¦–é¡µå†…åµŒ45æ�¡æ•°æ�®
é    N)ÚBeautifulSoupÚTagu   ä¸œè�¥åŒº-é€šçŸ¥å…¬å‘Šu   ç”Ÿæ€�çŽ¯å¢ƒzhttp://www.dyq.gov.cnz-http://www.dyq.gov.cn/col/col39314/index.htmlzoMozilla/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,*/*;q=0.8zzh-CN,zh;q=0.9,en;q=0.8)z
User-AgentÚAcceptzAccept-Languagez/root/search.db>)   ÚpÚddÚdlÚdtÚh1Úh2Úh3Úh4Úh5Úh6ÚhrÚliÚolÚtdÚthÚtrÚulÚdivÚnavÚpreÚformÚmainÚasideÚtableÚtbodyÚtfootÚtheadÚcenterÚdialogÚfigureÚfooterÚheaderÚhgroupÚaddressÚarticleÚcaptionÚdetailsÚsectionÚfieldsetÚ
blockquoteÚ
figcaptionc                 óÒ   ‡‡‡— | €yddl }ddlmŠ g Šˆˆˆfd„Š ‰| «       dj                  ‰«      }|j	                  dd|«      }|j	                  dd	|«      }|j                  «       S )
ul   å�—çº§è¾¹ç•Œå‡ºæ�¢è¡Œã€�è¡Œå†…èŠ‚ç‚¹ç›´æŽ¥æ‹¼æŽ¥ã€�<br> å‡ºæ�¢è¡Œï¼ˆâ‰ˆ æµ�è§ˆå™¨çœ‹åˆ°çš„æ�¢è¡Œç»“æž„ï¼‰ã€‚NÚ r   )ÚNavigableStringc                 óF  •— | j                   D ]‘  }t        |‰«      r‰j                  t        |«      «       Œ*t	        |dd «      dk(  r‰j                  d«       ŒLt	        |dd «      t
        v r+‰j                  d«        ‰|«       ‰j                  d«       ŒŠ ‰|«       Œ“ y )NÚnameÚbrú
)ÚchildrenÚ
isinstanceÚappendÚstrÚgetattrÚ_BLOCK_TAGS)ÚnodeÚchr1   ÚoutÚwalks     €€€ú%/root/gov_crawler/crawl_dyq_notice.pyr?   zbody_text.<locals>.walk-   s„   ø€ Ø—-‘-ò 
	ˆBÜ˜"˜oÔ.Ø—
‘
œ3˜r›7Õ#Ü˜˜V TÓ*¨dÒ2Ø—
‘
˜4Õ Ü˜˜V TÓ*¬kÑ9Ø—
‘
˜4Ô Ù�R”Ø—
‘
˜4Õ á�R•ñ
	ó    z[ \t\r\f\v]*\n[ \t\r\f\v]*r5   ú\n{3,}ú

)ÚreÚbs4r1   ÚjoinÚsubÚstrip)ÚelÚ_reÚtr1   r>   r?   s      @@@r@   Ú	body_textrL   %   sb   ú€ à	€zØÛÝ#Ø
€Cöñ 	ˆ„HØ
�‰�‹€AØ�‰Ð-¨t°QÓ7€AØ�‰�	˜6 1Ó%€AØ�7‰7‹9ÐrA   c           	      ó  — t        |«      D ]3  }	 t        j                  | t        d¬«      }d|_        |j
                  c S  y # t        $ r}t        d|› d|dz   › �«       Y d }~nd }~ww xY wt        j                  d«       Œw)Né   )ÚheadersÚtimeoutzutf-8z	  Error: z, retry é   é   )
ÚrangeÚrequestsÚgetÚHEADERSÚencodingÚtextÚ	ExceptionÚprintÚtimeÚsleep)ÚurlÚmax_retriesÚattemptÚrÚes        r@   Úfetchrb   @   s{   € Ü˜Ó%ò ˆð	6Ü—‘˜S¬'¸2Ô>ˆAØ ˆAŒJØ—6‘6ŠMð	ð øô ò 	6Ü�I˜a˜S ¨°©¨Ð4×5Ñ5ûð	6úä�
‰
�1�s   �.AÁ	A*ÁA%Á%A*c                 óª  — g }t        j                  d| t         j                  «      }|st        d«       |S |j	                  d«      }t        j
                  d|t         j                  «      }t        dt        |«      › d�«       |D �]H  }t        j                  d|t         j                  «      }|sŒ,|j	                  d«      }t        |d«      }|j                  d	«      }	|	sŒ]|	j                  d
«      }
|	j                  d«      }|
sŒ‚|
j                  dd«      }|sŒ—|j                  d«      s$t        j                  j                  t        |«      }|
j                  d¬«      }|r|j                  d¬«      nd}t        j                  d|«      }|r!|j	                  d«      j!                  dd«      }|s�Œ1|s�Œ5|j#                  |||f«       �ŒK |S )z6Parse records from the datastore embedded in the HTML.z<datastore>(.*?)</datastore>z  [WARN] No datastore foundrQ   z<record>(.*?)</record>z  Found z records in datastorez<!\[CDATA\[(.*?)\]\]>úhtml.parserr   ÚaÚspanÚhrefr0   ÚhttpT©rH   z(\d{4}[-/]\d{1,2}[-/]\d{1,2})ú/ú-)rD   ÚsearchÚDOTALLrZ   ÚgroupÚfindallÚlenr   ÚfindrU   Ú
startswithrT   ÚcompatÚurljoinÚBASE_URLÚget_textÚreplacer8   )ÚhtmlÚitemsÚds_mÚds_rawÚrecordsÚrecÚcdata_mÚcdataÚsoupr   re   rf   rg   ÚtitleÚdateÚms                   r@   Úparse_list_pager„   L   s‹  € à€EÜ�9‰9Ð4°d¼B¿I¹IÓF€DÙÜÐ+Ô,ØˆØ�Z‰Z˜‹]€FÜ�j‰jÐ2°F¼B¿I¹IÓF€GÜ	ˆH”S˜“\�NÐ"7Ð
8Ô9Øó .ˆÜ—)‘)Ð4°c¼2¿9¹9ÓEˆÙØØ—‘˜aÓ ˆÜ˜U MÓ2ˆØ�Y‰Y�t‹_ˆÙØØ�G‰G�C‹LˆØ�w‰w�v‹ˆÙØØ�u‰u�V˜RÓ ˆÙØØ�‰˜vÔ&Ü—?‘?×*Ñ*¬8°TÓ:ˆDØ—
‘
 �
Ó&ˆÙ,0ˆt�}‰} 4ˆ}Ô(°bˆÜ�I‰IÐ6¸Ó=ˆÙØ—7‘7˜1“:×%Ñ% c¨3Ó/ˆDÛ“TØ�L‰L˜$  tÐ,Ö-ð1.ð2 €LrA   c                 óL   ‡— | j                  «       Št        ˆfd„dD «       «      S )Nc              3   ó@   •K  — | ]  }‰j                  |«      –— Œ y ­w)N)Úendswith)Ú.0ÚextÚlows     €r@   ú	<genexpr>z$is_attachment_url.<locals>.<genexpr>t   s   øè ø€ Òw Sˆs�|‰|˜C× Ñwùs   ƒ)	z.pdfz.docz.docxz.xlsz.xlsxz.zipz.rarz.wpsz.ofd)ÚlowerÚany)rg   rŠ   s    @r@   Úis_attachment_urlrŽ   r   s    ø€ Ø
�*‰*‹,€CÜÓwÐ,vÔwÓwÐwrA   c                 ó  — | j                  dd«      }|sy |j                  d«      r|nt        j                  j	                  ||«      }| j                  dd«      }|r|j                  d|› d|› d�«       y |j                  d|› d�«       y )	NÚsrcr0   rh   Úaltz![ú](ú)ú![]()rU   rr   rT   rs   rt   r8   )Úimg_tagÚ	base_pathÚcontent_partsr�   Úfull_srcr‘   s         r@   Úprocess_image_to_partsr™   w   sƒ   € Ø
�+‰+�e˜RÓ
 €CÙØØ—n‘n VÔ,‰s´(·/±/×2IÑ2IÈ)ÐUXÓ2Y€HØ
�+‰+�e˜RÓ
 €CÙ
Ø×Ñ˜r #  b¨¨
°!Ð4Õ5à×Ñ˜t H :¨QÐ/Õ0rA   c                 óV  — | j                  dd«      }|rt        |«      sy |j                  d«      r|nt        j                  j                  ||«      }| j                  d¬«      xs |j                  d«      d   }d|› d	|› d
�}|j                  |||f«       |j                  |«       y )Nrg   r0   rh   Tri   rj   éÿÿÿÿú[r’   r“   )	rU   rŽ   rr   rT   rs   rt   rv   Úsplitr8   )Úa_tagr–   r—   Úattachmentsrg   Úfull_urlÚ	link_textÚlink_mds           r@   Úprocess_attachment_to_partsr£   ƒ   sž   € Ø�9‰9�V˜RÓ €DÙÔ(¨Ô.ØØ—‘ vÔ.‰t´H·O±O×4KÑ4KÈIÐW[Ó4\€HØ—‘ T�Ó*ÒE¨h¯n©n¸SÓ.AÀ"Ñ.E€IØ�)�˜B˜x˜j¨Ð*€GØ×Ñ˜	 7¨HÐ5Ô6Ø×Ñ˜Õ!rA   c                 ó   — t        | «      S )u   ä¿�ç•™ HTML è¡¨æ ¼ç»“æž„)r9   )r   s    r@   Úrender_tabler¥   Ž   s   € äˆu‹:ÐrA   c                 ó^  — g }g }| j                   D �]D  }t        |t        «      sŒ|j                  j	                  «       }|dk(  rÇ|j                  d«      }|j                  d«      }|r|j                  t        |«      «       Œs|r'|j                  d¬«      s|D ]  }t        |||«       Œ Œœt        |«      }	|	sŒªt        j                  dd|	«      }	t        j                  dd|	«      j                  «       }	|	sŒé|j                  |	«       Œû|dk(  r|j                  t        |«      «       �Œ|d	v rü|j                  d
g «      }
t        |
t         «      rdj#                  |
«      n
t%        |
«      }d|j	                  «       v r�Œr|j                   D ]™  }t        |t        «      sŒ|j                  j	                  «       }|dk(  r t        |«      }|sŒA|j                  |«       ŒS|dk(  r|j                  t        |«      «       Œs|dk(  rt        |||«       Œ†|dk(  sŒŒt'        ||||«       Œ› �Œ|dk(  rt        |||«       �Œ0|dk(  s�Œ7t'        ||||«       �ŒG | j                  dd¬«      D ]·  }|d   }t)        |«      sŒ|j+                  d«      r|nt,        j.                  j1                  ||«      }|j                  d¬«      xs |j3                  d«      d   }d|› d|› d�}||vsŒ}||D �cg c]  }|d   ‘Œ	 c}vsŒ“|j                  |||f«       |j                  |«       Œ¹ ||fS c c}w )z6Extract content parts, attachments from a content div.r   Úimgr   Tri   u   ^è§†åŠ›ä¿�æŠ¤è‰²[ï¼š:]\s*r0   u   å­—ä½“\[å¤§ä¸­å°�\])r   rf   Úclassú Úbdsharere   )rg   rg   rh   rj   r›   rœ   r’   r“   rQ   )r6   r7   r   r3   rŒ   Úfind_allrq   r8   r¥   rv   r™   rL   rD   rG   rH   rU   ÚlistrF   r9   r£   rŽ   rr   rT   rs   rt   r�   )Úcontent_divr–   r—   rŸ   ÚchildÚtagÚimgsÚtable_innerr§   rX   ÚclsÚcls_strÚinnerÚitagÚtxtre   rg   r    r¡   r¢   s                       r@   Úextract_content_from_divr·   ‘   sû  € à€MØ€Kà×%Ñ%ó /VˆÜ˜%¤Ô%ØØ�j‰j×ÑÓ ˆà�#Š:Ø—>‘> %Ó(ˆDØŸ*™* WÓ-ˆKÙØ×$Ñ$¤\°+Ó%>Õ?Ù˜eŸn™n°4˜nÔ8Øò J�CÜ*¨3°	¸=ÕIñJô ! Ó'�ÚÜŸ6™6Ð">ÀÀDÓI�DÜŸ6™6Ð"8¸"¸dÓC×IÑIÓK�DÚØ%×,Ñ,¨TÕ2à�GŠ^Ø× Ñ ¤¨eÓ!4Ö5à�OÑ#Ø—)‘)˜G RÓ(ˆCÜ'1°#´tÔ'<�c—h‘h˜s”mÄ#ÀcÃ(ˆGØ˜GŸM™M›OÑ+ÙØŸ™ò b�Ü˜e¤SÕ)Ø Ÿ:™:×+Ñ+Ó-�DØ˜s’{Ü'¨Ó.˜ÚØ)×0Ñ0°Õ5Ø šØ%×,Ñ,¬\¸%Ó-@ÕAØ šÜ.¨u°iÀÕOØ ›Ü3°E¸9ÀmÐU`Õaòbð �EŠ\Ü" 5¨)°]ÖCà�CŒZÜ'¨¨y¸-ÈÖUð_/Vðd ×!Ñ! #¨DÐ!Ó1ò .ˆØ�‰yˆÜ˜TÕ"Ø#Ÿ™¨vÔ6‘t¼H¿O¹O×<SÑ<SÐT]Ð_cÓ<dˆHØŸ
™
¨˜
Ó.ÒI°(·.±.ÀÓ2EÀbÑ2IˆIØ˜)˜ B x j°Ð2ˆGØ˜mÒ+°ÈkÖ?ZÈÀÀ!ÃÒ?ZÒ0ZØ×"Ñ" I¨w¸Ð#AÔBØ×$Ñ$ WÕ-ð.ð ˜+Ð%Ð%ùò	 @[s   Ë.L*c                 ón  — t        | d«      }|j                  d«      }d}|r>|j                  d¬«      }dD ]#  }|j                  |«      sŒ|t	        |«      d } n |s|}|j                  dd	¬
«      xs |j                  dd¬
«      }|s|ddg fS d}|j                  «       }	t        j                  d|	«      }
|
r!|
j                  d«      j                  dd«      }dj                  |j                  d«      dd «      dz   }t        ||«      \  }}dj                  |«      }t        j                  dd|«      }t        j                  dd|«      }|j                  «       }|sˆg }|j                  d«      D ]_  }|j                  dd«      }|sŒ|j                  d«      r|nt         j"                  j%                  ||«      }|j'                  d|› d�«       Œa |rdj                  |«      }|D �cg c]  }|d   ‘Œ	 }}|s|rdj                  |«      }n|r|r|ddj                  |«      z   z  }||||fS c c}w )zKParse detail page and return (title, content_text, date, attachments_list).rd   r�   r0   Tri   )u#   ä¸œè�¥åŒºäººæ°‘æ”¿åºœ é€šçŸ¥å…¬å‘Š u   ä¸œè�¥åŒºäººæ°‘æ”¿åºœ u   é€šçŸ¥å…¬å‘Š Nr   Úwenzhang)Úclass_Ú
bt_contentu2   å�‘å¸ƒæ—¥æœŸ[ï¼š:]\s*(\d{4}[-/]\d{1,2}[-/]\d{1,2})rQ   rj   rk   r›   rC   z[ \t]+r©   rB   r§   r�   rh   r”   r“   r5   u   

**é™„ä»¶:**
)r   rq   rv   rr   rp   rD   rl   rn   rw   rF   r�   r·   rG   rH   r«   rU   rT   rs   rt   r8   )rx   r]   r€   Ú	title_tagr�   ÚrawÚprefixr­   r‚   ÚctÚdmr–   r—   rŸ   ÚcontentÚ	img_partsr§   r�   r˜   re   Úattachment_linkss                        r@   Úparse_detailrÄ   Õ   sL  € ä˜˜}Ó-€Dð —	‘	˜'Ó"€IØ€EÙØ× Ñ  tÐ Ó,ˆØhò 	ˆFØ�~‰~˜fÕ%ØœC ›K˜LÐ)�Ùð	ñ ØˆEð —)‘)˜E¨*�)Ó5Ò^¸¿¹À5ÐQ]¸Ó9^€KÙØ�b˜"˜bÐ Ð ð €DØ	×	Ñ	Ó	€BÜ	�‰ÐHÈ"Ó	M€BÙ	Ø�x‰x˜‹{×"Ñ" 3¨Ó,ˆð —‘˜Ÿ™ 3›¨¨Ð,Ó-°Ñ3€Iä!9¸+ÀyÓ!QÑ€M�;ð �k‰k˜-Ó(€GÜ�f‰f�Y  WÓ-€GÜ�f‰f�Y ¨Ó0€GØ�m‰m‹o€Gñ Øˆ	Ø×'Ñ'¨Ó.ò 	5ˆCØ—'‘'˜% Ó$ˆCÚØ"%§.¡.°Ô"8™3¼h¿o¹o×>UÑ>UÐV_ÐadÓ>e�Ø× Ñ  4¨ z°Ð!3Õ4ð		5ñ
 Ø—i‘i 	Ó*ˆGð '2Ö2 ˜˜!›Ð2ÐÐ2ñ Ñ'Ø—)‘)Ð,Ó-‰Ù	Ñ%ØÐ&¨¯©Ð3CÓ)DÑDÑDˆà�'˜4 Ð,Ð,ùò 3s   Ç-H2c                 ó  — t        dt        › d�«       t        dt        › �«       t        «        t        t        «      }|st        d«       g S t	        |«      }t        dt        |«      › d�«       | r/t        d«       |D ]  \  }}}t        d|› d	|d
d › d	|› �«       Œ |S t        d«       dd
l}t        |«      D �]  \  }\  }}}	t        d|dz   › dt        |«      › d|j                  d«      d   d
d › d|d
d › d�	«       t        |«      }|st        d«       Œ`t        ||«      \  }}
}}|xs |}|xs |	}|
st        d«       Œ‹	 |j                  t        «      }|j                  «       }|j                  d||||
|t        t        f«       |j                  }|j!                  «        |j#                  «        t        d|rdnd› d|d
d › d|› �«       �Œ t        d!«       |S # t$        $ r}t        d |› �«       Y d
}~�ŒFd
}~ww xY w)"zMain crawl function.z=== u    çˆ¬è™« ===u   ç›®æ ‡: z"  [FAIL] Failed to fetch list pageu   æ€»è®¡: u    æ�¡z
=== DRY RUN ===z  z | Né<   u   
=== èŽ·å�–è¯¦æƒ… ===r   z  [rQ   rj   z] r›   é   z... é(   z...z!    [SKIP] Failed to fetch detailz    [SKIP] Empty contentzƒINSERT OR IGNORE INTO gov_raw (page_url, title, publish_date, content, summary, site_name, group_name) VALUES (?, ?, ?, ?, ?, ?, ?)z    z[NEW]z[skip]r©   é2   z... | z    [DB ERROR] u   
=== å®Œæˆ� ===)rZ   Ú	SITE_NAMEÚLIST_URLrb   r„   rp   Úsqlite3Ú	enumerater�   rÄ   ÚconnectÚDB_PATHÚcursorÚexecuteÚGROUPÚrowcountÚcommitÚcloserY   )Údry_runrx   ry   r]   r�   r‚   rÌ   ÚiÚ
list_titleÚ	list_daterÁ   rŸ   Úfinal_titleÚ
final_dateÚconnÚcÚnewra   s                     r@   Úcrawlrß     s+  € ä	ˆD”�˜;Ð
'Ô(Ü	ˆH”X�JÐ
Ô Ü	„Gä”‹?€DÙÜÐ2Ô3Øˆ	ä˜DÓ!€EÜ	ˆH”S˜“Z�L Ð
%Ô&áÜÐ!Ô"Ø %ò 	6ÑˆC�˜Ü�B�t�f˜C  c r 
˜|¨3¨s¨eÐ4Õ5ð	6àˆä	Ð
"Ô#Ûä+4°UÓ+;ó )Ñ'ˆÑ'ˆC�˜YÜ��A�a‘C�5˜œ#˜e›*˜ R¨¯	©	°#«°rÑ(:¸3¸BÐ(?Ð'@ÀÀZÐPSÐQSÀ_ÐDUÐUXÐYÔZÜ�S‹zˆÙÜÐ5Ô7Øä,8¸¸sÓ,CÑ)ˆˆw˜˜kØÒ)˜zˆØÒ&˜Yˆ
áÜÐ,Ô.Øð	)Ø—?‘?¤7Ó+ˆDØ—‘“ˆAØ�I‰Ið VØ�k :¨w¸ÄYÔPUÐVôð —*‘*ˆCØ�K‰KŒMØ�J‰JŒLÜ�D¡C™¨XÐ6°a¸ÀCÀRÐ8HÐ7IÈÐPZÈ|Ð\Ö]ð3)ô: 
ÐÔØ€Løô	 ò 	)Ü�O A 3Ð'×(Ò(ûð	)ús   ÅBG%Ç%	HÇ.HÈHÚ__main__u    çˆ¬è™«)Údescriptionz	--dry-runÚ
store_trueu   ä»…åˆ—å‡ºä¸�å…¥åº“)ÚactionÚhelpz--pagesu"   åˆ«å�� (æ­¤ç«™ä»…1é¡µé¦–é¡µæ•°æ�®))Útyperä   )rÖ   )é   )F)"Ú__doc__rD   Újsonr[   ÚargparserT   rE   r   r   rÊ   rÒ   ru   rË   rV   rÏ   r;   rL   rb   r„   rŽ   r™   r£   r¥   r·   rÄ   rß   Ú__name__ÚArgumentParserÚparserÚadd_argumentÚintÚ
parse_argsÚargsrÖ   © rA   r@   ú<module>rò      sù   ðñó
 
Û Û Û Û ß "à$€	Ø€Ø"€Ø:€ð DØOØ0ñ€ð
 €ò*€òó6	ò#òLxò
	1ò"òòA&òH;-ó|5ðp ˆzÒØ$ˆX×$Ñ$°I°;¸gÐ1FÔG€FØ
×Ñ˜¨LÐ?SÐÔTØ
×Ñ˜	¨Ð2VÐÔWØ×ÑÓ€DÙ	�$—,‘,Öð rA   