Ë
    ¸¬ujP!  ã                   óð   — 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
ZdZdZedz   ZdZ ej                   dd	«      Zd
dedz   ddœZd„ Zd„ Zdd„Zdd„Zd„ Zd„ Zd„ Zedk(  r e«        yy)u•  
æ–°å¹²åŽ¿äººæ°‘æ”¿åºœ â€” é€šçŸ¥å…¬å‘Š/å…¬ç¤ºå…¬å‘Š
Custom CMS, AJAX API (JSON)
http://www.xingan.gov.cn/news-list-tzgga.html (catid=639)
http://www.xingan.gov.cn/news-list-gongshigonggao.html (catid=47)

Usage: python3 crawl_xingan.py <catid> [incremental_days]
Examples:
  python3 crawl_xingan.py 639        # é€šçŸ¥å…¬å‘Š å…¨é‡�
  python3 crawl_xingan.py 639 90     # é€šçŸ¥å…¬å‘Š å¢žé‡�(æœ€è¿‘90å¤©)
é    N)ÚdatetimeÚ	timedeltau   æ–°å¹²åŽ¿äººæ°‘æ”¿åºœzhttp://www.xingan.gov.cnz/api-ajax_list-{}.htmlg      ø?Ú	SEARCH_DBz/root/search.dbzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36ÚXMLHttpRequestz/news-list-tzgga.htmlz0application/x-www-form-urlencoded; charset=UTF-8)z
User-AgentzX-Requested-WithÚRefererzContent-Typec                 óJ   — ddddœ}|j                  t        | «      d| › �«      S )Nu   å…¬ç¤ºå…¬å‘Šu   é€šçŸ¥å…¬å‘Šu   æ°‘æ„�å¾�é›†)Ú47Ú639Ú159Úcat)ÚgetÚstr)ÚcatidÚnamess     ú!/root/gov_crawler/crawl_xingan.pyÚget_cat_namer   "   s)   € Ø!¨.ÀÑP€EØ�9‰9”S˜“Z 3 u g Ó/Ð/ó    c           	      ó4   — dt        | «      dddddg d¢dg	d	d
œS )NÚ6_newsÚ6ÚnewszY-m-dÚ40Ú20)zis_top DESCzdisplayorder DESCzinputtime DESCÚ Ú1)zajax_type[]Úis_ds)r   )r   s    r   Úbuild_post_datar   '   s2   € ð ”c˜%“j # vØ�T˜4ÚBØð	
ð ñð r   c                 óö   — 	 t        j                  t        j                  | «      t        ||¬«      }|j                  «        |j                  «       }|S # t        $ r}t        d| › d|› �«       Y d }~y d }~ww xY w)N)ÚheadersÚdataÚtimeoutz  API error (page z): )	ÚrequestsÚpostÚAPI_URLÚformatÚHEADERSÚraise_for_statusÚjsonÚ	ExceptionÚprint)Úpage_noÚ	post_datar!   Úrr    Úes         r   Úapi_getr/   3   sl   € ðÜ�M‰Mœ'Ÿ.™.¨Ó1¼7Ø(°'ô;ˆà	×ÑÔØ�v‰v‹xˆØˆøÜò ÜÐ" 7 )¨3¨q¨cÐ2Ô3Üûðús   ‚AA Á	A8ÁA3Á3A8c                 óx  — 	 t        j                  | t        |¬«      }|j                  «        d|_        |j
                  }d}t        j                  d|«      }|r|j                  d«      }n>t        j                  d|«      }|r&t        j                  dd|j                  d«      «      }|j                  d	«      }|d
k  rdddœS |j                  d|«      dz   }d}	|}
|
t        |«      k  rb|	d
kD  r]|j                  d|
«      }|j                  d|
«      }|d
k  rn3|d
k\  r||k  r|	dz  }	|dz   }
n
|	dz  }	|dz   }
|
t        |«      k  r|	d
kD  rŒ]|||
dz
   j                  «       }|rt        |«      dk  rdddœS t        j                  dd„ |«      }||dœS # t        $ r}ddt        |«      dœcY d }~S d }~ww xY w)N)r   r!   zutf-8r   )ÚcontentÚtitleÚerrorz2ArticleTitle[\"\x27 ]*content=[\"\x27]([^\"\x27]+)é   z<title>([^<]+)</title>u    ^æ–°å¹²åŽ¿äººæ°‘æ”¿åºœ[-_â€”â€“]z<div class="show1_wznr"r   zno zoom div)r1   r3   ú>z<divz</div>é   é   é   zempty contentz(href|src)=([\'"])(/)(?![/])c                 ó€   — | j                  d«      dz   | j                  d«      z   t        z   | j                  d«      z   S )Nr4   ú=é   é   )ÚgroupÚBASE_URL)Úms    r   ú<lambda>zfetch_detail.<locals>.<lambda>k   s2   € �!—'‘'˜!“*˜sÑ" Q§W¡W¨Q£ZÑ/´(Ñ:¸Q¿W¹WÀQ»ZÑG€ r   )r1   Ú
