Ë
    *ý€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ZddlmZm	Z	 ddl
mZ ddlmZ dZdZedz   Zd	Zd
ZdZ ej(                  «        e	d¬«      z
  j+                  d«      Zej.                  j1                  dd«      ZdddœZdddœZd„ Zd„ Zd#d„Zd$d„Zd„ Z d%d„Z!e"dk(  rƒejF                  dd Z$dZ%dZ&ddjO                  e$«      v r7 e( ejR                  d djO                  e$«      «      jU                  d«      «      Z%d!e$v re$e$jW                  d!«      dz      Z& e!e%e&¬"«       yy)&u	  
ç¬¬å…­å¸ˆäº”å®¶æ¸ å¸‚äººæ°‘æ”¿åºœ - åœ¨çº¿å¾�é›† (wjq.gov.cn/wykwybwyw/wyw/zxzj)
CMS: JPAAS è°ƒæŸ¥å¾�é›† (jsurvey-web-server)
åˆ—è¡¨: GET /api-gateway/jpaas-jsurvey-web-server/interface/dczj/find-title-list
      params: webId=gXiRWWCDbJQMHYm3xJLgF&pageSize=20&pageNo=N&orderType=0&type=1  JSON (79æ�¡/4é¡µ)
è¯¦æƒ…: GET /front/dczj/showJsurveys.do?formId={iid}  æ­£æ–‡ td.jsurvey-td-xj(ç¬¬3ä¸ª, pæ®µ)
æ ‡é¢˜: è¯¦æƒ…é¡µ <title> | æ—¥æœŸ: åˆ—è¡¨ createTime
ç”¨æ³•: python3 crawl_wjq_zxzj.py [--pages=N] [--json out.jsonl]
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoup)Úurljoinu.   ç¬¬å…­å¸ˆäº”å®¶æ¸ å¸‚äººæ°‘æ”¿åºœ-åœ¨çº¿å¾�é›†zhttps://www.wjq.gov.cnzD/api-gateway/jpaas-jsurvey-web-server/interface/dczj/find-title-listÚgXiRWWCDbJQMHYm3xJLgFzwww.wjq.gov.cnu   æ–°ç–†iG  )Údaysz%Y-%m-%dÚDB_PATHz/root/search.dbzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36z4https://www.wjq.gov.cn/wykwybwyw/wyw/zxzj/index.html)z
User-AgentÚRefererz‡Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Mobile/15E148 Safari/604.1c                 ó2   — t        dt        › d| › �d¬«       y )Nú[z] T)Úflush)ÚprintÚ	SITE_NAME)Úmsgs    ú#/root/gov_crawler/crawl_wjq_zxzj.pyÚlogr      s   € Ü	ˆAŒiˆ[˜˜3˜%Ð
 ¨Ö-ó    c                 ó´   — t        j                  dd| xs d«      } t        j                  dd| «      } t        j                  dd| «      j                  «       } | S )Nz&nbsp;|&#160;|\u200b|\ufeffÚ z\s+ú u   \.\.\.|â€¦$)ÚreÚsubÚstrip)Úts    r   Úclean_titler   #   sK   € Ü
