Ë
    €Ûµj¾   ã                   ó®   — 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mZ ddl	m
Z
m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)u5  
å�—äº¬å¸‚æº§æ°´åŒºäººæ°‘æ”¿åºœ-å…¬ç¤ºå…¬å‘Š çˆ¬è™«
URL: http://www.njls.gov.cn/lsqrmzf/214/228/index_17658.html
CMS: TRS / æº§æ°´åŒºæ”¿åºœç½‘ç«™ç¾¤
AJAX API: /igs/front/search/publish/data/list.html
åˆ—è¡¨: HTMLï¼špages 1-3 ç›´æŽ¥åŠ è½½ï¼›pages 4+ AJAX
æ³¨æ„�: åˆ›å®‡ç›¾WAFï¼Œéœ€Playwrightæ¸²æŸ“èŽ·å�–æ•°æ�®
é    N)ÚBeautifulSoup)ÚurljoinÚ	urlencodeu   æº§æ°´åŒº-å…¬ç¤ºå…¬å‘Šu   æ±Ÿè‹�z/root/search.dbz/root/fetch_njls_list.pyc                 ó@   — t        d| › �t        j                  ¬«       y )Nz
  [DEBUG] )Úfile)ÚprintÚsysÚstderr)Úmsgs    ú$/root/gov_crawler/crawl_njls_tzgg.pyÚdebugr      s   € Ü	ˆJ�s�eÐ
¤3§:¡:Ö.ó    c           	      óÊ   — 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     r   Ú
parse_dater      sV   € Ü
�	‰	Ð6¸Ó=€AÙØ—'‘'˜!“*�˜Qœs 1§7¡7¨1£:›¨sÐ3°1´S¸¿¹À»³_ÀSÐ4IÐJÐJØr   c           	      óÌ  — ddl }dj                  d„ | D «       «      }t        j                  t        d|g}|j                  |ddd¬«      }|j                  dk7  rt        d	|j                  dd
 › �«       g S 	 t        j                  |j                  j                  «       «      }|S # t        j                  $ r*}t        d|› d|j                  dd
 › �«       g cY d}~S d}~ww xY w)zp
    Call Playwright script to fetch list data for specified page numbers.
    Returns list of items dicts.
    r   Nú,c              3   ó2   K  — | ]  }t        |«      –— Œ y ­w)N)Ústr)Ú.0Úps     r   ú	<genexpr>z,fetch_page_via_playwright.<locals>.<genexpr>&   s   è ø€ Ò/ Aœ˜QŸÑ/ùs   ‚ú--pagesTéx   )Úcapture_outputr   Útimeoutu   Playwright è„šæœ¬é”™è¯¯: éÈ   u   JSON è§£æž�å¤±è´¥: z
, stdout: )Ú
subprocessÚjoinr	   Ú
executableÚFETCHER_SCRIPTÚrunÚ
returncoder   r
   ÚjsonÚloadsÚstdoutÚstripÚJSONDecodeError)Úpagesr)   Ú	pages_strÚcmdÚresultÚdataÚes          r   Úfetch_page_via_playwrightr:       sÔ   € ó
 Ø—‘Ñ/¨Ô/Ó/€IÜ�>‰>œ>¨9°iÐ
