Ë
    ¸¬ujV$  ã                   ó°   — 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Z
dZdd	iZd
ZdZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)uK  
å›ºåŽŸå¸‚ - çŽ¯ä¿�å…¬ç¤º çˆ¬è™«
URL: https://www.nxgy.gov.cn/zwgk/zfxxgkml/jgzn_38938/hjbh/hbgs/
CMS: TRS (createPageHTMLåˆ†é¡µ)
åˆ—è¡¨: ul.pageList.newsList > li > a + span
åˆ†é¡µ: index.html (p1) / index_{N-1}.html (page N), 25é¡µ
è¯¦æƒ…: ./YYYYMM/tYYYYMMDD_XXXXXX.html
æ­£æ–‡: div.view.TRS_UEDITOR
æ—¥æœŸ: div.xl_con_qt_l span
é    N)ÚBeautifulSoup)Úurljoinz;https://www.nxgy.gov.cn/zwgk/zfxxgkml/jgzn_38938/hjbh/hbgs/u   å›ºåŽŸå¸‚-çŽ¯ä¿�å…¬ç¤ºu   å®�å¤�z
User-Agentz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36é   g      ð?z/root/search.dbc           	      óÊ   — t        j                  d| «      }|rK|j                  d«      › dt        |j                  d«      «      d›dt        |j                  d«      «      d›�S y)Nz(\d{4})-(\d{1,2})-(\d{1,2})é   ú-é   Ú02dé   Ú )ÚreÚsearchÚgroupÚint)ÚtextÚms     ú/root/gov_crawler/crawl_nxgy.pyÚ
parse_dater      sV   € Ü
�	‰	Ð0°$Ó7€AÙØ—'‘'˜!“*�˜Qœs 1§7¡7¨1£:›¨sÐ3°1´S¸¿¹À»³_ÀSÐ4IÐJÐJØó    c                 óü   — t        d«      D ]R  }	 t        j                  | t        t        d¬«      }d|_        |j                  dk(  rt        |j                  d«      c S ŒT y #  t        j                  d«       Y ŒoxY w)Nr   F)ÚheadersÚtimeoutÚverifyzutf-8éÈ   zhtml.parserr	   )ÚrangeÚrequestsÚgetÚHEADERSÚTIMEOUTÚencodingÚstatus_coder   r   ÚtimeÚsleep)ÚurlÚretryÚresps      r   Úget_soupr'       sp   € Ü�q“ò ˆð	Ü—<‘< ¬W¼gÈeÔTˆDØ#ˆDŒMØ×Ñ 3Ò&Ü$ T§Y¡Y°Ó>Ò>ð 'ð	ð øð	Ü�J‰J�qŽMús   �AA"Á"A;c                 ó  — t        | «      }d}|ro|j                  d«      D ][  }|j                  sŒd|j                  v sŒt        j                  d|j                  «      }|sŒBt        |j                  d«      «      }Œ] ||fS )z*Get list page soup and extract total pagesr   ÚscriptÚcreatePageHTMLzcreatePageHTML\((\d+)r   )r'   Úfind_allÚstringr   r   r   r   )r$   ÚsoupÚtotal_pagesÚsr   s        r   Úget_list_soupr0   +   st   € ä�C‹=€DØ€KÙØ—‘˜xÓ(ò 	2ˆAØ�x‹xÐ,°·±Ò8Ü—I‘IÐ6¸¿¹ÓA�ÚÜ"% a§g¡g¨a£j£/‘Kð		2ð
 �ÐÐr   c                 ó  — | dk(  rt         }nt         › d| dz
  › d�}t        |«      \  }}|sg S g }|j                  dd¬«      }|s|j                  dd¬«      }|s|S |j                  dd	¬
