Ë
    òµ£j¼6  ã                   óú   — d Z ddlZddlZddlZddlmZ ddlZddlmZm	Z	 dZ
ej                  j                  ej                  j                  e«      «      ZdddœZdd	„Zd
„ Zd„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)uê   
é�‚æºªåŽ¿-ç”Ÿæ€�çŽ¯å¢ƒå±€é�‚æºªåˆ†å±€-æ”¿åŠ¡å…¬å¼€ çˆ¬è™«
Guangdong CMS, static HTML pagination: index_N.html
List: <li><a href="content/post_xxx.html">title</a><span.time>date</span>
Detail: <div class="content"> - tables preserved
é    N)Úurljoin)ÚBeautifulSoupÚNavigableStringz)http://www.suixi.gov.cn/bmxxgk/sthjj/zwgkz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36ztext/html,application/xhtml+xml)z
User-AgentÚAcceptc                 ó  — t        d«      D ])  }	 t        j                  | t        |¬«      }d|_        |c S  y # t
        $ r<}|dk  rt        j                  d«       nt        d| › d|› �«       Y d }~ y Y d }~Œmd }~ww xY w)Né   )ÚheadersÚtimeoutzutf-8é   z  [WARN] Failed to fetch ú: )	ÚrangeÚrequestsÚgetÚHEADERSÚencodingÚ	ExceptionÚtimeÚsleepÚprint)Úurlr
   ÚattemptÚrÚes        úcrawl_suixi_sthj.pyÚsafe_getr      sz   € Ü˜“8ò 
ˆð		Ü—‘˜S¬'¸7ÔCˆAØ ˆAŒJØŠHñ	
øô
 ò 	Ø˜Š{Ü—
‘
˜1•äÐ1°#°°b¸¸Ð<Ô=Ýô ûð	ús   �$9¹	A>Á,A9Á9A>c                 ó˜   — dD ]-  }t        j                  d|› d�d| t         j                  ¬«      } Œ/ t        j                  dd| «      } | S )zÆStrip inline formatting tags (<b>, <span>, <font>, <strong>, <em>, <u>)
    while preserving text content and block-level structure.
    Also remove their style/class attributes from remaining tags.)ÚbÚstrongÚspanÚfontÚemÚiÚuÚsÚsubÚsupÚsmallÚmarkz</?z[^>]*>Ú ©Úflagsz.\s+(style|class|lang|dir|align|valign)="[^"]*")Úrer%   ÚI)Ú	html_textÚtags     r   Ústrip_inline_tagsr0   $   sR   € ð
 cò JˆÜ—F‘F˜c #  fÐ-¨r°9ÄBÇDÁDÔI‰	ðJô —‘ÐHÈ"ÈiÓX€IØÐó    c           
      ó*  ‡— g }| j                   D �]2  }t        |dd«      }|dk(  r,|j                  t        |«      «       |j                  d«       ŒB|dk(  rf|j	                  d«      }|r|j                  t        |«      «       n&|j                  dd¬«      }|r|j                  |«       |j                  d«       Œ­|d	v �rÇ|j	                  d«      }|�rÉg }|j                   D �]Y  }t        |dd«      dk(  r,|j                  t        |«      «       |j                  d«       Œ@t        |dd«      dk(  rf|j	                  d«      }	|	r|j                  t        |	«      «       n&|j                  dd¬«      }
|
r|j                  |
«       |j                  d«       Œ¶t        |t        «      r.t        |«      j                  «       }	|	sŒâ|j                  |	«       Œôt        |«      }t        j                  d
d|t        j                  ¬«      }t        |d«      }|j                  dd¬«      }	|	s�ŒI|j                  |	«       �Œ\ |s�Œ5dj                  |«      }t        j                  dd|«      j                  «       }|j                  |«       |j                  d«       �Œ�t        |«      }t        j                  d
d|t        j                  ¬«      }t        |d«      }|j                  dd¬«      }|s�Œät        j                  dd|«      j                  «       }|j                  d«      }|D ]6  }|j                  dd«      }|sŒ|j                  dt!        ||«      › d�«       Œ8 |j                  |«       |j                  d«       �Œy|dk(  rU|j                  dd¬«      D ],  }|j                  dd¬«      }|sŒ|j                  d|› �«       Œ. |j                  d«       �ŒÓ|dk(  rU|j                  dd¬«      D ],  }|j                  dd¬«      }|sŒ|j                  d|› �«       Œ. |j                  d«       �Œ-|dk(  r§|j                  dd«      Š|j                  dd¬«      }d‰j#                  «       v st%        ˆfd„dD «       «      r$|j                  d|› d t!        |‰«      › d�«       �Œ¡|s�Œ¥t'        |«      d!kD  s�Œµ|j                  |«       |j                  d«       �ŒÙ|€Qt        |«      j                  «       }	|	s�Œøt'        |	«      d"kD  s�Œ|j                  |	«       |j                  d«       �Œ,|d#k(  s�Œ3�Œ5 dj                  |«      j                  «       }t        j                  d$d|«      }t        j                  d%d|«      }|S )&z=Convert content div to structured text with tables preserved.ÚnameNÚtableú