full_title)r"   r   r&   r'   ÚencodingÚtextr)   r   ÚreÚsearchr=   ÚsubÚfindÚlenÚstrip)Úitem_urlr!   r-   Úhtmlr.   rA   r?   Ú
zoom_startÚcontent_startÚdepthÚposÚ	next_openÚ
next_closer1   s                 r   Úfetch_detailrR   ?   sÍ  € ð=Ü�L‰L˜¬7¸GÔDˆØ	×ÑÔØˆŒ
Ø�v‰vˆð €JÜ
�	‰	ÐGÈÓN€AÙØ—W‘W˜Q“Z‰
ä�I‰IÐ/°Ó6ˆÙÜŸ™Ð CÀRÈÏÉÐQRËÓTˆJð —‘Ð4Ó5€JØ�A‚~Ø¨Ñ6Ð6Ø—I‘I˜c :Ó.°Ñ2€MØ€EØ
€CØ
”�D“	Š/˜e ašiØ—I‘I˜f cÓ*ˆ	Ø—Y‘Y˜x¨Ó-ˆ
Ø˜Š>ØØ˜Š>˜i¨*Ò4Ø�Q‰JˆEØ˜a‘-‰Cà�Q‰JˆEØ˜q‘.ˆCð ”�D“	Š/˜e a›ið �=  q¡Ð)×/Ñ/Ó1€GÙ”c˜'“l RÒ'Ø¨Ñ8Ð8ô �f‰fØ'ÙGØó€Gð ¨jÑ9Ð9øôU ò =Ø¨´S¸³VÑ<Õ<ûð=ús   ‚?F Æ	F9Æ F4Æ.F9Æ4F9c                 óè  — | st        d«       yt        j                  t        «      }|j	                  «       }d}| D ]o  }	 t        j                  dd|d   «      j                  «       }|j                  d|d   |d   t        › d	|› �|d d
 |d   |d   f«       |j                  dkD  r|dz  }Œq |j                  «        |j                  «        |S # t        $ r}t        d|› �«       Y d }~Œ°d }~ww xY w)Nu     æ— æ•°æ�®æ�’å…¥r   z<[^>]+>r   r1   zšINSERT OR IGNORE INTO gov_raw
                   (title, page_url, site_name, summary, content, publish_date)
                   VALUES (?, ?, ?, ?, ?, ?)r2   Úurlú-iô  Údater4   z  DB insert error: )r*   Úsqlite3ÚconnectÚDB_PATHÚcursorrD   rF   rI   ÚexecuteÚ	SITE_NAMEÚrowcountr)   ÚcommitÚclose)ÚitemsÚcat_nameÚconnÚcÚinsertedÚitemÚ
clean_textr.   s           r   Ú	insert_dbrg   r   s   € ÙÜÐ!Ô"ØÜ�?‰?œ7Ó#€DØ�‰‹€AØ€HØò -ˆð	-ÜŸ™ 
¨B°°Y±Ó@×FÑFÓHˆJØ�I‰Ið0ð �g‘  U¡´	¨{¸!¸H¸:Ð-FØ˜D˜SÐ! 4¨	¡?°D¸±LðBô	ð �z‰z˜AŠ~Ø˜A‘�øð-ð 	‡K�K„MØ‡J�J„LØ€Oøô	 ò 	-ÜÐ'¨ sÐ+×,Ñ,ûð	-ús   Á A,CÃ	C1ÃC,Ã,C1c                  ó  — 	 t        j                  t        «      } | j                  «       }|j	                  d«       | j                  «        | j                  «        t        d«       y # t        $ r}t        d|› �«       Y d }~y d }~ww xY w)Nz4INSERT INTO gov_search(gov_search) VALUES('rebuild')u     FTS é‡�å»ºå®Œæˆ�u     FTS é‡�å»ºå¤±è´¥: )	rW   rX   rY   rZ   r[   r^   r_   r*   r)   )rb   rc   r.   s      r   Úrebuild_ftsri   Œ   sk   € ð*Ü�‰œwÓ'ˆØ�K‰K‹MˆØ	�	‰	ÐHÔIØ�‰ŒØ�
‰
ŒÜÐ"Õ#øÜò *ÜÐ$ Q CÐ(×)Ñ)ûð*ús   ‚A%A( Á(	B	Á1BÂB	c                  ó�
  — t        t        j                  «      dk  r t        d«       t        j                  d«       t        j                  d   } t        | «      }t        t        j                  «      dk\  }|rt        t        j                  d   «      nd}t        dt        › d|› d| › d	�«       |rt        d