«      D ]–  }|j                  d«      }|r|j	                  d«      sŒ(t        t         |d   «      }|j                  j                  «       }	|	sŒXd}
|j                  d«      }|rt        |j                  «      }
|j                  |	||
dœ«       Œ˜ |S )Nr   Úindex_z.htmlÚulÚpageList©Úclass_ÚnewsListÚliF©Ú	recursiveÚaÚhrefr   Úspan)Útitler$   Údate)
ÚBASE_URLr0   Úfindr+   r   r   r   Ústripr   Úappend)Úpage_numr$   r-   Ú_Úitemsr3   r8   r;   r<   r>   Údate_strÚ	date_spans               r   Ú
fetch_pagerI   7   s  € Ø�1‚}Ü‰ä�
˜& ¨!¡ ¨EÐ2ˆä˜CÓ �G€Dˆ!ÙØˆ	à€EØ	�‰�4 
ˆÓ	+€BÙØ�Y‰Y�t JˆYÓ/ˆÙØˆà�k‰k˜$¨%ˆkÓ0ò ˆØ�G‰G�C‹LˆÙ˜Ÿ™˜fœØÜ”x  6¡Ó+ˆØ—‘—‘“ˆÙØàˆØ—G‘G˜F“Oˆ	ÙÜ! )§.¡.Ó1ˆHà�‰ØØØñ
õ 	ðð( €Lr   c                  ó*   — t        t        «      \  } }|S )N)r0   r@   )r-   Útotals     r   Úget_total_pagesrL   ^   s   € Ü¤Ó)�K€Dˆ%Ø€Lr   c           
      ó  — d}| j                  d«      }|r?|j                  j                  «       }t        j                  dd|«      j                  «       }d}| j                  dd¬«      }|rH|j                  d«      D ]4  }|j                  j                  «       }d|v sd	|v sŒ&t        |«      }|sŒ4 n g }g }| j                  dd
