Ë
    +„j«  ã                   ón  — 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d	Zd
ZdZdZdZ ej,                  «        e	d¬«      z
  j/                  d«      Zej2                  j5                  dd«      Zde› de› de› d�dœZd„ Zd„ Zd„ Zd&d„Z d„ Z!d'd„Z"e#dk(  rƒejH                  d d Z%dZ&dZ'd!d"jQ                  e%«      v r7 e) ejT                  d#d"jQ                  e%«      «      jW                  d «      «      Z&d$e%v re%e%jY                  d$«      d z      Z' e"e&e'¬%«       yy)(uÞ  
äº”æ²³åŽ¿äººæ°‘æ”¿åºœ - å»ºè®¾é¡¹ç›®çŽ¯å¢ƒå½±å“�è¯„ä»·å®¡æ‰¹ (wuhe.gov.cn/zfxxgk/public/column/29631?catId=18193258)
CMS: å®‰å¾½ zfxxgk public/column å¹³å�° (label/8888 API, å�Œå®‰åº†sthjj)
åˆ—è¡¨: POST/GET /zfxxgk/site/label/8888  labelName=publicInfoList&siteId=6795621&organId=29631&catIds=18193258&type=4&pageIndex=N (15æ�¡/é¡µ)
è¯¦æƒ…: /zfxxgk/public/29631/{id}.html, æ­£æ–‡ .xxgkcontent / .gkwz_contnet
ç”¨æ³•: python3 crawl_wuhe_zfxxgk.py [--pages=N] [--json out.jsonl]
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoup)Úurljoinu:   äº”æ²³åŽ¿äººæ°‘æ”¿åºœ-å»ºè®¾é¡¹ç›®çŽ¯å¢ƒå½±å“�è¯„ä»·å®¡æ‰¹zhttps://www.wuhe.gov.cnz/zfxxgk/site/label/8888Ú29631Ú18193258Ú6795621zwww.wuhe.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.36z/zfxxgk/public/column/z?type=4&catId=z&action=list&nav=3)z
User-AgentÚRefererc                 ó2   — t        dt        › d| › �d¬«       y )Nú[z] T)Úflush)ÚprintÚ	SITE_NAME)Úmsgs    ú&/root/gov_crawler/crawl_wuhe_zfxxgk.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           	      óÄ  — i dd“dt         “dd“dt        | «      “dd“d	d
“dd“dd“dt        “dd“dt        “dd“dd“dd“dd“dd“dd“ddi¥}t	        d«      D �]1  }	 t        j                  t        |t        d¬«      }d|_	        |j                  }t        |«      dk  r7t        d | › d!t        |«      › d"�«       t        j                  d#|d$z   z  «       Œ~g }t        |d%«      }|j!                  d&d'¬(«      D ]Ž  }|j                  d)d«      }t#        |j%                  d'¬*«      «      }	|	rt        |	«      d+k  rŒAt'        j(                  d,|«      sŒX|j+                  d-«      r|nt-        t.        |«      }
|j1                  |	|
d.œ«       Œ� |c S  g S # t2        $ rE}|d/k(  rt        d | › d0|› �«       g cY d }~c S t        j                  d#|d$z   z  «       Y d }~�Œ€d }~ww xY w)1NÚ	labelNameÚpublicInfoListÚsiteIdÚpageSizeÚ15Ú	pageIndexÚisDateÚtrueÚ
dateFormatz
yyyy-MM-ddÚlengthÚ50ÚactiveÚ0ÚorganIdÚtypeÚ4ÚcatIdsÚfileNumr   ÚfilterFileNumÚfromCodeÚsortTypeÚfuzzySearchÚkeyWordsÚ	orderTypeé   é   )ÚparamsÚheadersÚtimeoutúutf-8éô  zAPI Pz small response (z), retryé   é   úhtml.parserÚaT©ÚhrefrC   ©r   é   z/zfxxgk/public/\d+/\d+\.htmlÚhttp)ÚtitleÚurlé   z ERR: )ÚSITE_IDÚstrÚORGAN_IDÚCAT_IDSÚrangeÚrequestsÚgetÚAPI_URLÚHEADERSÚencodingÚtextÚlenr   ÚtimeÚsleepr   Úfind_allr   Úget_textr   ÚsearchÚ
startswithr   ÚBASE_URLÚappendÚ	Exception)Úpager9   ÚattemptÚrÚhtmlÚitemsÚsouprA   rC   rG   ÚfullÚes               r   Ú
fetch_listrg   %   sR  € ðØÐ%ðØ'/´ðØ:DÀdðà”S˜“Yðà (¨&ðà2>Àðð 	�$ðð ! #ðð (1´(ðð =CÀCðð 	”'ð	ð % bð	ð +:¸2ð	ð @JÈ2ð	ð
 	�Bðð
 & rðð
 ,6°rðð
 <GÈñ€Fô ˜“8ó *ˆð	*Ü—‘œW¨V¼WÈbÔQˆAØ ˆAŒJØ—6‘6ˆDÜ�4‹y˜3ŠÜ�e˜D˜6Ð!2´3°t³9°+¸XÐFÔGÜ—