�‰Ð-¨r°1²7¸Ó;€AÜ
�‰ˆv�s˜AÓ€AÜ
�‰ˆ~˜r 1Ó%×+Ñ+Ó-€AØ€Hr   c                 óä  — 	 t         || dddœ}t        j                  t        |t        d¬«      }|j                  «       }|j                  d«      dk7  s|j                  d«      s$t        d	| › d
|j                  d«      › �«       g dfS |j                  di «      }|j                  dg «      t        |j                  dd«      «      fS # t        $ r}t        d	| › d|› �«       g dfcY d }~S d }~ww xY w)Nr   é   )ÚwebIdÚpageSizeÚpageNoÚ	orderTypeÚtypeé   )ÚparamsÚheadersÚtimeoutÚcodeÚ200ÚsuccesszAPI Pz fail: ÚmessageÚdataÚlistÚ
totalCountz ERR: )	ÚWEB_IDÚrequestsÚgetÚLIST_APIÚHEADERSÚjsonr   ÚintÚ	Exception)ÚpageÚ	page_sizer$   ÚrÚjÚdÚes          r   Ú
fetch_listr<   *   sà   € ðÜ!¨yÀDØ ¨!ñ-ˆä�L‰Lœ¨&¼'È2ÔNˆØ�F‰F‹HˆØ�5‰5�‹=˜EÒ!¨¯©¨yÔ)9Ü�%˜�v˜W Q§U¡U¨9Ó%5Ð$6Ð7Ô8Ø�q�5ˆLØ�E‰E�&˜"ÓˆØ�u‰u�V˜RÓ ¤# a§e¡e¨L¸!Ó&<Ó"=Ð=Ð=øÜò Üˆe�D�6˜ ˜sÐ#Ô$Ø�1ˆu�ûðús$   ‚BC Â>C Ã	C/ÃC*Ã$C/Ã*C/c                 ó´  — | syt        | d«      }|j                  dd¬«      D ]X  }|j                  dd«      }|j                  d¬«      xs d}|xs t        }t        ||«      }|j                  d	|› d
|› d�«       ŒZ |j                  g d¢«      D ]  }|j                  «        Œ g }	|j                  ddg«      D ]y  }
|
j                  dk(  r|	j                  t        |
«      «       Œ-|
j                  dk(  sŒ=|
j                  d«      rŒO|
j                  dd¬«      }|sŒe|	j                  d|› d�«       Œ{ |	rdj                  |	«      S | j                  «       S )uS   HTML -> æ–‡æœ¬, é“¾æŽ¥/é™„ä»¶ä¿�ç•™å†…åµŒURL (ç”¨æˆ·å��å¥½: HTMLå�¯ç‚¹å‡»é“¾æŽ¥æ®µ)r   úhtml.parserÚaT)Úhrefr@   ©r   u   é™„ä»¶z<p><a href="z">z</a></p>)ÚspanÚbÚstrongÚfontÚemÚiÚuÚsÚtableÚp©Ú	separatorr   ú<p>ú</p>ú

)r   Úfind_allr0   Úget_textÚBASE_URLr   Úreplace_withÚunwrapÚnameÚappendÚstrÚfind_parentÚjoinr   )Úcontent_htmlÚpage_urlÚsoupÚa_tagr@   ÚtextÚbaseÚfull_urlÚtagÚpartsÚelr   s               r   Úextract_clean_textre   :   sK  € áØÜ˜ }Ó5€DØ—‘˜s¨�Ó.ò FˆØ�y‰y˜ Ó$ˆØ�~‰~ Dˆ~Ó)Ò5¨XˆØÒ#œ8ˆÜ˜4 Ó&ˆØ×Ñ˜\¨(¨°2°d°V¸8ÐDÕEðFð �}‰}ÒQÓRò ˆØ�
‰
�ðà€EØ�m‰m˜W c˜NÓ+ò ,ˆØ�7‰7�gÒØ�L‰Lœ˜R›Õ!Ø�W‰W˜‹^ B§N¡N°7Õ$;Ø—‘ b°�Ó5ˆAÚØ—‘˜s 1 # T˜]Õ+ð,ñ "'ˆ6�;‰;�uÓÐ@¨L×,>Ñ,>Ó,@Ð@r   c                 óŠ  ‡— t        | d«      }|j                  d«      }|rt        |j                  d¬«      «      nd}t	        j
                  dd|«      }d}t	        j                  d| «      }|r|j                  d«      }d}d	}d
}	|j                  d«      D ]b  }
|
j                  d¬«      Št        ˆfd„dD «       «      rt        ‰«      dk  rŒ8t        ‰«      dkD  sŒGt        ‰«      |	kD  sŒV|
}t        ‰«      }	Œd |rt        t        |«      |«      }�n+|j                  dd¬«      }|D �]  }|j                  dd«      }d|j                  dd«      v sd|v sŒ/t        t        |«      d«      }|j                  ddg«      D ]9  }|j                  d¬«      }|dv sd|v sd|v s	d|v sd|v sŒ*|j                  «        Œ; |j                  g d¢«      D ]  }|j!                  «        Œ g }|j                  d«      D ]-  }|j                  dd¬«      }|sŒ|j#                  d |› d!�«       Œ/ d"j%                  |«      }|s�Œ n |||fS )#uT   æ��å�–æ­£æ–‡: ä¼˜å…ˆæ‰‹æœºç‰ˆ td å†… p æ®µ (å·²ç»“æ�Ÿå¾�é›†æ‰‹æœºç‰ˆä¹Ÿæ˜¾ç¤ºæ­£æ–‡)r>   ÚtitleTrA   r   u/   _\s*(åœ¨çº¿å¾�é›†|äº”å®¶æ¸ å¸‚äººæ°‘æ”¿åºœ)\s*$u(   å�‘å¸ƒæ—¶é—´[:ï¼š]\s*(\d{4}-\d{2}-\d{2})r   Nr   Útdc              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­w©N© )Ú.0ÚkÚtxts     €r   ú	<genexpr>zparse_detail.<locals>.<genexpr>e   s   øè ø€ Ò|˜Aˆq�CŒxÑ|ùs   ƒ)õ   æ��äº¤æˆ�åŠŸõ   å½“å‰�å…±æŠ•äº†u   é—®å�·å·²ç»“æ�Ÿõ   ç»“æžœç”Ÿæˆ�æ—¶é—´u
   å…±è®¡:ç¥¨éÈ   éd   ÚdivÚ	rwtpjgtop)Úclass_Ústylezdisplay:blockr   zdisplay: blockrK   Úimg)rp   u   é—®å�·ç»“æ�Ÿrq   rr   u'   é—®å�·å·²ç»“æ�Ÿï¼Œæ„Ÿè°¢æ‚¨çš„å�‚ä¸Žï¼�u   ç»“æ�Ÿæ—¶é—´ï¼š)	ru   rB   rC   rD   rE   rF   rG   rH   rI   rL   rN   rO   rP   )r   Úfindr   rR   r   r   ÚsearchÚgrouprQ   ÚanyÚlenre   rX   r0   ÚreplaceÚ	decomposerU   rW   rZ   )Úhtmlr\   r]   r   rg   ÚpubÚmÚcontentÚbestÚbest_lenrh   ÚrwtsÚrwtrx   ÚbodyÚjunkrb   rc   rd   rn   s                      @r   Úparse_detailr‹   R   se  ø€ ä˜˜}Ó-€DØ�	‰	�'Ó€AÙ34ŒK˜Ÿ