„ ¬«      }	|	�rì|	j                  D �]\  }
|
j                  s?t        |
«      j                  «       }|r#t        d„ |D «       «      s|j                  |«       ŒO|
j                  j                  «       }|dv �rt        d„ |
j                  d¬«      D «       «      }|rÑ|
j                  D ]À  }|j                  s-t        |«      j                  «       }|r|j                  |«       Œ<|j                  dk(  r|j                  t        |«      «       Œf|j                  dv r'|j                  d¬«      }|sŒ‰|j                  |«       Œ›|j                  d¬«      }|sŒ°|j                  |«       ŒÂ �Œc|
j                  d¬«      }|s�Œy|j                  |«       �ŒŒ|dk(  r|j                  t        |
«      «       �Œ­|dk(  rP|
j                  dd«      }|
j                  dd«      }|s�ŒÚ|j                  d|› dt!        t"        |«      › d�«       �Œ|dv r)|
j                  d¬«      }|s�Œ|j                  |«       �Œ/|dk(  r�Œ6|
j                  d¬«      }|s�ŒL|j                  |«       �Œ_ |	j                  dd¬«      D ]j  }|d   }t        j$                  d|j                  «       «      sŒ-|j                  d|j                  j                  «       › dt!        t"        |«      › d�«       Œl t'        «       }g }|D ].  }|d d  }||vsŒ|j)                  |«       |j                  |«       Œ0 |d!j+                  |«      ||fS )"Nr   r>   z,_\u56fa\u539f\u5e02\u4eba\u6c11\u653f\u5e9c$ÚdivÚxl_con_qt_lr5   r=   u   å�‘è¡¨æ—¥æœŸu   å�‘å¸ƒc                 ó   — | xr d| v S )NÚTRS_UEDITOR© )Úcs    r   ú<lambda>z!extract_content.<locals>.<lambda>v   s   € ¨1Ò+C°À!Ð1C€ r   c              3   ó$   K  — | ]  }|d v –— Œ
 y­w)u	    
	ã€€Â NrR   ©Ú.0rS   s     r   ú	<genexpr>z"extract_content.<locals>.<genexpr>|   s   è ø€ Ò#KÀ AÐ)<Ô$<Ñ#Kùs   ‚)ÚprN   c              3   ó8   K  — | ]  }|j                   d v –— Œ y­w))ÚtablerN   r3   ÚolN)ÚnamerV   s     r   rX   z"extract_content.<locals>.<genexpr>�   s   è ø€ ÒiÀA˜Ÿ™Ð#?Ô?Ñiùó   ‚Fr9   r[   T)rB   ÚimgÚsrcÚaltz![z](ú))r3   r\   Úbrr;   )r<   r<   z3\.(pdf|doc|docx|xls|xlsx|zip|rar|ceb|ofd|ppt|pptx)$ú[éd   ú

)rA   r   rB   r   Úsubr+   r   Úchildrenr]   ÚstrÚallrC   ÚlowerÚanyÚget_textr   r   r@   r   ÚsetÚaddÚjoin)r-   r>   ÚtÚpub_dateÚdate_divr=   ÚtxtÚpartsÚattachmentsÚcdÚchildr   ÚtagÚhbrg   Ústr`   ra   r;   ÚhÚseenÚuprY   Úks                           r   Úextract_contentr€   b   s’  € Ø€EØ�	‰	�'Ó€AÙØ—‘—‘“ˆÜ—‘ÐFÈÈEÓR×XÑXÓZˆà€HØ�y‰y˜ }ˆyÓ5€HÙØ×%Ñ% fÓ-ò 	ˆDØ—)‘)—/‘/Ó#ˆCØ)¨SÑ0°NÀcÒ4IÜ% c›?�ÚÙð	ð €EØ€Kà	�‰�5Ñ!CˆÓ	D€Bâ	Ø—[‘[ó .	&ˆEØ—:’:Ü˜5“z×'Ñ'Ó)�Ù¤Ñ#KÀdÔ#KÔ KØ—L‘L Ô&ØØ—*‘*×"Ñ"Ó$ˆCØ�lÒ"ÜÑiÈÏÉÐbgÈÓIhÔiÓi�ÙØ$Ÿ~™~ò 0˜Ø"ŸxšxÜ # C£§¡Ó 0˜AÙ Ø %§¡¨Q¤Ø$ØŸ8™8 wÒ.Ø!ŸL™L¬¨S«Õ2Ø ŸX™X¨Ñ5Ø!$§¡°D Ó!9˜BÚ!Ø %§¡¨RÕ 0à #§¡°4 Ó 8˜AÚ Ø %§¡¨Q¥ò0ð"  Ÿ.™.¨t˜.Ó4�CÛØŸ™ SÖ)Ø˜’Ø—‘œS ›ZÖ(Ø˜’Ø—i‘i  rÓ*�Ø—i‘i  rÓ*�ÛØ—L‘L 2 c U¨"¬W´X¸sÓ-CÐ,DÀAÐ!FÖGØ˜Ñ$Ø—n‘n¨4�nÓ0�ÛØ—L‘L Ö%Ø˜’Ùà—n‘n¨4�nÓ0�ÛØ—L‘L Ö%ð].	&ð` —‘˜S t�Ó,ò 	RˆAØ�&‘	ˆAÜ�y‰yÐOÐQR×QXÑQXÓQZÕ[Ø×"Ñ" Q q§v¡v§|¡|£~Ð&6°b¼ÄÈ1Ó9MÐ8NÈaÐ#PÕQð	Rô
 ‹5€DØ	€BØò ˆØˆdˆsˆGˆØ�DŠ=Ø�H‰H�QŒKØ�I‰I�a�Lð	ð �&—+‘+˜b“/ 8¨[Ð8Ð8r   c                  óÚ   — dd l } | j                  t        «      }|j                  «       }|j	                  d«       |j	                  d«       |j                  «        |j                  «        y )Nr   a  CREATE TABLE IF NOT EXISTS gov_raw (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        page_url TEXT, title TEXT, content TEXT, publish_date TEXT,
        site_name TEXT, summary TEXT, attachments TEXT, date_rank TEXT,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    )zJCREATE INDEX IF NOT EXISTS idx_gov_raw_url ON gov_raw(page_url, site_name))Úsqlite3ÚconnectÚDB_PATHÚcursorÚexecuteÚcommitÚclose)r‚   ÚconnrS   s      r   Úinit_dbrŠ   ¸   sP   € ÛØ�?‰?œ7Ó#€DØ�‰‹€AØ‡I�Ið 	ô 