‘
˜1 ¨!¡Ñ,Ô-ØØˆEÜ   }Ó5ˆDà—]‘] 3¨T�]Ó2ò <�Ø—u‘u˜V RÓ(�Ü# A§J¡J°T JÓ$:Ó;�Ù¤ E£
¨Q¢ØÜ—y‘yÐ!@À$ÔGØØ#Ÿ™¨vÔ6‘t¼GÄHÈdÓ<S�Ø—‘ u°TÑ:Õ;ð<ð ŠLð+*ð6 €Iøô ò 	*Ø˜!Š|Ü�e˜D˜6 ¨ sÐ+Ô,Ø—	Ü�J‰J�q˜G a™KÑ(×)Ò)ûð		*ús,   ÁA8FÃB3FÆ	GÆGÆ1GÆ9GÇGc                 óP  — | syt        | d«      }|j                  t        j                  d«      ¬«      D ](  }|j	                  g d¢«      }|sŒ|j                  «        Œ* |j                  dd¬«      D ]V  }|j                  d	d«      }|j                  d¬
«      xs d}t        |xs t        |«      }|j                  d|› d|› d�«       ŒX |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 )Nr   r@   u   ã€�å­—ä½“ï¼š|å­—å�·ï¼š|æ‰“å�°)Ústring)ÚpÚdivÚspanÚtdrA   TrB   rC   rD   u   é™„ä»¶z<p><a href="z">z</a></p>)rl   ÚbÚstrongÚfontÚemÚiÚuÚsÚtablerj   )Ú	separatorr   z<p>z</p>z

)r   rX   r   ÚcompileÚfind_parentÚ	decomposerP   rY   r   r\   Úreplace_withÚunwrapÚnamer]   rK   Újoinr   )Úcontent_htmlÚpage_urlrd   Útagrj   Úa_tagrC   rT   Úfull_urlÚpartsÚelr   s               r   Úextract_clean_textr…   J   s‡  € ÙØÜ˜ }Ó5€Dà�}‰}¤B§J¡JÐ/OÓ$Pˆ}ÓQò ˆØ�O‰OÒ6Ó7ˆÚØ�K‰K�Mðð —‘˜s¨�Ó.ò FˆØ�y‰y˜ Ó$ˆØ�~‰~ Dˆ~Ó)Ò5¨XˆÜ˜8Ò/¤x°Ó6ˆØ×Ñ˜\¨(¨°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«      D ]3  }	 t        j                  | t        d¬«      }d|_        |j
                  } n t        d«      }d	d	d	d