Úcenterú T©Ústrip)ÚpÚdivz;</?(?:span|b|strong|font|em|i|u|s|sub|sup|small|mark)[^>]*>r)   r*   úhtml.parserz\s+ÚimgÚsrcz	![image](z)

ÚolÚliF)Ú	recursivez  Úulz- ÚaÚhrefÚuploadc              3   ó\   •K  — | ]#  }‰j                  «       j                  |«      –— Œ% y ­w)N)ÚlowerÚendswith)Ú.0ÚextrD   s     €r   ú	<genexpr>z&content_div_to_text.<locals>.<genexpr>”   s(   øè ø€ ò  /AÈc¨t¯z©z«|×/DÑ/DÀS×/Iñ  /Aùs   ƒ),)z.docz.docxz.pdfz.xlsz.xlsxú[z](é
   é   Ústylez\n{4,}z {3,})ÚchildrenÚgetattrÚappendÚstrÚfindÚget_textÚ
isinstancer   r9   r,   r%   r-   r   ÚjoinÚfind_allr   r   rG   ÚanyÚlen)Úcontent_divÚpage_urlÚpartsÚchildr3   Úinner_tableÚtxtÚ	txt_partsr%   ÚtÚtsÚsub_htmlÚ	clean_subÚ
child_htmlÚ
clean_soupÚimgsr=   r>   r@   Úli_textÚtextÚresultrD   s                         @r   Úcontent_div_to_textrl   /   sÕ  ø€ à€Eà×%Ñ%ó lˆÜ�u˜f dÓ+ˆà�7Š?à�L‰Lœ˜U›Ô$Ø�L‰L˜Õ Ø�XÒàŸ*™* WÓ-ˆKÙØ—‘œS Ó-Õ.à—n‘n S°�nÓ5�ÙØ—L‘L Ô%Ø�L‰L˜Õ Ø�\Ò!àŸ*™* WÓ-ˆKÚð �	Ø Ÿ>™>ó 0�CÜ˜s F¨DÓ1°WÒ<ØŸ™¤S¨£XÔ.ØŸ™ VÕ,Ü   f¨dÓ3°xÒ?ØŸH™H WÓ-˜ÙØ!ŸL™L¬¨Q«Õ0à!$§¡¨c¸ Ó!>˜BÙ!Ø )× 0Ñ 0°Ô 4ØŸ™ VÕ,Ü# C¬Ô9Ü ›HŸN™NÓ,˜ÚØ%×,Ñ,¨QÕ/ô $' s£8˜Ü#%§6¡6ØZØ ´·±ô$˜ô %2°(¸MÓ$J˜	Ø%×.Ñ.¨s¸$Ð.Ó?˜ÛØ%×,Ñ,¨QÖ/ð70ó8 àŸ(™( 9Ó-�CäŸ&™& ¨¨cÓ2×8Ñ8Ó:�CØ—L‘L Ô%Ø—L‘L Ö(ô ! ›Z�
ÜŸV™VØRØ˜
¬"¯$©$ô�
ô +¨:°}ÓE�
Ø ×)Ñ)¨#°TÐ)Ó:�ÛäŸ&™& ¨¨cÓ2×8Ñ8Ó:�Cð !Ÿ>™>¨%Ó0�DØ#ò T˜Ø!Ÿg™g e¨RÓ0˜ÚØ!ŸL™L¨9´W¸XÀsÓ5KÐ4LÈEÐ)RÕSðTð
 —L‘L Ô%Ø—L‘L Ö(Ø�TŠ\Ø—n‘n T°U�nÓ;ò 1�ØŸ+™+ c°˜+Ó6�ÚØ—L‘L 2 g Y Õ0ð1ð �L‰L˜Ö Ø�TŠ\Ø—n‘n T°U�nÓ;ò 1�ØŸ+™+ c°˜+Ó6�ÚØ—L‘L 2 g Y Õ0ð1ð �L‰L˜Ö Ø�SŠ[Ø—9‘9˜V RÓ(ˆDØ—>‘> #¨T�>Ó2ˆDØ˜4Ÿ:™:›<Ñ'¬3ó  /AÐUô  /Aô  ,AØ—‘˜q   b¬°¸4Ó)@Ð(AÀÐGÖHÛœ#˜d›) bœ.Ø—‘˜TÔ"Ø—‘˜VÖ$Øˆ\Ü�E“
× Ñ Ó"ˆAÛ”S˜“V˜a”ZØ—‘˜Q”Ø—‘˜VÖ$Ø�WŒ_ÙðYlð\ �W‰W�U‹^×!Ñ!Ó#€FÜ�V‰V�I˜v vÓ.€Fä�V‰V�H˜d FÓ+€FØ€Mr1   c                 ó   — t        | «      }|syt        |j                  d«      }|j                  d«      }|r|j	                  d¬«      nd}|j                  dd¬	«      }|sd
D ]  }|j                  d|¬	«      }|sŒ n |s5|j                  dt        j                  dt
        j                  «      ¬«      }d}|rt        || «      }n|j	                  dd¬«      }d}|j                  g d¢t        j                  dt
        j                  «      ¬	«      D ][  }	t        j                  d|	j	                  «       «      }