™
¨˜
Ó.Ô/¸"€Eä�F‰FÐEÀrÈ5ÓQ€Eà
€CÜ
�	‰	Ð=¸tÓD€AÙØ�g‰g�a‹jˆà€GØ€DØ€HØ�m‰m˜DÓ!ò  ˆØ�k‰k ˆkÓ%ˆäÓ|Ð!{Ô|Ô|Ü�3‹x˜#Š~ØÜˆs‹8�c‹>œc #›h¨Ó1ØˆDÜ˜3“x‰Hð ñ Ü$¤S¨£Y°Ó9Šð �}‰}˜U¨;ˆ}Ó7ˆØó 	ˆCØ—G‘G˜G RÓ(ˆEØ %§-¡-°°RÓ"8Ñ8Ð<LÐPUÒ<UÜ$¤S¨£X¨}Ó=�à ŸM™M¨3°¨,Ó7ò )�DØŸ™¨D˜Ó1�AØÐ<Ñ<Ð@QÐUVÑ@VÐZnÐrsÑZsð  xað  efñ  xfð  j{ð  @ò  j@ØŸ™Õ(ð)ð  Ÿ=™=Ò)dÓeò !�CØ—J‘J•Lð!à�ØŸ-™-¨Ó,ò 4�BØŸ™¨b¸˜Ó=�AÚØŸ™ s¨1¨#¨T ]Õ3ð4ð !Ÿ+™+ eÓ,�ÛÙð%	ð& �#�wÐÐr   é   c                 óà  — t        d| › dt        › �«       g }t        «       }d}t        d| dz   «      D �]  }t	        |«      \  }}d}|D ]£  }t        |j                  dd«      «      }	|j                  dd«      }
|
r|
d d nd}|j                  d	d«      }|j                  d
d«      }|j                  dd«      }|sŒr||vsŒw|j                  |«       |j                  |	||||dœ«       |dz  }Œ¥ t        d|› dt        |«      › d|› dt        |«      › d|› d�«       |s nt        j                  d«       �Œ g }t        |d«      D �]  \  }}|d   r|d   t        k  rŒ	 |j                  d«      dk(  r7t        j                  dd|d	   «      }t        j                  |t         d¬«      }nt        j                  |d	   t"        d¬«      }d|_        |j&                  }t)        ||d	   «      \  }	}}|j                  |	xs |d   |d	   |xs |d   |t,        ddœ«       |dz  dk(  rt        d|› dt        |«      › �«       t        j                  d «       �Œ |rct/        |d!d¬"«      5 }|D ]+  }|j1                  t3        j4                  |d#¬$«      d%z   «       Œ- 	 d d d «       t        d&t        |«      › d'|› �«       y t7        j8                  t:        «      }|j=                  d(«       |j?                  «       }dx}}|D ]W  }	 |j=                  d)|d*   |d+   |d+   |d   |d,   |d-   |d-   xs dd d. |d/   d0f	«       |j@                  dkD  r|dz  }n|dz  }ŒY |jC                  «        |jE                  «        t        d2|› d3|› d4�«       y # t*        $ r%}t        d|› �«       |d   |d   d}}}	Y d }~�ŒÂd }~ww xY w# 1 sw Y   �Œ#xY w# t*        $ r}t        d1|› �«       |dz  }Y d }~Œìd }~ww xY w)5NzCrawl pages=z cutoff=r   r   rg   r   Ú
createTimeé
   ÚurlÚiidÚstate)rg   r�   Úpub_dater‘   r’   ÚPz: z items (z new), total z (totalCount=ú)g333333ã?r“   é   zshowJsurveys\.dozshowPhoneJsurveys.dor#   )r%   r&   zutf-8z  detail ERR: u   åœ¨çº¿å¾�é›†)rg   r\   Úpublish_dater„   Ú	site_nameÚcolumnz  ú/gš™™™™™Ù?Úw)ÚencodingF)Úensure_asciiú