ð ‡I�IÐ^Ô_Ø‡K�K„MØ‡J�J…Lr   c                 óv  — dd l }|j                  t        «      }|j                  «       }d}| D ]a  }|d   r|d   d d nd}	 |j	                  d|d   |d   |d   |d   t
        ||d	   rd
j                  |d	   «      nd|d   xs df«       |dz  }Œc |j                  «        |j                  «        |S #  Y ŒŠxY w)Nr   Úcontentr   r   z´INSERT OR REPLACE INTO gov_raw 
                (page_url, title, content, publish_date, site_name, summary, attachments, date_rank)
                VALUES (?, ?, ?, ?, ?, ?, ?, ?)r$   r>   rr   rv   ú
z
0000-00-00r   )	r‚   rƒ   r„   r…   r†   Ú	SITE_NAMErp   r‡   rˆ   )rF   r‚   r‰   rS   ÚnÚitemÚsummarys          r   Ú
save_to_dbr’   Æ   sÛ   € ÛØ�?‰?œ7Ó#€DØ�‰‹€AØ	€AØò ˆØ+/°	ª?�$�y‘/ $ 3Ñ'Àˆð	Ø�I‰Ið 3ð �U‘˜T '™]¨D°©O¸TÀ*Ñ=MÜ˜7Ø26°}Ò2E�—	‘	˜$˜}Ñ-Ô.È2Ø�ZÑ Ò0 Lð	5ôð �‰F‰Aðð 	‡K�K„MØ‡J�J„LØ€Høð		Ùús   ÁAB4Â4B8c                  óÖ  — dd l } | j                  «       }|j                  dt        d¬«       |j                  dd¬«       |j	                  «       }t        «        t        dt        › d�«       t        «       }t        d	|› �«       |j                  dk(  r|nt        |j                  |«      }t        d
|› �«       g }t        d|dz   «      D �]X  }t        |«      }|st        d|› d|› d�«       Œ$t        d|› d|› dt        |«      › d�«       t        |«      D �]  \  }}	t        dt        |«      dz   › d|	d   d d › d�«       t        |	d   «      }
|
s-|j!                  t#        |	d|	d   g ¬«      «       t        d«       Œht%        |
«      \  }}}}|j!                  |xs |	d   |	d   ||xs |	d   |dœ«       |rCt        dt        |j'                  t)        d«      t)        d«      z   «      «      › d|rdnd › �«       nt        d!«       t+        j,                  t.        «       �Œ �Œ[ t        |«      }t1        d"„ |D «       «      }t1        d#„ |D «       «      }t1        d$„ |D «       «      t3        |d«      z  }t        d%«       t        d&|› �«       |rt        d'|› d||z  d(z  d)›d*�«       t        d+|d)›�«       t        d,|› �«       |j4                  st        d-t7        |«      › �«       y y ).Nr   z--pages)ÚtypeÚdefaultz	--skip-dbÚ
store_true)Úactionz===== z =====zTotal pages: zWill fetch: r   z

--- Page ú/z --- no itemsz (z items) ---z  [z] r>   é(   z...r$   r   r?   )rŒ   rr   rv   z    FAIL)r>   r$   rŒ   rr   rv   z    seg=é
   z
 | attach=ÚYESÚnoz    WARN emptyc              3   ó,   K  — | ]  }|d    sŒ	d–— Œ y­w)rŒ   r   NrR   ©rW   Úis     r   rX   zmain.<locals>.<genexpr>  s   è ø€ Ò2�1 Q y£\ŒQÑ2ùs   ‚