|› d�«       nt        d«       t        | «      }t        j                  t        «       t        d|«      }|r|j                  d«      st        d«       y |d   }|j                  dg «      }t        d|› dt        |«      › d�«       |dz   dz  }t        d|› �«       t        d|dz   «      D ]Í  }	t        j                  t        «       t        |	|«      }|r&|j                  d«      r|j                  |d   «       nWt        d|	› d�«       t        j                  d«       t        |	|«      }|r%|j                  d«      r|j                  |d   «       |	dz  dk(  sŒ°t        d|	› d|› dt        |«      › d�«       ŒÏ t        dt        |«      › d�«       t!        j"                  «       }
g }|D ]—  }|j                  dd«      }|sŒ	 t!        j$                  t'        |«      d d  d!«      }|
|z
  j*                  }||k  sŒP|j-                  |j                  d"d«      |j                  d#d«      |d d  |j                  d$«      d%œ«       Œ™ t        d&t        |«      › d�«       |r‡t/        j0                  t2        «      }|j5                  «       }t7        «       }|D ]?  }|j9                  d'|d#   f«       |j;                  «       }|sŒ,|j=                  |d#   «       ŒA |j?                  «        |D �cg c]  }|d#   vsŒ|‘Œ }}t        d(t        |«      › d)t        |«      t        |«      z
  › d*�«       |st        d+«       y g }tA        |«      D ]Å  \  }}tC        |d#   «      }|j                  d,«      r6|dz   dz  dk(  r*t        d-|dz   › dt        |«      › d.t        |«      › d/�«       Œ[|j-                  |j                  d0«      xs |d"   |d#   |d1   |d2   d3œ«       |dz   dz  dk(  sŒœt        d-|dz   › dt        |«      › d.t        |«      › d/�«       ŒÇ t        d4t        |«      › dt        |«      › �«       tE        ||«      }t        d5|› d6�«       tG        «        t        d7|› d8|› d9�«       y # t(        $ r Y �ŒÌw xY wc c}w ):Nr;   z9Usage: python3 crawl_xingan.py <catid> [incremental_days]r4   r<   i'  u   === å¼€å§‹çˆ¬å�– z - z (catid=z) ===u   å¢žé‡�æ¨¡å¼�: æœ€è¿‘ u    å¤©u   å…¨é‡�æ¨¡å¼�Útotalu     â�Œ æ— æ³•èŽ·å�–æ•°æ�®r    u     æ€»è®°å½•: u   , ç¬¬1é¡µ: u    æ�¡é   r8   u     æ€»é¡µæ•°: u	     âš  ç¬¬u   é¡µç©º, ç­‰å¾…å�Žé‡�è¯•...r6   r   u     å·²æ‰«æ�� ú/u    é¡µ, u     åˆ—è¡¨æ‰«æ��å®Œæˆ�: Ú	inputtimer   é
   z%Y-%m-%dr2   rT   Úid)r2   rT   rV   rp   u     æ—¥æœŸè¿‡æ»¤å�Ž: z-SELECT page_url FROM gov_raw WHERE page_url=?u     éœ€æŠ“è¯¦æƒ…: u    æ�¡ (å·²æœ‰ u    æ�¡)u     æ— æ–°å¢žæ•°æ�®r3   u     è¯¦æƒ…è¿›åº¦: u
    (æˆ�åŠŸ: ú)rA   rV   r1   )r2   rT   rV   r1   u     è¯¦æƒ…å®Œæˆ�: æˆ�åŠŸ u
     å…¥åº“: u    æ–°u   === å®Œæˆ�: u	   , æ–°å¢ž u    æ�¡ ===)$rH   ÚsysÚargvr*   Úexitr   Úintr\   r   ÚtimeÚsleepÚ