@€CØ�^‰^˜C°¸4Èˆ^ÓM€FØ×Ñ˜AÒÜÐ)¨&¯-©-¸¸Ð*=Ð)>Ð?Ô@Øˆ	ðÜ�z‰z˜&Ÿ-™-×-Ñ-Ó/Ó0ˆØˆøÜ×Ñò ÜÐ# A 3 j°·±¸tÀÐ1DÐ0EÐFÔGØ�	ûðús   Á7.B& Â&C#Â9CÃC#ÃC#c           
      óÒ  — | r| j                  «       sdg fS t        | d«      }g }g }|j                  D �]^  }|j                  s-t	        |«      j                  «       }|r|j                  |«       Œ=|j                  j                  «       }|dk(  r:|j                  d¬«      }|sŒqt        d„ |D «       «      rŒ„|j                  |«       Œ–|dk(  r|j                  t	        |«      «       Œ¶|dv r'|j                  d¬«      }|sŒÏ|j                  |«       Œá|d	k(  rŒç|d
k(  rL|j                  dd«      }|j                  dd«      }	|s�Œ|j                  d|	› dt        d|«      › d�«       �Œ8|j                  d¬«      }|s�ŒN|j                  |«       �Œa |j                  dd¬«      D ]j  }
|
d   }|
j                  j                  «       }t        j                  d|j                  «       «      sŒGt        d|«      }|j                  d|› d|› d�«       Œl t        «       }g }|D ].  }|dd }||vsŒ|j!                  |«       |j                  |«       Œ0 dj#                  |«      }||fS )z-Parse the HTML content from DOCCONTENT field.r   zhtml.parserr"   T)r2   c              3   ó$   K  — | ]  }|d v –— Œ
 y­w)u
    
	ã€€ Â N© )r!   Úcs     r   r#   z#parse_doccontent.<locals>.<genexpr>H   s   è ø€ ÒF¸Q˜qÐ$8Ô8ÑFùs   ‚Útable)ÚdivÚspanÚbrÚimgÚsrcÚaltz![z](zhttp://www.njls.gov.cnú)Úa)ÚhrefrH   z3\.(pdf|doc|docx|xls|xlsx|zip|rar|ceb|ofd|ppt|pptx)$ú[Néd   ú

)r2   r   ÚchildrenÚnamer    ÚappendÚlowerÚget_textÚallÚgetr   Úfind_allr   r   r   ÚsetÚaddr*   )Úhtml_contentÚsoupÚpartsÚattachmentsÚchildr   ÚtagÚtxtrD   rE   rG   rH   Úfull_urlÚseenÚunique_partsr"   ÚkeyÚcontents                     r   Úparse_doccontentrb   4   sA  € á˜|×1Ñ1Ô3Ø�2ˆvˆä˜ }Ó5€DØ€EØ€Kà—‘ó "ˆØ�zŠzÜ�u“:×#Ñ#Ó%ˆDÙØ—‘˜TÔ"Øà�j‰j×ÑÓ ˆà�#Š:Ø—.‘. t�.Ó,ˆCÚœ3ÑFÀ#ÔFÕFØ—‘˜SÕ!Ø�GŠ^Ø�L‰Lœ˜U›Õ$Ø�OÑ#Ø—.‘. t�.Ó,ˆCÚØ—‘˜SÕ!Ø�DŠ[ØØ�EŠ\Ø—)‘)˜E 2Ó&ˆCØ—)‘)˜E 2Ó&ˆCÛØ—‘˜r #  b¬Ð1IÈ3Ó)OÐ(PÐPQÐRÖSà—.‘. t�.Ó,ˆCÛØ—‘˜SÖ!ð;"ð@ �]‰]˜3 Tˆ]Ó*ò 8ˆØ�‰yˆØ�v‰v�|‰|‹~ˆÜ�9‰9ÐKÈTÏZÉZË\ÕZÜÐ7¸Ó>ˆHØ×Ñ  4 &¨¨8¨*°AÐ6Õ7ð8ô ‹5€DØ€LØò #ˆØ��ˆgˆØ�dŠ?Ø�H‰H�SŒMØ×Ñ Õ"ð	#ð �k‰k˜,Ó'€GØ�KÐÐr   c                 óæ   — | j                  dd«      }| j                  dd«      }| j                  dd«      }|rt        |«      nd}| j                  dd«      xs d}t        |«      \  }}||||||dœS )z0Convert a JSON row from AJAX to our item format.ÚDOCTITLEr   Ú	DOCPUBURLÚ
DOCRELTIMEÚ
DOCCONTENT)ÚtitleÚurlra   Úpub_daterY   Ú_page)rR   r   rb   )	ÚrowÚpage_numrh   ri   Údate_rawrj   Úcontent_htmlra   rY   s	            r   Úprocess_itemrp   p   s‚   € à�G‰G�J Ó#€EØ
�'‰'�+˜rÓ
"€CØ�w‰w�| RÓ(€HÙ'/Œz˜(Ô#°R€HØ—7‘7˜<¨Ó,Ò2°€Lä+¨LÓ9Ñ€Gˆ[ð ØØØØ"Øñð r   c                  ó   — dd l } | j                  t        d¬«      }|j                  d«       |j	                  «       }|j                  d«       |j                  d«       |j                  «        |j                  «        y )Nr   é<   ©r'   zPRAGMA busy_timeout=60000aK  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
    )zSCREATE INDEX IF NOT EXISTS idx_gov_raw_url 
        ON gov_raw(page_url, site_name))Úsqlite3ÚconnectÚDB_PATHÚexecuteÚcursorÚcommitÚclose)rt   Úconnr>   s      r   Úinit_dbr|   ƒ   se   € ÛØ�?‰?œ7¨Bˆ?Ó/€DØ‡L�LÐ,Ô-Ø�‰‹€AØ‡I�Ið 	ô 