�c              3   ó8   K  — | ]  }t        |d    «      –— Œ y­w)rv   N)Úlenrž   s     r   rX   zmain.<locals>.<genexpr>  s   è ø€ Ò6 qŒS��=Ñ!×"Ñ6ùr^   c              3   ób   K  — | ]'  }|d    sŒ	t        |d    j                  d«      «      –— Œ) y­w)rŒ   rf   N)r¡   Úsplitrž   s     r   rX   zmain.<locals>.<genexpr>  s*   è ø€ ÒQ°!ÀAÀiÃLŒc�!�I‘,×$Ñ$ VÓ,×-ÑQùs   ‚
/�"/z
===== DONE =====zTotal: zWith body: re   z.1fz%)z	Avg seg: zAttachments: z
Imported: )ÚargparseÚArgumentParserÚadd_argumentr   Ú
parse_argsrŠ   ÚprintrŽ   rL   ÚpagesÚminr   rI   r¡   Ú	enumerater'   rC   Údictr€   r£   Úchrr"   r#   ÚDELAYÚsumÚmaxÚskip_dbr’   )r¤   ÚparserÚargsr.   r©   Ú	all_itemsÚpageÚ
page_itemsÚidxr�   Údsr>   rŒ   rr   rv   rq   ÚwbÚtaÚavgs                      r   Úmainr¼   Ý   së  € ÛØ×$Ñ$Ó&€FØ
×Ñ˜	¬°QÐÔ7Ø
×Ñ˜¨LÐÔ9Ø×ÑÓ€Dä„IÜ	ˆF”9�+˜VÐ
$Ô%ä!Ó#€KÜ	ˆM˜+˜Ð
'Ô(àŸ:™:¨š?‰K´°D·J±JÀÓ0L€EÜ	ˆL˜˜Ð
 Ô!à€IÜ�a˜ ™Ó#ó ˆÜ Ó%ˆ
ÙÜ�K ˜v Q u g¨]Ð;Ô<Øä�˜D˜6  5 '¨¬C°
«OÐ+<¸KÐHÔIÜ" :Ó.ó 	‰IˆC�Ü�Cœ˜I› qÑ(Ð)¨¨D°©M¸#¸2Ð,>Ð+?¸sÐCÔDä˜$˜u™+Ó&ˆBÙØ× Ñ ¤ d°BÀÀfÁÐ[]Ô!^Ô_Ü˜Ô"Øä4CÀBÓ4GÑ1ˆE�7˜H kØ×ÑØÒ/ $ w¡-Ø˜E‘{Ø"Ø$Ò4¨¨V©Ø*ñô ñ Ü˜¤ W§]¡]´3°r³7¼3¸r»7±?Ó%CÓ!DÐ EÀZÑYdÑPUÐjnÐOoÐpÕqä˜Ô(ä�J‰J”uÖò/	ðô@ 	ˆI‹€AÜ	Ñ2˜	Ô2Ó	2€BÜ	Ñ6¨IÔ6Ó	6€BÜ
ÑQ°yÔQÓ
QÔTWÐXZÐ\]ÓT^Ñ
^€Cä	ÐÔ Ü	ˆG�A�3ˆ-ÔÙÜ�˜B˜4˜r " Q¡$ s¡(¨3 ¨rÐ2Ô3Ü	ˆI�c˜#�YÐ
Ô Ü	ˆM˜"˜Ð
Ôà�<Š<Ü�
œ: iÓ0Ð1Ð2Õ3ð r   Ú__main__)Ú__doc__r   Úsysr"   r   Úbs4r   Úurllib.parser   r@   rŽ   ÚGROUPr   r   r®   r„   r   r'   r0   rI   rL   r€   rŠ   r’   r¼   Ú__name__rR   r   r   ú<module>rÄ      s‰   ðñ	÷ Ó Û Ý Ý  àH€Ø$€	Ø€ØÐWÐ
X€Ø
€Ø€Ø
€òò	ò
ò%òNòT9òlòò.>4ð@ ˆzÒÙ…Fð r   