œ}|j                  d«      }|r3t        t        j                  dd	|j                  d¬«      «      «      |d<   t        j                   d|d d «      }|r|j#                  d«      |d<   |j                  dd¬«      }	|	s|j                  dd¬«      }	|	rt%        t'        |	«      | «      |d<   |S # t        $ rL}|dk(  r!t        d| dd  › d|› �«       d	d	d	d
œcY d }~c S t        j                  d|dz   z  «       Y d }~�ŒQd }~ww xY w)Nr7   r8   )r:   r;   r<   rI   zdetail ERR iÎÿÿÿú: r   )rG   Úpublish_dateÚcontentr>   r?   r@   rG   z_\w*$TrD   z(\d{4}-\d{2}-\d{2})i@  rˆ   rk   Úxxgkcontent)Úclass_Úgkwz_contnetr‰   )rN   rO   rP   rR   rS   rT   r^   r   rV   rW   r   Úfindr   r   r   rY   rZ   Úgroupr…   rK   )
rH   r`   ra   rb   rf   rd   ÚresultÚttagÚmÚcontent_divs
             r   Úparse_detailr“   d   sZ  € Ü˜“8ò 
*ˆð		*Ü—‘˜S¬'¸2Ô>ˆAØ ˆAŒJØ—6‘6ˆDÙð
*ô ˜˜}Ó-€DØ¨2¸"Ñ=€FØ�9‰9�WÓ€DÙÜ%¤b§f¡f¨X°r¸4¿=¹=Èt¸=Ó;TÓ&UÓVˆˆw‰Ü
�	‰	Ð(¨$¨u°¨+Ó6€AÙØ!"§¡¨£ˆˆ~ÑØ—)‘)˜E¨-�)Ó8€KÙØ—i‘i ¨n�iÓ=ˆÙÜ.¬s°;Ó/?ÀÓEˆˆyÑØ€Møô% ò 	*Ø˜!Š|Ü�k # c d ) ¨B¨q¨cÐ2Ô3Ø!#°RÀBÑG×GÜ�J‰J�q˜G a™KÑ(×)Ò)ûð		*ús#   �/DÄ	E"ÄEÄ4E"Ä<EÅE"é   c                 ó‚  — t        d| › dt        › �«       g }t        «       }t        d| dz   «      D ]Š  }t	        |«      }d}|D ]4  }|d   |vsŒ|j                  |d   «       |j                  |«       |dz  }Œ6 t        d|› dt        |«      › d|› d	t        |«      › �«       |s nt        j                  d
«       ŒŒ g }t        |d«      D ]‹  \  }	}t        |d   «      }
|
d   r|
d   t        k  rŒ&|j                  |
d   xs |d   |d   |
d   |
d   t        ddœ«       |	dz  dk(  rt        d|	› dt        |«      › �«       t        j                  d«       Œ� |rct        |dd¬«      5 }|D ]+  }|j                  t        j                   |d¬«      dz   «       Œ- 	 d d d «       t        dt        |«      › d|› �«       y t#        j$                  t&        «      }|j)                  d«       |j+                  «       }dx}}|D ]W  }	 |j)                  d|d   |d   |d   |d   |d   |d   |d   xs d d d! |d"   d#f	«       |j,                  dkD  r|dz  }n|dz  }ŒY |j1                  «        |j3                  «        t        d%|› d&|› d'�«       y # 1 sw Y   ŒñxY w# t.        $ r}t        d$|› �«       |dz  }Y d }~Œºd }~ww xY w)(NzCrawl pages=z cutoff=r?   r   rH   ÚPr‡   z items (z new), total g      à?rˆ   rG   r‰   u$   å»ºè®¾é¡¹ç›®çŽ¯å¢ƒå½±å“�è¯„ä»·å®¡æ‰¹)rG   r   rˆ   r‰   Ú	site_nameÚcolumné
   z  ú/g333333Ó?Úwr<   )rS   F)Ú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=   r˜   zcrawl_wuhe_zfxxgk.pyz
DB error: zResult: z new, z skipped)r   ÚCUTOFFÚsetrN   rg   Úaddr]   rU   rV   rW   Ú	enumerater“   r   ÚopenÚwriteÚjsonÚdumpsÚsqlite3Úconnectr   ÚexecuteÚcursorÚrowcountr^   ÚcommitÚclose)ÚpagesÚjson_outÚ	items_allÚseenrj   rc   ÚnewÚitÚenrichedÚidxÚdÚfÚitemÚconnÚcÚstoredÚskippedrf   s                     r   Úcrawlr¼      s  € Üˆ,�u�g˜X¤f XÐ.Ô/Ø€IÜ‹5€DÜ�1�e˜a‘iÓ ò ˆÜ˜1“ˆØˆØò 	ˆBØ�%‰y Ò$Ø—‘˜˜E™Ô#Ø× Ñ  Ô$Ø�q‘‘ð		ô
 	ˆa�ˆs�"”S˜“Z�L ¨¨¨]¼3¸y»>Ð:JÐKÔLÙÙÜ�
‰
�3�ðð €HÜ˜Y¨Ó*ò ‰ˆˆRÜ˜˜E™Ó#ˆØˆ^Ò  >Ñ!2´VÒ!;ØØ�‰Ø�w‘ZÒ. 2 g¡;Ø˜5™	Ø˜nÑ-Ø˜‘|Ü"Ø<ñ
ô 	ð �‰8�qŠ=Ü�"�S�E˜œ3˜y›>Ð*Ð+Ô,Ü�
‰
�3�ðñ  Ü�(˜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±Ð@VðXô	Yð �z‰z˜AŠ~Ø˜!‘‘à˜1‘�øðð  	‡K�K„MØ‡J�J„LÜˆ(�6�(˜&  	¨Ð2Õ3÷9	Eð 	Eûô. ò 	Ü�*˜Q˜CÐ Ô!Ø�q‰L�Gûð	ús%   Å*1JÈAJÊJÊ	J>Ê!J9Ê9J>Ú__main__r?   z--pages=r   z--pages=(\d+)z--json)r­   r®   )N)r”   N)-Ú__doc__r   ÚsysÚosr¤   rV   r¦   rO   r   r   Úbs4r   Úurllib.parser   r   r\   rQ   rL   rM   rJ   ÚDOMAINÚGROUPÚnowÚstrftimerž   ÚenvironrP   r   rR   r   r   rg   r…   r“   r¼   Ú__name__ÚargvÚargsr­   r®   r}   ÚintrZ   rŽ   Úindex© r   r   ú<module>rÎ      s^  ðñ÷ 2× 1× 1Ó 1ß (Ý Ý  àH€	Ø$€ØˆJÐ-Ð
.€Ø€Ø
€Ø
€Ø	€Ø€Ø
ˆ(�,‰,‹.™9¨%Ô0Ñ
0×	:Ñ	:¸:Ó	F€Ø
�*‰*�.‰.˜Ð$5Ó
6€ð KØ!˜
Ð"8¸¸
À.ÐQXÐPYÐYkÐlñn€ò.òò#óJAò4ó6?4ðB ˆ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   