|
sŒ*|
j                  d«      j                  dd«      j                  dd«      } n |s˜|j                  d«      D ]„  }|j                  dd«      j                  «       }|dv sŒ(|j                  dd«      }t        j                  d|«      }
|
sŒS|
j                  d«      j                  dd«      j                  dd«      } n |||fS )N)NNNr<   ÚtitleTr8   r)   r;   Úcontent©Úclass_)ro   ÚarticleÚmainrj   ÚCustom_UnionÚ
TRS_Editorzcontent|article|zoom)Úidr5   )r   r;   r:   Útdz!(?:date|time|publish|source|info)z!(\d{4}[-/\.]\d{1,2}[-/\.]\d{1,2})é   ú/ú-ú.Úmetar3   )ÚpublishdateÚpubdateÚdateÚpubDate)r   r   rj   rT   rU   r,   Úcompiler-   rl   rX   ÚsearchÚgroupÚreplacer   rG   )r   r   ÚsoupÚ	title_tagrn   r[   Úclsro   r   r/   Úmr|   r3   Úds                 r   Úparse_detailrŠ   §   sì  € Ü�‹€AÙØä˜Ÿ™ Ó/€Dð —	‘	˜'Ó"€IÙ.7ˆI×Ñ TÐÔ*¸R€Eð —)‘)˜E¨)�)Ó4€KÙØWò 	ˆCØŸ)™) E°#˜)Ó6ˆKÚÙð	ñ Ø—i‘i ¬"¯*©*Ð5LÌbÏdÉdÓ*S�iÓTˆà€GÙÜ% k°3Ó7‰ð —-‘- ¨d�-Ó3ˆð €DØ�}‰}Ò7ÄÇ
Á
ÐKoÔqs×quÑquÓ@vˆ}Ówò ˆÜ�I‰IÐ:¸C¿L¹L»NÓKˆÚØ—7‘7˜1“:×%Ñ% c¨3Ó/×7Ñ7¸¸SÓAˆDÙð	ñ Ø—M‘M &Ó)ò 	ˆDØ—8‘8˜F BÓ'×-Ñ-Ó/ˆDØÐDÒDØ—H‘H˜Y¨Ó+�Ü—I‘IÐBÀAÓF�ÚØŸ7™7 1›:×-Ñ-¨c°3Ó7×?Ñ?ÀÀSÓI�DÙð	ð �'˜4ÐÐr1   c                 óf  — t        | «      }|sg S t        |j                  d«      }g }|j                  d«      D �]t  }d }|j                  dd¬«      D ]   }|d   j	                  «       }|sŒd|v sŒ|} n |sŒ?t        |«      }t        j                  dd	|t        j                  t        j                  z  ¬
«      }t        |d«      j                  d¬«      }	|d   j	                  «       }
t        |	«      dk  rŒÀ|
j                  d«      rt        t        |
«      }
n|
j                  d«      st        | |
«      }
d	}|j                  dd¬«      }|r|j                  d¬«      }|s7t        j                   d|j                  «       «      }|r|j#                  d«      }|j%                  |	|
|f«       �Œw |S )Nr<   r@   rC   T)rD   rD   zcontent/post_z(<span[^>]*class="?time"?[^>]*>.*?</span>r)   r*   r8   r   ry   Úhttpr   r   rp   z(\d{4}-\d{1,2}-\d{1,2})rx   )r   r   rj   rX   r9   rS   r,   r%   r-   ÚDOTALLrU   rZ   Ú
startswithr   ÚBASE_URLrT   r‚   rƒ   rR   )r   r   r…   Úitemsr@   rC   r/   ÚhÚ
title_htmlrn   rD   r   Ú	time_spanrˆ   s                 r   Úparse_list_pager”   ×   sŸ  € Ü�‹€AÙØˆ	ä˜Ÿ™ Ó/€DØ€Eà�m‰m˜DÓ!ó '*ˆàˆØ—;‘;˜s¨�;Ó.ò 	ˆCØ�F‘×!Ñ!Ó#ˆAÚ�_¨Ò)Ø�Ùð		ñ
 Øô ˜“Vˆ