ð ‡I�Ið +ô ,à‡K�K„MØ‡J�J…Lr   c                 óÀ  — dd l }|j                  t        d¬«      }|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 # t        $ r}t        d|d   › d|› �«       Y d }~Œ¨d }~ww xY w)Nr   rr   rs   ra   r(   r   z¶INSERT OR REPLACE INTO gov_raw (page_url, title, content, publish_date, site_name, summary, attachments, date_rank, script_name) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'crawl_njls_tzgg.py')ri   rh   rj   rY   ú
z
0000-00-00r   u     å…¥åº“å¤±è´¥: z - )rt   ru   rv   rx   rw   Ú	SITE_NAMEr*   Ú	Exceptionr   ry   rz   )Úitemsrt   r{   r>   ÚimportedÚitemÚsummaryr9   s           r   Ú
save_to_dbr…   ™   s  € ÛØ�?‰?œ7¨Bˆ?Ó/€DØ�‰‹€AØ€HØò :ˆØ+/°	ª?�$�y‘/ $ 3Ñ'Àˆð	:Ø�I‰Ið  UØ�U‘Ø�W‘Ø�Y‘Ø�ZÑ ÜØØ26°}Ò2E�—	‘	˜$˜}Ñ-Ô.È2Ø�ZÑ Ò0 Lð	Wô 	ð ˜‰M‰Hð:ð  	‡K�K„MØ‡J�J„LØ€Oøô	 ò 	:ÜÐ$ T¨%¡[ M°°Q°CÐ8×9Ñ9ûð	:ús   ÁAB6Â6	CÂ?CÃCc                  ó   — dd l } | j                  d¬«      }|j                  dt        dd¬«       |j                  dd	d
¬«       |j	                  «       }t        «        t        dt        › d�«       d}|j                  dk(  r|nt        |j                  |«      }t        d|› d|› d�«       g }t        d|dz   «      D ]è  }t        d|› d|› d�«       t        |g«      }|st        d|› d�«       Œ3t        dt        |«      › d�«       t        |«      D ]�  \  }}	t        dt        |«      dz   › d|	d   d d › d�«       |	d   r<t        |	d   j                  d «      «      }
t        d!|
› d"|	d#   rd$nd%› d&|	d'   › �«       nt        d(|	d#   rd$nd%› �«       |j                  |	«       Œ’ Œê t        |«      }t!        d)„ |D «       «      }t!        d*„ |D «       «      }t!        d+„ |D «       «      t#        |d«      z  }t        d,t        › d-�«       t        d.|› d�«       t        |rd/|› d0||z  d1z  d2›d3�nd4«       t        d5|d2›�«       t        d6|› �«       |j$                  sfdd l}|j)                  t*        d7¬8«      }|j-                  «       }|j/                  «        |j1                  «        t3        |«      }t        d9|› d�«       y t        d:«       y );Nr   u   æº§æ°´åŒº-å…¬ç¤ºå…¬å‘Š çˆ¬è™«)Údescriptionr$   é   u   çˆ¬å�–é¡µæ•°, 0=å…¨éƒ¨)ÚtypeÚdefaultÚhelpz	--skip-dbÚ
store_trueu   è·³è¿‡å…¥åº“)Úactionr‹   z===== u    çˆ¬å�– =====é   u   æ€»é¡µæ•°: u   , å°†çˆ¬å�–: u    é¡µr   u	   
--- ç¬¬ ú/u    é¡µ ---u     ç¬¬ u    é¡µæ— æ•°æ�®u     åˆ—è¡¨é¡¹: u    æ�¡z  [z] rh   é(   z...ra   rK   z    seg=z
 | attach=rY   ÚYESÚnoz | date=rj   u       âš ï¸� ç©ºæ­£æ–‡ | attach=c              3   ó,   K  — | ]  }|d    sŒ	d–— Œ y­w)ra   r   Nr=   ©r!   Úis     r   r#   zmain.<locals>.<genexpr>Ù   s   è ø€ Ò9˜!¨A¨i«L”AÑ9ùs   ‚
