Ë
    V_ŠjL(  ã                   óþ  — 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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iZ ej"                  e«      Zej'                  «       Zdad„ Zd„ Zd„ Zd„ Z ed«       dZdZ ededz   «      D ]ª  Zedk(  re› d�Zne› de› d�Z	  ej@                  eed¬«      Z!de!_"        e!jF                  Z$ ee$«      Z'e's ede› d�«        nVe'D ]1  \  Z(Z)Z*e*sŒ
e*dk  rŒ ee)«      \  Z+Z,e+s	de)› de(› d�Z+ ee(e)e*e+e,«      Z-Œ3  ede› de› d  e.e'«      › d!t*        › �«       Œ¬ ej_                  «        eja                  «         ed"t*        › �«       y# e%$ rZ& ede› de&› �«       Y dZ&[& ŒIdZ&[&ww xY w)#uÈ   
å…´å®�å¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€ - çŽ¯ä¿�ä¿¡æ�¯çˆ¬è™«
List: https://www.xingning.gov.cn/zfjg/xnshjbhj/hbxx/index.html (+ index_2.html ... index_20.html)
Detail: /zfjg/xnshjbhj/hbxx/*/content/post_XXXXX.html
é    N)Údatetime)ÚBeautifulSoupz/root/search.dbzcrawl_xingning.pyu   å…´å®�å¸‚-çŽ¯ä¿�ä¿¡æ�¯u   å¹¿ä¸œzhttps://www.xingning.gov.cnz
User-AgentzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36c           
      ó  — |rt        j                  |d¬«      nd}	 t        j                  d| j	                  «       |||j	                  «       t
        d|f«       t        j                  dkD  r
t        dz  ay	 y# t        $ r
}Y d }~yd }~ww xY w)	NF)Úensure_asciiz[]z§
            INSERT OR IGNORE INTO gov_raw (title, page_url, publish_date, content, site_name, category, attachments)
            VALUES (?, ?, ?, ?, ?, ?, ?)
        u   çŽ¯ä¿�ä¿¡æ�¯r   é   T)	ÚjsonÚdumpsÚcurÚexecuteÚstripÚ	SITE_NAMEÚrowcountÚ	total_newÚ	Exception)ÚtitleÚpage_urlÚpublish_dateÚcontent_textÚattachmentsÚattachments_jsonÚes          ú#/root/gov_crawler/crawl_xingning.pyÚsave_articler      s�   € áFQ”t—z‘z +¸EÕBÐW[Ðð	Ü�‰ð ð �k‰k‹m˜X |°\×5GÑ5GÓ5IÌ9ÐVdÐfvÐwô	yô �<‰<˜!ÒÜ˜‰NˆIØð ð
 øô ò ÛØûðús   �AA9 Á9	BÂBc                 ó<  ‡‡"— 	 t        j                  | t        d¬«      }d|_        |j                  }t        |d«      }|j                  dd¬«      }|s|j                  dd	„ ¬
«      }|s|j                  dd„ ¬«      }|st        | |«      S |j                  d«      D ]  }|j                  «        Œ |j                  d«      }g }|D ]Ð  }|j                  d¬«      Š"t        ˆ"fd„dD «       «      r|j                  «        Œ:d‰"v st        ‰"«      dk  r|j                  «        Œ]|j                  d«      }	d}
|	D ]-  }|j                  ddg«      }t        d„ |D «       «      sŒ)|
dz  }
Œ/ |
dkD  r|j                  t        |«      «       |j                  «        ŒÒ |j                  «       }|j                  d«      D �cg c]#  }|j!                  «       sŒ|j!                  «       ‘Œ% }}g d¢}g }|D ]J  Št        ˆfd„|D «       «      s"‰j#                  d«      s‰j#                  d«      rŒ:|j                  ‰«       ŒL |j                  dd¬«      }g }d}|r#|j                  d¬«      }|j                  |«       |D ]  }|r||k(  rŒ|j                  |«       Œ |D �cg c]  }|sŒ|‘Œ	 }}|rPd}t%        |«      D ]  \  }}d |v sd!|v sŒ|} n |dk\  r|j'                  ||d   «       n|j                  |d   «       d"j)                  |«      }g }|j                  d#d¬$«      D ]   }|d%   }|j                  d¬«      xs1 t*        j,                  j/                  |«      j                  d&«      d   }t1        j2                  d'|t0        j4                  «      sŒs|j#                  d(«      r	t6        |z   }|j                  ||d)œ«       Œ¢ t9        «       } g }!|D ]/  }|d*   | vsŒ| j;                  |d*   «       |!j                  |«       Œ1 ||!fS #  dg fcY S xY wc c}w c c}w )+z3Fetch detail page and extract content + attachmentsé   ©ÚheadersÚtimeoutúutf-8Nzhtml.parserÚdivzis-contentbox)Úclass_c                 ó6   — | r| xr d| j                  «       v S d S ©NÚcontent©Úlower)Úis    r   ú<lambda>zfetch_detail.<locals>.<lambda>6   s   € ÑTU°AÒ4P¸)ÀqÇwÁwÃyÐ:P€ Ð[_€ ó    )Úidc                 ó6   — | r| xr d| j                  «       v S d S r#   r%   )Úcs    r   r(   zfetch_detail.<locals>.<lambda>8   s   € ÑXY¸Ò8T¸iÈ1Ï7É7Ë9Ð>T€ Ð_c€ r)   ÚscriptÚtableT©r   c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­w©N© )Ú.0ÚkwÚall_texts     €r   ú	<genexpr>zfetch_detail.<locals>.<genexpr>I   s   øè ø€ ÒY "ˆr�XŒ~ÑYùó   ƒ)õ   æµ�è§ˆæ¬¡æ•°õ   ä¿¡æ�¯æ�¥æº�u   å�‘å¸ƒæ—¶é—´õ   Ã—Útrr   ÚtdÚthc              3   ó\   K  — | ]$  }|j                  d ¬«      j                  «       –— Œ& y­w)Tr/   N)Úget_textr   ©r3   r,   s     r   r6   zfetch_detail.<locals>.<genexpr>U   s$   è ø€ ÒA°a�1—:‘: D�:Ó)×/Ñ/×1ÑAùs   ‚*,r   ú
)u   ã€�æ‰“å�°æœ¬é¡µã€‘u   ã€�å…³é—­çª—å�£ã€‘u   æµ�è§ˆæ¬¡æ•°ï¼šu   ä¿¡æ�¯æ�¥æº�ï¼šu   è½¬è‡ªæœ¬ç½‘u	   æ�¥æº�ï¼šc              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wr1   r2   )r3   ÚsÚls     €r   r6   zfetch_detail.<locals>.<genexpr>c   s   øè ø€ Ò'˜!ˆq�AŒvÑ'ùr7   u   ä¸Šä¸€æ�¡ï¼šu   ä¸‹ä¸€æ�¡ï¼šzis-newstitleéÿÿÿÿu   å…¬å‘ŠæœŸé™�u   è�”ç³»ç”µè¯�ú

Úa)ÚhrefrH   ú?z"\.(pdf|doc|docx|xls|xlsx|zip|rar)$ú/©ÚnameÚurlrM   )ÚrequestsÚgetÚHEADERSÚencodingÚtextr   ÚfindÚ_fetch_detail_oldÚfind_allÚ	decomposer?   ÚanyÚlenÚappendÚstrÚsplitr   Ú
startswithÚ	enumerateÚinsertÚjoinÚosÚpathÚbasenameÚreÚsearchÚIÚBASE_URLÚsetÚadd)#rM   ÚrÚhtmlÚsoupÚcontent_divrC   Ú
table_tagsÚtable_md_blocksÚtÚrowsÚ
valid_rowsÚrowÚcellsÚraw_textrD   ÚlinesÚskip_kwÚfilteredÚ	title_tagÚresultÚ
title_textÚlineÚmÚmd_listÚ
insert_idxr'   Úpr   r   rG   rH   rL   ÚseenÚunique_attachmentsr5   s#                 `                   @r   Úfetch_detailr‚   (   s  ù€ ðÜ�L‰L˜¤g°rÔ:ˆØˆŒ
Ø�v‰vˆô ˜˜}Ó-€Dð —)‘)˜E¨/�)Ó:€KÙØ—i‘i Ñ*_�iÓ`ˆÙØ—i‘i Ñ.c�iÓdˆñ Ü   dÓ+Ð+ð ×!Ñ! (Ó+ò ˆØ	�‰�ðð ×%Ñ% gÓ.€JØ€Oàò ˆØ—:‘: D�:Ó)ˆäÓYÐ(XÔYÔYØ�K‰KŒMØà�xÑ¤3 x£=°2Ò#5Ø�K‰KŒMØà�z‰z˜$ÓˆØˆ
Øò 	 ˆCØ—L‘L $¨ Ó.ˆEÜÑA¸5ÔAÕAØ˜a‘‘
ð	 ð ˜Š>Ø×"Ñ"¤3 q£6Ô*Ø	�‰�ð'ð, ×#Ñ#Ó%€HØ (§¡¨tÓ 4ÖB˜1¸¿¹½	ˆQ�W‰W�YÐB€EÐBò ~€GØ€HØò ˆÜÓ'˜wÔ'Ô'¨1¯<©<¸Ô+GÈ1Ï<É<ÐXfÔKgØØ�‰˜Õðð × Ñ  ¨~Ð Ó>€IØ€FØ€JÙØ×'Ñ'¨dÐ'Ó3ˆ
Ø�‰�jÔ!àò ˆÙ˜$ *Ò,ØØ�‰�dÕðð *Ö/�QªQŠqÐ/€GÐ/ÙØˆ
Ü˜fÓ%ò 	‰DˆAˆqØ Ñ" n¸Ò&9Ø�
Ùð	ð ˜Š?Ø�M‰M˜* g¨a¡jÕ1à�M‰M˜' !™*Ô%à—;‘;˜vÓ&€Lð €KØ×!Ñ! #¨DÐ!Ó1ò <ˆØ�‰yˆØ�z‰z ˆzÓ%ÒM¬¯©×)9Ñ)9¸$Ó)?×)EÑ)EÀcÓ)JÈ1Ñ)MˆÜ�9‰9Ð:¸DÄ"Ç$Á$ÕGØ�‰˜sÔ#Ü $‘�Ø×Ñ¨°TÑ:Õ;ð<ô ‹5€DØÐØò )ˆØˆU‰8˜4ÒØ�H‰H�Q�u‘XÔØ×%Ñ% aÕ(ð)ð
 Ð+Ð+Ð+øðOØ�RˆxŠüò\ Cùò0 0s#   „/P	 Æ=PÇPÊPÊ$PÐ	Pc                 óØ  ‡— d}t        j                  dd|«      }t        j                  dd|«      }d„ }t        j                  d||t         j                  ¬«      }t        j                  d|«      }|�rK|j	                  d«      }d	D ]  }t        j                  d
|z   dz   d|«      }Œ! t        j                  dd|«      }t        j                  dd|«      }t        j                  dd|«      }|j                  d«      D �	cg c]/  }	t        |	j                  «       «      dkD  sŒ |	j                  «       ‘Œ1 }
}	g d¢}g }|
D ]P  Š‰|v st        ˆfd„|D «       «      rŒt        ˆfd„dD «       «      rŒ1t        ‰«      dkD  sŒ@|j                  ‰«       ŒR |r+dj                  |dd «      }t        j                  dd|«      }g }t        j                  d|t         j                  «      D ]y  }|j	                  d«      }|j	                  d«      j                  «       xs1 t        j                  j                  |«      j                  d«      d   }|j                  ||d œ«       Œ{ ||fS c c}	w )!z$Fallback: old regex-based extractionÚ z<script[^>]*>[\s\S]*?</script>z<style[^>]*>[\s\S]*?</style>c                 ó   ‡— | j                  d«      }t        j                  d|t        j                  «      }t        j                  dd|«      }t        j                  dd|«      j                  «       }t        |«      dk  sd|v ry	g }t        |«      D ]Ë  \  }}t        j                  d
|t        j                  «      }g Š|D ]a  }t        j                  dd|«      }	|	j                  dd«      j                  «       }	t        j                  dd|	«      }	‰j                  |	«       Œc t        ˆfd„dD «       «      rŒ¨t        d„ ‰D «       «      sŒ»|j                  |«       ŒÍ t        |«      dkD  rddj                  |«      z   dz   }
d	|
z   d	z   S y	)Nr   z<tr[^>]*>(.*?)</tr>ú<[^>]+>r„   z
&nbsp;|\s+ú r   r:   rA   z!<(?:td|th)[^>]*>(.*?)</(?:td|th)>ú&nbsp;z\s+c              3   óD   •K  — | ]  }|d j                  ‰«      v –— Œ y­w)r‡   N)r_   )r3   r4   Úmd_cellss     €r   r6   z?_fetch_detail_old.<locals>.table_to_markdown.<locals>.<genexpr>¯   s   øè ø€ Òa°�2˜Ÿ™ (Ó+Ô+Ñaùs   ƒ )r8   r9   u   è½¬è‡ªc              3   ó<   K  — | ]  }|j                  «       –— Œ y ­wr1   r/   r@   s     r   r6   z?_fetch_detail_old.<locals>.table_to_markdown.<locals>.<genexpr>±   s   è ø€ Ò3 Q�q—w‘w—yÑ3ùs   ‚r   z<table>z</table>)Úgrouprc   ÚfindallÚDOTALLÚsubr   rX   r]   ÚreplacerY   rW   r_   )r|   Ú
table_htmlrp   r5   Ú	keep_rowsÚrirr   rs   ÚcellÚ	cell_textÚ	keep_htmlrŠ   s              @r   Útable_to_markdownz,_fetch_detail_old.<locals>.table_to_markdownž   sh  ø€ Ø—W‘W˜Q“Zˆ
Ü�z‰zÐ0°*¼b¿i¹iÓHˆÜ—6‘6˜* b¨*Ó5ˆÜ—6‘6˜-¨¨hÓ7×=Ñ=Ó?ˆÜˆx‹=˜2Ò ¨Ñ!1Øàˆ	Ü  “ò 	"‰GˆB�Ü—J‘JÐCÀSÌ"Ï)É)ÓTˆEØˆHØò +�ÜŸF™F :¨r°4Ó8�	Ø%×-Ñ-¨h¸Ó<×BÑBÓD�	ÜŸF™F 6¨3°	Ó:�	Ø—‘ 	Õ*ð	+ô
 ÓaÐ6`ÔaÔaØÜÑ3¨(Ô3Ô3ØØ×Ñ˜SÕ!ð	"ô ˆy‹>˜AÒØ! B§G¡G¨IÓ$6Ñ6¸ÑCˆIØ˜)Ñ# dÑ*Ð*Ør)   z<table[^>]*>.*?</table>)Úflagsz<body[^>]*>([\s\S]*)</body>r   )z	is-headerz	is-footerÚfooterÚheaderÚnavÚtopbarzm-topzm-logoz	is-searchÚfootÚ	copyrightzclass="[^"]*z[^"]*"[\s\S]*?(?=
\s*<|$)r†   rA   rˆ   r‡   z[ \t]+é   )u   è®¾ä¸ºé¦–é¡µu   åŠ å…¥æ”¶è—�u   ç½‘ç«™æ ‡è¯†ç �u	   ç²¤ICPå¤‡u   ç²¤å…¬ç½‘å®‰å¤‡u	   ä¸»åŠžï¼šu	   ç»´æŠ¤ï¼šu   è�”ç³»æˆ‘ä»¬u   ç½‘ç«™åœ°å›¾u   éš�ç§�å£°æ˜Žu   å…³äºŽæˆ‘ä»¬u   ç½‘ç«™å£°æ˜Žu	   RSSè®¢é˜…ÚEnglishu   å…´å®�å¸‚äººæ°‘æ”¿åºœu   æ”¿åŠ¡æœ�åŠ¡u   éƒ¨é—¨åŠ¨æ€�u   å½“å‰�ä½�ç½®c              3   ó(   •K  — | ]	  }|‰k(  –— Œ y ­wr1   r2   ©r3   rC   r{   s     €r   r6   z$_fetch_detail_old.<locals>.<genexpr>É   s   øè ø€ Ò(G°q¨¨d­Ñ(Gùs   ƒc              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wr1   r2   r¢   s     €r   r6   z$_fetch_detail_old.<locals>.<genexpr>Ë   s   øè ø€ ÒI �1˜”9ÑIùr7   )u   å»ºè®¾é¡¹ç›®çŽ¯å¢ƒå½±å“�è¯„ä»·é   rF   Né<   z(\| [^\n]+ \|)\n\n(\|)z\1\n\2zR<a[^>]*href="(https?://[^"]+\.(?:pdf|doc|docx|xls|xlsx|zip|rar))"[^>]*>([^<]*)</a>é   rI   r   rK   )rc   r�   rŽ   rd   rŒ   r[   rX   r   rW   rY   r_   Úfinditerre   r`   ra   rb   )rM   rj   r   Úcleanr—   ÚbodyÚ	body_htmlÚclsrR   rD   ru   Ú
skip_wordsÚcontent_linesr   r|   Úurl_arL   r{   s                    @r   rT   rT   ˜   s1  ø€ à€LÜ�F‰FÐ4°b¸$Ó?€EÜ�F‰FÐ2°B¸Ó>€Eòô6 �F‰FÐ-Ð/@À%ÌrÏyÉyÔY€Eä�9‰9Ð3°UÓ;€DÚØ—J‘J˜q“Mˆ	ð Hò 	dˆCÜŸ™˜°Ñ4Ð7SÑSÐUWÐYbÓc‰Ið	dä�v‰v�j $¨	Ó2ˆÜ�v‰v�i  dÓ+ˆÜ�v‰v�i  dÓ+ˆØ$(§J¡J¨tÓ$4ÖK˜q¼¸A¿G¹G»I»ÈÓ8J�—‘•ÐKˆÐKò^ˆ
ð ˆØò 	+ˆDØ�zÑ!¤SÓ(G¸JÔ(GÔ%GØÜÓIÐ&HÔIÔIØÜ�4‹y˜1‹}Ø×$Ñ$ TÕ*ð	+ñ à!Ÿ;™; }°S°bÐ'9Ó:ˆLÜŸ6™6Ð";¸YÈÓUˆLà€KÜ�[‰[ÐnÐptÔvx×vzÑvzÓ{ò 9ˆØ—‘˜“
ˆØ�w‰w�q‹z×ÑÓ!ÒJ¤R§W¡W×%5Ñ%5°eÓ%<×%BÑ%BÀ3Ó%GÈÑ%JˆØ×Ñ D°Ñ7Õ8ð9ð
 ˜Ð$Ð$ùò/ Ls   Ä!I'Ä$I'c                 óæ  — g }t        j                  d| «      D ]Õ  }|j                  d«      }|j                  d«      j                  «       }d|vst	        |«      dk  rŒF|j                  d«      r
t        |z   }n|j                  d«      sŒs| |j                  «       |j                  «       dz    }t        j                  d	|«      }|r|j                  d«      nd
}|j                  |||f«       Œ× |S )zExtract articles from list pagez)<a[^>]*href="([^"]+)"[^>]*title="([^"]*)"r   r¦   Úpost_é
   rJ   Úhttpi,  z(\d{4}-\d{2}-\d{2})r„   )
rc   r§   rŒ   r   rX   r\   rf   Ústartrd   rY   )rj   Úarticlesr|   rH   r   ÚareaÚdmÚdates           r   Úextract_list_pager¸   Ü   sØ   € à€HÜ�[‰[ÐEÀtÓLò -ˆØ�w‰w�q‹zˆØ—‘˜“
× Ñ Ó"ˆØ˜$Ñ¤# e£*¨r¢/Øà�?‰?˜3ÔÜ˜d‘?‰DØ—‘ Ô(Øð �A—G‘G“I˜aŸg™g›i¨™mÐ,ˆÜ�Y‰YÐ-¨tÓ4ˆÙ ˆr�x‰x˜Œ{ bˆà�‰˜  dÐ+Õ,ð!-ð" €Or)   u!   Scraping å…´å®�å¸‚çŽ¯ä¿�ä¿¡æ�¯...r   r   z/zfjg/xnshjbhj/hbxx/index.htmlz/zfjg/xnshjbhj/hbxx/index_z.htmlr   r   z  Page z error: z: no articles, stoppingz
2023-01-01z<p><a href="z">z</a></p>rJ   z: z articles, new so far: z
Done! New: )1Ú__doc__rN   rc   r   Úsqlite3Útimer`   Úsysr   Úbs4r   ÚDB_PATHÚSCRIPT_NAMEr   ÚPROVINCErf   rP   ÚconnectÚconnÚcursorr
   r   r   r‚   rT   r¸   ÚprintÚ	new_itemsÚ	max_pagesÚrangeÚpagerM   rO   ri   rQ   rR   rj   r   r   r´   r   r   r·   r   r   ÚsavedrX   ÚcommitÚcloser2   r)   r   ú<module>rÌ      s  ðñ÷
 2× 1× 1Ó 1Ý Ý à
€Ø!€Ø$€	Ø€Ø(€ð ð  Dð€ð €w‡��wÓ€Ø
‡k�kƒm€Ø€	òòm,ò`B%òHñ. Ð)Ô *Ø€	Ø€	á�!�Y ‘]Ó#ò ![€DØˆq‚yØ�
Ð8Ð9‰à�
Ð4°T°F¸%Ð@ˆðØˆH�L‰L˜ g°rÔ:ˆØˆŒ
Ø�v‰vˆñ
 ! Ó&€HÙÙ�˜�vÐ4Ð5Ô6Ùà!)ò OÑˆˆx˜ÙØà�,ÒØñ %1°Ó$:Ñ!ˆ�kÙØ)¨(¨°2°e°W¸HÐEˆLá˜U H¨d°LÀ+ÓN‰ðOñ 
ˆG�D�6˜˜9˜+ R©¨H« Ð6MÌiÈ[Ð
YÕZðC![ðF ‡�„Ø ‡
�
„Ù ˆ”i�[Ð!Õ "øð7 ò Ù�˜�v˜X a SÐ)Ô*Ýûðús   Â(EÅE<Å#E7Å7E<