ä—V‘VÐGÈÈZÔ_a×_cÑ_cÔdf×dmÑdmÑ_mÔnˆ
Ü˜j¨-Ó8×AÑAÈÐAÓMˆà�‰y�‰Ó ˆäˆu‹:˜Š>Øð �?‰?˜3ÔÜœ8 TÓ*‰DØ—‘ Ô(Ü˜3 Ó%ˆDð ˆØ—G‘G˜F¨6�GÓ2ˆ	ÙØ×%Ñ%¨DÐ%Ó1ˆDÙÜ—	‘	Ð4°b·k±k³mÓDˆAÙØ—w‘w˜q“z�à�‰�e˜T 4Ð(Ö)ðO'*ðR €Lr1   c                  ó  — dd l } dd l}t        |j                  «      dkD  r5|j                  d   j	                  «       rt        |j                  d   «      nd }|�t        dt        |«      z   «       ddt        j                  j                  t        d«      g}d }|D ]%  }t        j                  j                  |«      sŒ#|} n |sd}t        d«       g }d}d}||k  rš|r||k\  rn’|dk(  r
t        d	z   }	nt        › d
|› d�}	t        d|› d|	› �«       t        |	«      }
|
st        d|› d�«       nIt        dt        |
«      › d�«       |j                  |
«       |dz  }t!        j"                  d«       ||k  rŒšt        dt        |«      › d�«       |st        d«       y t%        dd«      5 }|D ]!  \  }}}|j'                  d|› d|› d|› d�«       Œ# 	 d d d «       | j)                  |d¬«      }|j+                  d«       |j+                  d«       |j+                  d «       d!}d}d}d}t-        |«      D �]1  \  }\  }}}|j+                  d"|f«      j/                  «       }|r|dz  }Œ4t1        |«      \  }}}|s*|dz  }|d#kD  rt        d$«        nÙt        d%|d d › d&�«       Œo|xs |}|xs |}t        |«      d'kD  r|d d' n|}	 |j+                  d(|||||f«       |j+                  d"|f«      j/                  «       }|j3                  «        |dz  }|dz   d*z  dk(  r4t        d+|dz   › d	t        |«      › d,|› d-|› d.�	«       |j3                  «        t!        j"                  d«       �Œ4 |j3                  «        |j9                  «        t        d/«       t        d0|› d	t        |«      › d1�«       t        d2|› �«       t        d3|› �«       y # 1 sw Y   �ŒûxY w# t4        $ r(}t        d)|› �«       |j7                  «        Y d }~Œód }~ww xY w)4Nr   rx   z[AutoPg] max_pages=z/root/search.dbz/root/gov_crawler/search.dbz	search.dbu:   === é�‚æºªåŽ¿-ç”Ÿæ€�çŽ¯å¢ƒå±€é�‚æºªåˆ†å±€-æ”¿åŠ¡å…¬å¼€ ===é2   ry   z/index_z.htmlz  Fetching page r   z  Empty page z
, stoppingz
    Found z itemsg333333Ó?z

  Total: z items
