Ë
    ¸¬ujö  ã            	       óÌ  — 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mZmZmZ ddl	Z	ddl
Z
ddlZ e
j                  e
j                  j                  «       dZdZ ej                   dd«      ZdZ ej&                  ej(                  «       ed	¬
«      z
  j+                  d«      ZddiZd„ Zd„ Zd„ Zd!d„Zedk(  r®dej:                  v ZerdndZ e «         e dez   dz   ez   dz    e!e«      z   dz   «        e dez   «        ej
                  «       Z" ee¬«      \  Z#Z$ e d e! e% ej
                  «       e"z
  d«      «      z   dz   «        e d e!e#«      z   d z    e!e$«      z   «       yy)"u<  
ç¦�é¼Žå¸‚-é€šçŸ¥å…¬å‘Š (www.fuding.gov.cn)
==============================
CMS: TRS (TRSWAS5 API)
API: /was5/web/search
æ•°æ�®ç›´æŽ¥ç”¨ API è¿”å›žï¼ˆå�«å®Œæ•´ contentï¼‰ï¼Œä¸�éœ€é€�æ�¡æŠ“è¯¦æƒ…é¡µ

ç”¨æ³•:
    python3 crawl_fuding.py          # å…¨é‡�(æœ€å¤š5é¡µ)
    python3 crawl_fuding.py --test   # æµ‹è¯• 5 æ�¡
é    N)ÚdatetimeÚtimezoneÚ	timedeltau   ç¦�é¼Žå¸‚-é€šçŸ¥å…¬å‘Šz(http://www.fuding.gov.cn/was5/web/searchÚ	SEARCH_DBz/root/search.dbé   iG  )Údaysz%Y-%m-%dz
User-AgentzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36c                 ó>  — ddt        | «      ddddœ}	 t        j                  t        |t        dd¬	«      }d
|_        t        j                  |j                  d¬«      }|S # t        $ r3}t        dt        | «      z   dz   t        |«      dd z   «       Y d}~yd}~ww xY w)u%   è°ƒç”¨ WAS5 API èŽ·å�–åˆ—è¡¨é¡µæ•°æ�®Ú238418Ú10Ú z-docreltimezchnlid=13725)Ú	channelidÚperpageÚpageÚ
searchwordÚorderbyÚclasssqlé   F)ÚparamsÚheadersÚtimeoutÚverifyzutf-8)Ústrictz  ! API fail page z: NéP   )ÚstrÚrequestsÚgetÚAPI_URLÚHEADERSÚencodingÚjsonÚloadsÚtextÚ	ExceptionÚprint)r   r   ÚrÚdataÚes        ú!/root/gov_crawler/crawl_fuding.pyÚ
fetch_pager)      s–   € ð ØÜ�D“	ØØ Ø"ñ€FðÜ�L‰Lœ¨¼È"ÐUZÔ[ˆØˆŒ
ä�z‰z˜!Ÿ&™&¨Ô/ˆØˆøÜò ÜÐ"¤S¨£YÑ.°Ñ5¼¸A»¸sÀ¸ÑCÔDÜûðús   ”AA  Á 	BÁ))BÂBc                 ó(  — g }| j                  dg «      }|D ]ø  }|j                  dd«      j                  «       }|dv rŒ(|j                  dd«      }|j                  dd«      dd }|j                  d	d«      }|r€t        j                  d
d|t        j                  t        j
                  z  ¬«      }t        j                  dd|t        j                  t        j
                  z  ¬«      }|j                  «       }|j                  ||||dœ«       Œú |S )u   ä»Ž API å“�åº”ä¸­æ��å�–æ�¡ç›®ÚdocsÚtitler   )u   æ–‡ç« æ ‡é¢˜u   æ ‡é¢˜Ú	doc_titler   u   å�‘å¸ƒæ—¶é—´ÚurlÚtimeNé
   Úhtmlz<script[^>]*>.*?</script>)Úflagsz<style[^>]*>.*?</style>)r,   r.   ÚcontentÚpub_date)r   ÚstripÚreÚsubÚDOTALLÚIÚappend)r&   Úitemsr+   Údocr,   r.   r4   r3   s           r(   Úparse_api_responser=   /   sü   € à€EØ�8‰8�F˜BÓ€DØò ˆØ—‘˜ Ó$×*Ñ*Ó,ˆàÐOÑOØØ�g‰g�e˜RÓ ˆØ—7‘7˜6 2Ó& s¨Ð+ˆØ—'‘'˜& "Ó%ˆáÜ—f‘fÐ9¸2¸wÌbÏiÉiÔXZ×X\ÑX\ÉnÔ]ˆGÜ—f‘fÐ7¸¸WÌBÏIÉIÔVX×VZÑVZÉNÔ[ˆGØ—m‘m“oˆGØ�‰ØØØØ ñ	
õ 	ðð& €Ló    c                 ó´  — | st        d«       ydd l}|j                  t        «      }|j	                  d«       |j	                  d«       d\  }}| D ]†  }	 |j	                  dt
        |j                  d«      xs dd d	 |j                  d