PAGE_DELAYr/   r   ÚrangeÚextendr   ÚnowÚstrptimer   Ú
ValueErrorÚdaysÚappendrW   rX   rY   rZ   Úsetr[   ÚfetchoneÚaddr_   Ú	enumeraterR   rg   ri   )r   ra   Úis_incrementalÚcutoff_daysr,   r    rk   r`   Útotal_pagesr+   r{   Úfilteredre   Údate_strÚ	item_dateÚ	days_diffrb   rc   Úexisting_urlsÚrowÚitÚto_fetchÚsuccessÚiÚdetailrd   s                             r   Úmainr’   ˜   s  € Ü
Œ3�8‰8ƒ}�qÒÜÐIÔJÜ�‰�Œä�H‰H�Q‰K€EÜ˜EÓ"€HÜœŸ™“] aÑ'€NÙ&4”#”c—h‘h˜q‘kÔ"¸$€Kä	Ðœi˜[¨¨H¨:°X¸e¸WÀEÐ
JÔKÙÜÐ% k ]°$Ð7Õ8äˆnÔä Ó&€Iô 	‡J�JŒzÔÜ�1�iÓ €DÙ�t—x‘x Ô(ÜÐ(Ô)Øà�‰M€EØ�H‰H�V˜RÓ €EÜ	ˆM˜%˜ ¬C°«J¨<°tÐ
<Ô=ð ˜2‘: "Ñ$€KÜ	ˆM˜+˜Ð
'Ô(ô ˜˜K¨!™OÓ,ò PˆÜ�
‰
”:ÔÜ�w 	Ó*ˆÙ�D—H‘H˜VÔ$Ø�L‰L˜˜f™Õ&ä�I˜g˜YÐ&@ÐAÔBÜ�J‰J�qŒMÜ˜7 IÓ.ˆDÙ˜Ÿ™ Ô(Ø—‘˜T &™\Ô*Ø�Q‰;˜!ÓÜ�L  	¨¨;¨-°v¼cÀ%»j¸\ÈÐNÕOðPô 
Ð"¤3 u£: ,¨dÐ
3Ô4ô �,‰,‹.€CØ€HØò ˆØ—8‘8˜K¨Ó,ˆÙØð	Ü ×)Ñ)¬#¨h«-¸¸Ð*<¸jÓIˆIð ˜9‘_×*Ñ*ˆ	Ø˜Ó#Ø�O‰OØŸ™ '¨2Ó.Ø—x‘x  rÓ*Ø   "˜Ø—h‘h˜t“nñ	õ ðô  
Ð¤ H£˜¨dÐ
3Ô4ñ Ü�‰œwÓ'ˆØ�K‰K‹MˆÜ›ˆØò 	/ˆDØ�I‰IÐEØ˜E‘{�nô&à—*‘*“,ˆCÚØ×!Ñ! $ u¡+Õ.ð	/ð 	�
‰
Œà%ÖH�r¨¨E©¸-Ò)G’ÐH€HÐHÜ	ÐœS ›]˜O¨=¼¸X»ÌÈXËÑ9VÐ8WÐW\Ð
]Ô^ÙÜÐ!Ô"Øð €GÜ˜XÓ&ò U‰ˆˆ4Ü˜d 5™kÓ*ˆØ�:‰:�gÔØ�A‘˜‰|˜qÒ ÜÐ(¨¨1©¨¨Q¬s°8«}¨o¸ZÌÈGËÀ~ÐUVÐWÔXØØ�‰Ø—Z‘Z Ó-Ò>°°g±Ø˜‘;Ø˜‘LØ˜iÑ(ñ	
ô 	ð �‰E�R‰<˜1ÓÜÐ$ Q q¡S E¨¬3¨x«=¨/¸ÄCÈÃLÀ>ÐQRÐSÕTðUô 
Ð#¤C¨£L >°´3°x³=°/Ð
BÔCô ˜ (Ó+€HÜ	ˆJ�x�j Ð
%Ô&ô „Mä	ˆL˜˜
 )¨H¨:°XÐ
>Õ?øôs ò 	Úð	üò2 Is   Ê"T3Î2UÎ?UÔ3	U Ô?U Ú__main__)é   )Ú__doc__r(   rD   Úosrv   rr   r"   rW   r   r   Úurllib.parseÚurllibr\   r>   r$   rx   ÚgetenvrY   r&   r   r   r/   rR   rg   ri   r’   Ú__name__© r   r   ú<module>rœ      s¥   ðñ
÷ × Ó Û Û ß (Û à#€	Ø%€Ø
Ð-Ñ
-€Ø€
à
ˆ"�)‰)�KÐ!2Ó
3€ð DØ(ØÐ1Ñ1ØFñ	€ò0ò
	ó	ó0:òfò4	*òt@ðn ˆzÒÙ…Fð r   