zNo items found, exiting.z/tmp/suixi_items.txtÚwrL   z] z
  r5   é<   )r
   zPRAGMA journal_mode=WALzPRAGMA synchronous=OFFzî
        CREATE TABLE IF NOT EXISTS gov_raw (
            id INTEGER PRIMARY KEY,
            title TEXT,
            content TEXT,
            page_url TEXT UNIQUE,
            publish_date TEXT,
            site_name TEXT
        )
    u&   é�‚æºªåŽ¿-ç”Ÿæ€�çŽ¯å¢ƒå±€-æ”¿åŠ¡å…¬å¼€z)SELECT id FROM gov_raw WHERE page_url = ?rN   z  Too many errors, stoppingz  [WARN] Empty content: z - skippingi ¡ zhINSERT OR IGNORE INTO gov_raw (title, content, page_url, publish_date, site_name) VALUES (?, ?, ?, ?, ?)z  [DB ERROR] rM   z  Progress: z (inserted=z
, skipped=ú)z)
========================================z
Inserted: z newzSkipped (already exist): zErrors: )Úsqlite3ÚsysrZ   ÚargvÚisdigitÚintr   rS   ÚosÚpathrW   Ú
SCRIPT_DIRÚexistsr�   r”   Úextendr   r   ÚopenÚwriteÚconnectÚexecuteÚ	enumerateÚfetchonerŠ   Úcommitr   ÚrollbackÚclose) rš   Ú_SYSÚ_MAX_PGÚdb_pathsÚdb_pathr:   Ú	all_itemsÚpage_numÚ	max_pagesr   r�   Úfrb   r‘   r‰   ÚdbÚ	site_nameÚinsertedÚskippedÚerrorsÚidxrn   rD   Ú	list_dateÚexistingÚdetail_titlero   Údetail_dateÚfinal_titleÚ
final_dateÚrowidr   s                                    r   rs   rs   
  sA  € ÛÛÜ#& t§y¡y£>°AÒ#5¸$¿)¹)ÀA¹,×:NÑ:NÔ:PŒc�$—)‘)˜A‘,ÔÐVZ€GØÐÜÐ#¤c¨'£lÑ2Ô3ð
 	Ø%Ü
�‰�‰”Z Ó-ð€Hð
 €GØò ˆÜ�7‰7�>‰>˜!ÕØˆGÙðñ Ø#ˆä	ÐFÔHð €IØ€HØ€Ià
�iÒ
Ù�x 7Ò*¨EØ�qŠ=Ü˜S‘.‰Cä�J˜g h Z¨uÐ5ˆCäÐ   
¨"¨S¨EÐ2Ô3Ü Ó$ˆÙÜ�M ( ¨:Ð6Ô7Øä�
œ3˜u›:˜, fÐ-Ô.Ø×Ñ˜ÔØ�A‰ˆÜ�
‰
�3Œð! �iÓ
ô$ 
ˆKœ˜I›Ð' xÐ
0Ô1áÜÐ(Ô)Øô 
Ð$ cÓ	*ð -¨aØ ò 	-‰GˆAˆq�!Ø�G‰G�a˜�s˜"˜Q˜C˜t A 3 dÐ+Õ,ñ	-÷-ð
 
�‰˜¨"ˆÓ	-€BØ‡J�JÐ(Ô)Ø‡J�JÐ'Ô(à‡J�Jð 	ô 		ð 9€IØ€HØ€GØ€Fä)2°9Ó)=ó $Ñ%ˆÑ%ˆe�T˜9Ø—:‘:ÐIÈDÈ7ÓS×\Ñ\Ó^ˆÙØ�q‰LˆGØä-9¸$Ó-?Ñ*ˆ�g˜{ÙØ�a‰KˆFØ˜ŠzÜÐ3Ô4ÙÜÐ,¨U°3°B¨Z¨L¸ÐDÔEØà"Ò+ eˆØ Ò- Iˆ
ä&)¨'£l°VÒ&;�'˜'˜6Ñ"Àˆð
	Ø�J‰JØzØ˜g t¨Z¸ÐCôð —J‘JÐJÈTÈGÓT×]Ñ]Ó_ˆEØ�I‰IŒKØ˜‰MˆHð
 �!‰G�r‰>˜QÒÜ�L  Q¡  q¬¨Y«Ð(8¸ÀHÀ:ÈZÐX_ÐW`Ð`aÐbÔcØ�I‰IŒKä�
‰
�3ŽðI$ðL ‡I�I„Kð
 ‡H�H„Jä	Ð6Ô8Ü	ˆJ�x�j ¤# i£.Ð!1°Ð
6Ô7Ü	Ð% g YÐ
/Ô0Ü	ˆH�V�HÐ
Õ÷U-ñ -ûôl ò 	Ü�M ! Ð%Ô&Ø�K‰K�M‰Mûð	ús%   Æ*'OËAOÏOÏ	P	Ï!PÐP	Ú__main__)é   )Ú__doc__r,   r   rŸ   Úurllib.parser   r   Úbs4r   r   r�   r    ÚdirnameÚabspathÚ__file__r¡   r   r   r0   rl   rŠ   r”   rs   Ú__name__© r1   r   ú<module>rÌ      s‡   ðñ÷ Ó Ý  Û ß .à6€Ø�W‰W�_‰_˜RŸW™WŸ_™_¨XÓ6Ó7€
ð QØ/ñ€ó
ò	òvòp. ò`1òf@ðD ˆzÒÙ…Fð r1   