zJSONL: z
 items -> zPRAGMA busy_timeout=10000z˜INSERT OR IGNORE INTO gov_raw (site_name, source_url, page_url, title, publish_date, content, summary, category, script_name) VALUES (?,?,?,?,?,?,?,?,?)r˜   r\   r—   r„   iô  r™   zcrawl_wjq_zxzj.pyz
DB error: zResult: z new, z skipped)#r   ÚCUTOFFÚsetÚranger<   r   r0   ÚaddrW   r~   ÚtimeÚsleepÚ	enumerater   r   r/   ÚHEADERS_MOBILEr2   rœ   r_   r‹   r5   r   ÚopenÚwriter3   ÚdumpsÚsqlite3Úconnectr	   ÚexecuteÚcursorÚrowcountÚcommitÚclose)ÚpagesÚjson_outÚ	items_allÚseenÚtotalrK   ÚartsÚnewr?   rg   Úctr‚   r�   r‘   r’   ÚenrichedÚidxÚitÚmobr8   r�   r„   r;   ÚfÚitemÚconnÚcÚstoredÚskippeds                                r   ÚcrawlrÃ   †   s/  € Üˆ,�u�g˜X¤f XÐ.Ô/Ø€IÜ‹5€DØ€EÜ�1�e˜a‘iÓ ó ˆÜ  “m‰ˆˆeØˆØò 
	ˆAÜ §¡ g¨rÓ 2Ó3ˆEØ—‘�| RÓ(ˆBÙ�"�S�b‘' RˆCØ—%‘%˜˜rÓ"ˆCØ—%‘%˜˜rÓ"ˆCØ—E‘E˜' 1Ó%ˆEÚ�s $’Ø—‘˜”Ø× Ñ ¨5¸È#ÐVYÐdiÑ!jÔkØ�q‘‘ð
	ô 	ˆa�ˆs�"”S˜“Y�K˜x¨ u¨M¼#¸i».Ð9IÈÐW\ÐV]Ð]^Ð_Ô`ÙÙÜ�
‰
�3Žð#ð& €HÜ˜Y¨Ó*ó ‰ˆˆRØˆjŠ>˜b ™n¬vÒ5Øð	Bà�v‰v�g‹ !Ò#Ü—f‘fÐ0Ð2HÈ"ÈUÉ)ÓT�Ü—L‘L ¬nÀbÔI‘ä—L‘L  E¡´GÀRÔH�Ø ˆAŒJØ—6‘6ˆDÜ".¨t°R¸±YÓ"?ÑˆE�3˜ð 	�‰ØÒ)˜b ™kØ˜5™	ØÒ1 2 j¡>ØÜ"Ø$ñ
ô 	ð �‰8�qŠ=Ü�"�S�E˜œ3˜y›>Ð*Ð+Ô,Ü�
‰
�3Žð5ñ8 Ü�(˜C¨'Ô2ð 	E°aØ ò E�Ø—‘œŸ
™
 4°eÔ<¸tÑCÕDñE÷	Eô 	ˆg”c˜(“m�_ J¨x¨jÐ9Ô:Øä�?‰?œ7Ó#€DØ‡L�LÐ,Ô-Ø�‰‹€AØÐ€FˆWØò ˆð	Ø�I‰Ið.ð �kÑ" D¨Ñ$4°d¸:Ñ6FØ�g‘  ^Ñ 4°d¸9±oØ�y‘/Ò' R¨¨#Ð.°°X±Ð@SðUô	Vð �z‰z˜AŠ~Ø˜!‘‘à˜1‘�øðð  	‡K�K„MØ‡J�J„LÜˆ(�6�(˜&  	¨Ð2Õ3øôY ò 	BÜ�.  Ð$Ô%Ø"$ W¡+¨r°*©~¸r˜�3ŽEûð	Bú÷ 	Eñ 	Eûô. ò 	Ü�*˜Q˜CÐ Ô!Ø�q‰L�Gûð	ús>   Å BN	É'1N:Ì AOÎ		N7ÎN2Î2N7Î:OÏ	O-ÏO(Ï(O-Ú__main__r   z--pages=r   z--pages=(\d+)z--json)r±   r²   )é   rj   )rŒ   N),Ú__doc__r   ÚsysÚosr3   r£   rª   r/   r   r   Úbs4r   Úurllib.parser   r   rS   r1   r.   ÚDOMAINÚGROUPÚnowÚstrftimerŸ   Úenvironr0   r	   r2   r¦   r   r   r<   re   r‹   rÃ   Ú__name__ÚargvÚargsr±   r²   rZ   r4   r{   r|   Úindexrk   r   r   ú<module>rÔ      sM  ðñ÷ 2× 1× 1Ó 1ß (Ý Ý  à<€	Ø#€ØÐ\Ñ\€Ø	 €Ø	€Ø€Ø
ˆ(�,‰,‹.™9¨%Ô0Ñ
0×	:Ñ	:¸:Ó	F€Ø
�*‰*�.‰.˜Ð$5Ó
6€ð KØLñN€ð !jØSñU€ò.òóó Aò01óhR4ðj ˆzÒØ�8‰8�A�Bˆ<€DØ€EØ€HØ�S—X‘X˜d“^Ñ#Ù�I�B—I‘IÐ.°·±¸³Ó?×EÑEÀaÓHÓIˆØ�4ÑØ˜Ÿ
™
 8Ó,¨qÑ0Ñ1ˆÙ	� Ö)ð r   