�c              3   ó8   K  — | ]  }t        |d    «      –— Œ y­w)rY   N)Úlenr”   s     r   r#   zmain.<locals>.<genexpr>Ú   s   è ø€ Ò@°”s˜1˜]Ñ+×,Ñ@ùs   ‚c              3   ób   K  — | ]'  }|d    sŒ	t        |d    j                  d«      «      –— Œ) y­w)ra   rK   N)r—   Úsplitr”   s     r   r#   zmain.<locals>.<genexpr>Û   s*   è ø€ ÒU°aÈÈ)Ë”#�a˜	‘l×(Ñ(¨Ó0×1ÑUùs   ‚
/�"/z
===== u    çˆ¬å�–å®Œæˆ� =====u   å…±çˆ¬å�–: u   æœ‰æ­£æ–‡: u    æ�¡ (rJ   z.1fz%)u   æœ‰æ­£æ–‡: 0 æ�¡u   å¹³å�‡æ®µè�½æ•°: u   é™„ä»¶æ•°: rr   rs   u   å…¥åº“: u   å…¥åº“: å·²è·³è¿‡)ÚargparseÚArgumentParserÚadd_argumentr   Ú
parse_argsr|   r   r   r4   ÚminÚranger:   r—   Ú	enumerater™   rN   ÚsumÚmaxÚskip_dbrt   ru   rv   rx   ry   rz   r…   )rš   ÚparserÚargsÚtotal_pagesÚpages_to_fetchÚ	all_itemsÚpager�   Úidxrƒ   Ú	seg_countÚtotalÚ	with_bodyÚtotal_attachÚavg_segrt   r{   r>   r‚   s                      r   Úmainr°   ²   så  € ÛØ×$Ñ$Ð1PÐ$ÓQ€FØ
×Ñ˜	¬°QÐ=UÐÔVØ
×Ñ˜¨L¸~ÐÔNØ×ÑÓ€Dä„Iä	ˆF”9�+˜]Ð
+Ô,à€KØ$(§J¡J°!¢O‘[¼¸T¿Z¹ZÈÓ9U€NÜ	ˆK˜�} M°.Ð1AÀÐ
FÔGà€Iä�a˜¨!Ñ+Ó,ò #ˆÜ�
˜4˜&  .Ð!1°Ð:Ô;ä)¨4¨&Ó1ˆÙÜ�F˜4˜& Ð.Ô/Øä�œc %›j˜\¨Ð.Ô/ä" 5Ó)ò 		#‰IˆC�Ü�Cœ˜I› qÑ(Ð)¨¨D°©M¸#¸2Ð,>Ð+?¸sÐCÔDà�IŠÜ  Y¡× 5Ñ 5°fÓ =Ó>�	Ü˜  ¨:¸tÀMÒ?R±eÐX\Ð5]Ð]eÐfjÐkuÑfvÐewÐxÕyäÐ6ÀÀ]Ò@S±uÐY]Ð6^Ð_Ô`à×Ñ˜TÕ"ñ		#ð#ô* �	‹N€EÜÑ9˜yÔ9Ó9€IÜÑ@°iÔ@Ó@€LÜÑU¸9ÔUÓUÔX[Ð\eÐghÓXiÑi€Gä	ˆH”Y�KÐ2Ð
3Ô4Ü	ˆK˜�w˜dÐ
#Ô$Ü	ÉˆK˜	�{ &¨°5©¸Ñ)<¸SÐ(AÀÑ
DÐSeÔfÜ	Ð˜g c˜]Ð
+Ô,Ü	ˆK˜�~Ð
&Ô'à�<Š<ãØ�‰œw°ˆÓ3ˆØ�K‰K‹Mˆð 	�‰ŒØ�
‰
Œä˜iÓ(ˆÜ�˜˜
 $Ð'Õ(äÐ!Õ"r   Ú__main__)Ú__doc__r   r	   ÚtimeÚosr/   ÚrequestsÚbs4r   Úurllib.parser   r   r   ÚGROUPrv   r,   r   r   r:   rb   rp   r|   r…   r°   Ú__name__r=   r   r   ú<module>rº      sr   ðñ÷ × Ó Û Ý ß +à$€	Ø€Ø
€ð ,€ò/òòò(: òxò&ò,ò2>#ð@ ˆzÒÙ…Fð r   