d«      |j                  dd«      |j                  d«      xs dd d ddf«       |j                  dkD  r|dz  }n|dz  }Œˆ |j	                  dt
        f«       |j                  «        |j                  «        t        dt        |«      z   dz   t        |«      z   dz   «       ||fS # t        $ r}|dz  }Y d }~�Œd }~ww xY w)Nz  - no data©r   r   r   zPRAGMA journal_mode=WALzPRAGMA synchronous=NORMALzxINSERT OR REPLACE INTO gov_raw (site_name, title, page_url, content, publish_date, summary, tags) VALUES (?,?,?,?,?,?,?)r,   r   iô  r.   r3   r4   r0   u   é€šçŸ¥å…¬å‘Šé   z·INSERT INTO gov_search(rowid, title, site_name, summary) SELECT r.id, r.title, r.site_name, r.summary FROM gov_raw r WHERE r.id NOT IN (SELECT rowid FROM gov_search) AND r.site_name=?z  [DB] new: z skip: z FTS synced)r$   Úsqlite3Úconnectr   ÚexecuteÚ	SITE_NAMEr   Útotal_changesr#   ÚcommitÚcloser   )r;   rB   ÚdbÚokÚfailÚitr'   s          r(   Úto_dbrM   H   s^  € ÙÜˆmÔØÛØ	�‰œÓ	#€BØ‡J�JÐ(Ô)Ø‡J�JÐ*Ô+Ø�H€BˆØò ˆð	Ø�J‰Jð)ô Ø—V‘V˜G“_Ò*¨¨D¨SÐ1Ø—F‘F˜5 "Ó%Ø—F‘F˜9 bÓ)Ø—V‘V˜JÓ'Ò-¨2¨s°Ð3ØØ"ðô	ð ×Ñ !Ò#Ø�a‘‘à˜‘	�øð'ð, ‡J�Jð	\ô 
ˆô	ð ‡I�I„KØ‡H�H„JÜ	ˆ.œ3˜r›7Ñ
" YÑ
.´°T³Ñ
:¸]Ñ
JÔKØˆtˆ8€Oøô ò 	Ø�A‰IŽDûð	ús   ÁBD>Ä>	EÅEÅEc           	      óB  — g }t        «       }t        dt        dz   «      D �]  }t        |«      }|r|j	                  d«      st        dt        |«      z   dz   «        nát        |«      }d}|D ]F  }|d   |v rŒ|j                  |d   «       |d   r|d   t        k  rŒ1|j                  |«       |dz  }ŒH |r|d   d   nd}|r|d	   d   nd}	|j	                  d
d«      }
t        dt        |«      z   dz   t        t        |«      «      z   dz   |z   dz   |	z   dz   t        |«      z   dz   t        |
«      z   dz   «       �Œ | r(|d d }t        dt        t        |«      «      z   dz   «       t        dt        t        |«      «      z   dz   «       |syt        |«      \  }}||fS )NrA   r+   z	  - page z: no data, reached endr   r.   r4   ú?éÿÿÿÿÚcountz  [Page ú] z items (z ~ z), new: z	 (total: ú)r   z  TEST mode: z itemsz	  Total: z items (within 3yr)r@   )ÚsetÚrangeÚ	MAX_PAGESr)   r   r$   r   r=   ÚaddÚCUTOFFr:   ÚlenrM   )ÚtestÚ	all_itemsÚ	seen_urlsr   r&   r;   ÚnewÚitemÚfÚlÚtotalrJ   rK   s                r(   Úcrawlrb   r   sä  € Ø€IÜ“€Iä�aœ Q™Ó'ó UˆÜ˜$ÓˆÙ˜4Ÿ8™8 FÔ+Ü�+¤ D£	Ñ)Ð,DÑDÔEÙÜ" 4Ó(ˆØˆØò 	ˆDØ�E‰{˜iÑ'ØØ�M‰M˜$˜u™+Ô&Ø�JÒ D¨Ñ$4´vÒ$=ØØ×Ñ˜TÔ"Ø�1‰H‰Cð	ñ %*ˆE�!‰H�ZÒ ¨sˆÙ%*ˆE�"‰I�jÒ!°ˆØ—‘˜ #Ó&ˆÜˆjœ3˜t›9Ñ$ tÑ+¬c´#°e³*«oÑ=À
ÑJÈQÑNÐQVÑVÐYZÑZÐ]gÑgÔjmÐnqÓjrÑrð  vAñ  Aô  DGð  HMó  DNñ  Nð  QTñ  Tö  	Uð%Uñ( Ø˜b˜q�Mˆ	Üˆo¤¤C¨	£NÓ 3Ñ3°hÑ>Ô?ä	ˆ+œœC 	›NÓ+Ñ
+Ð.CÑ
CÔDÙØä�YÓ�H€BˆØˆtˆ8€Or>   Ú__main__z--testÚTESTÚFULLú[rR   z (max z pages, 3yr)z  API: )rZ   z  Time: rA   Úsz  New: z Skip: )F)&Ú__doc__r6   ÚsysÚosr    r/   r   r   r   r   Úurllib3Údisable_warningsÚ
exceptionsÚInsecureRequestWarningrE   r   Úgetenvr   rV   ÚnowÚutcÚstrftimerX   r   r)   r=   rM   rb   Ú__name__ÚargvrZ   Úmoder$   r   Út0rJ   rK   Úround© r>   r(   ú<module>ry      st  ðñ
÷ × Ó ß 2Ñ 2ß Û 	Ø €× Ñ ˜×+Ñ+×BÑBÔ Cà%€	Ø7€ØˆB�I‰I�kÐ#4Ó5€	Ø€	Øˆh�l‰l˜8Ÿ<™<Ó(©9¸%Ô+@Ñ@×JÑJÈ:ÓV€Øð  Nð  O€òò(ò2(óT!ðF ˆzÒØ�s—x‘xÐ€DÙ‰6˜v€DÙ	„GÙ	ˆ#�	‰/˜DÑ
  4Ñ
'¨(Ñ
2±S¸³^Ñ
CÀnÑ
TÔUÙ	ˆ)�gÑ
ÔØ	ˆ�‰‹€BÙ˜$Ô�H€BˆÙ	ˆ*‘s™5  §¡£¨R¡°Ó3Ó4Ñ
4°sÑ
:Ô;Ù	ˆ)‘c˜"“gÑ
 	Ñ
)©C°«IÑ
5Õ6ð r>   