Ë
    lÊ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ej                  j                  dd«      Z	ddddd	œZ
d
ZdZdZdZdZdZd„ Zd„ Zd„ Zd„ Zd„ Zdefd„Zedk(  r#dej0                  v r
 ed¬«       y ede¬«       yy)u™   
æž�æ±Ÿå¸‚äººæ°‘æ”¿åºœä¿¡æ�¯å…¬å¼€-è¡Œæ”¿è®¸å�¯ï¼ˆå®œæ˜Œå¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€æž�æ±Ÿå¸‚åˆ†å±€ï¼‰
http://xxgk.zgzhijiang.gov.cn/list.html?depid=189&catid=663
é    NÚ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*/*zzh-CN,zh;q=0.9,en;q=0.8z;http://xxgk.zgzhijiang.gov.cn/list.html?depid=189&catid=663)z
User-AgentÚAcceptzAccept-LanguageÚRefereru4   å®œæ˜Œå¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€æž�æ±Ÿå¸‚åˆ†å±€-è¡Œæ”¿è®¸å�¯u   æž�æ±Ÿé   é   zphttp://www.zgzhijiang.gov.cn/show/lists?jsoncallback=jq&areaid=9&webid=189&cid=663&page=%d&pagenums=%d&orderby=0zPhttp://www.zgzhijiang.gov.cn/show/detail?jsoncallback=jq&areaid=9&id=%s&cache=onc                 óÞ  — t        d«      D ]­  }	 t        j                  | t        d¬«      }|j                  j                  «       }|st        d«      ‚|j                  d«      sd|d d v rt        d«      ‚t        j                  d	d
|«      }t        j                  dd
|«      }t        j                  |«      c S  y # t        $ r&}|dk  rt        j                  d«       n‚ Y d }~ŒÛd }~ww xY w)Né   é<   )ÚheadersÚtimeoutzEmpty responseú<Ú404éÈ   zGot HTML page instead of JSONz^\s*[^(]*\(Ú z\)\s*$é   r   )ÚrangeÚrequestsÚgetÚHEADERSÚtextÚstripÚ
ValueErrorÚ
startswithÚreÚsubÚjsonÚloadsÚ	ExceptionÚtimeÚsleep)ÚurlÚattemptÚrr   Úes        ú/root/gov_crawler/crawl_zjjg.pyÚ
fetch_jsonr&      sÎ   € Ü˜“8ò ˆð	Ü—‘˜S¬'¸2Ô>ˆAØ—6‘6—<‘<“>ˆDÙÜ Ð!1Ó2Ð2à�‰˜sÔ# u°°T°c°
Ñ':Ü Ð!@ÓAÐAä—6‘6˜.¨"¨dÓ3ˆDÜ—6‘6˜) R¨Ó.ˆDÜ—:‘:˜dÓ#Ò#ñøô ò 	Ø˜Š{Ü—
‘
˜1•àô ûð	ús   �B(B=Â=	C,ÃC'Ã'C,c                 óÂ  — g }g }t        j                  d| t         j                  t         j                  z  «      D ]q  }|j	                  d«      }t        j
                  dd|j	                  d«      «      j                  «       }|j                  |xs |j                  d«      d   |dœ«       Œs t        j                  d	| «      D ](  }|j                  |j                  d«      d   |dœ«       Œ* t        j                  d
| t         j                  t         j                  z  «      D ]·  }|j	                  d«      }|j	                  d«      j                  d«      r!|j                  |j	                  d«      «       ŒU|j	                  d«      }	t        j
                  dd|	«      }	t        j
                  dd|	«      }	|	j                  «       }	|	sŒ§|j                  |	«       Œ¹ dj                  |«      }
|
rt        |
j                  «       «      dk  rNt        j
                  dd| «      }t        j
                  dd|«      j                  «       }|rt        |«      dkD  r|}
|
|fS )zDParse HTML content into plain text with preserved paragraphs/tables.zG<a[^>]*href="([^"]*\.(?:pdf|doc|docx|xls|xlsx|rar|zip))"[^>]*>(.*?)</a>é   z<[^>]+>r   r   ú/éÿÿÿÿ©Únamer!   z<img[^>]*src="([^"]+)"z+<p[^>]*>(.*?)</p>|<table[^>]*>(.*?)</table>r   z<tablez&[nN][bB][sS][pP];ú z

r   z\s+)r   ÚfinditerÚIÚDOTALLÚgroupr   r   ÚappendÚsplitÚfindallr   ÚjoinÚlen)Úcontent_htmlÚpartsÚattachmentsÚa_tagÚlink_urlÚ	link_textÚimg_urlÚelemÚtagÚp_textÚcontentr   s               r%   Úextract_content_from_htmlrB   .   s  € à€EØ€Kô —‘ÐgÐiuÔwy×w{Ñw{ô  A÷  Hñ  Hñ  xHó  Iò \ˆØ—;‘;˜q“>ˆÜ—F‘F˜: r¨5¯;©;°q«>Ó:×@Ñ@ÓBˆ	Ø×Ñ IÒ$H°·±ÀÓ1DÀRÑ1HÐQYÑZÕ[ð\ô —:‘:Ð7¸ÓFò MˆØ×Ñ G§M¡M°#Ó$6°rÑ$:À7ÑKÕLðMô —‘ÐJÈLÔZ\×ZcÑZcÔfh×fjÑfjÑZjÓkò 
%ˆØ�j‰j˜‹mˆØ�9‰9�Q‹<×"Ñ" 8Ô,Ø�L‰L˜Ÿ™ 1›Õ&à—Z‘Z “]ˆFÜ—V‘V˜J¨¨FÓ3ˆFÜ—V‘VÐ1°3¸Ó?ˆFØ—\‘\“^ˆFÚØ—‘˜VÕ$ð
%ð �k‰k˜%Ó €Gñ ”c˜'Ÿ-™-›/Ó*¨RÒ/Ü�v‰v�j # |Ó4ˆÜ�v‰v�f˜c 4Ó(×.Ñ.Ó0ˆÙ”C˜“I ’NØˆGà�KÐÐó    c                 ó�   — t         | t        fz  }t        |«      }|j                  dg «      }t	        d| t        |«      fz  «       |S )zFetch list items from API.Úlistsz  Page %d: %d items)ÚLIST_APIÚPER_PAGEr&   r   Úprintr6   )Úpager!   ÚdataÚitemss       r%   Úfetch_list_pagerL   V   sF   € ä
�dœHÐ%Ñ
%€CÜ�c‹?€DØ�H‰H�W˜bÓ!€EÜ	Ð
 4¬¨U«Ð"4Ñ
4Ô5Ø€LrC   c                 óæ   — d| d   z  }| j                  dd«      j                  «       }| j                  dd«      j                  «       }|rt        |«      dkD  r|dd }|||| d   t        | d   z  dœS )	zParse a list API item.z3http://xxgk.zgzhijiang.gov.cn/show.html?aid=9&id=%sÚn_idÚtitler   Úvc_inputtimeé
   N)r!   rO   ÚdaterN   Úapi_url)r   r   r6   Ú
DETAIL_API)Úitemr!   rO   Údate_strs       r%   Úparse_list_itemrW   _   s�   € à
?À$ÀvÁ,Ñ
N€CØ�H‰H�W˜bÓ!×'Ñ'Ó)€EØ�x‰x˜¨Ó+×1Ñ1Ó3€HÙ”C˜“M BÒ&Ø˜C˜R�=ˆàØØØ�V‘Ü  V¡Ñ,ñð rC   c                 ó&  — t        | «      }t        |t        «      rt        |«      dkD  r|d   }nt        |t        «      r|}ny|j                  dd«      j                  «       }|j                  dd«      }|rt        |«      dkD  r|dd }|j                  dd«      }t        |«      \  }}|j                  dd«      }|r;|j                  «       r+|d	k7  r&|j                  |j                  d
«      d   |dœ«       |||||j                  dd«      |dœS )zFetch detail via API.r   NrO   r   rP   rQ   rA   ÚfujianÚ0r)   r*   r+   )rO   rA   rR   r9   Ú	raw_titleÚraw_content)
r&   Ú
isinstanceÚlistr6   Údictr   r   rB   r2   r3   )	rS   rJ   ÚrecordrO   Úpub_dater7   rA   r9   rY   s	            r%   Úfetch_detailrb   o   s	  € ä�gÓ€DÜ�$œÔ¤# d£)¨a¢-Ø�a‘‰Ü	�Dœ$Ô	Ø‰àà�J‰J�w Ó#×)Ñ)Ó+€EØ�z‰z˜.¨"Ó-€HÙ”C˜“M BÒ&Ø˜C˜R�=ˆà—:‘:˜i¨Ó,€LÜ4°\ÓBÑ€Gˆ[ð �Z‰Z˜ "Ó%€FÙ�&—,‘,”. V¨s¢]Ø×Ñ F§L¡L°Ó$5°bÑ$9À&ÑIÔJð ØØØ"Ø—Z‘Z ¨Ó,Ø#ñð rC   Fc                 óV  — dd l }g }t        «       }t        d|dz   «      D ]l  }	 t        |«      }|D ]F  }|j                  dd«      }	|	|v rŒ|j                  |	«       t        |«      }
|j                  |
«       ŒH | sŒ]t        |«      dk\  sŒl n t        dt        |«      z  «       | rµ|d d D ]¬  }t        d|d	   d d
 z  «       t        |d   «      }|sŒ(t        d|d	   z  «       t        d|d   z  «       t        dt        |d   «      |d   d d fz  «       t        dt        |d   «      z  «       |d   d d D ]  }t        d|d   ›d|d   d d ›�«       Œ Œ® y |j                  t        d¬«      }|j                  d«       |j                  «       }d}d}t        |«      }t!        |«      D ]ð  \  }}|j                  d|d   f«       |j#                  «       r|dz  }Œ2	 t        |d   «      }|s|dz  }ŒI|d   rt%        j&                  |d   d¬«      nd}|j                  d |d	   |d   |d	   d!z   t(        z   d!z   |d   r|d   d d ndz   |d   xs |d   |d   t(        |t*        |d   f	«       |dz  }|d"z  dk(  sŒÑ|j-                  «        t        d#||fz  «       Œò |j-                  «        |j/                  «        t        d$|||fz  «       y # t        $ r}t        d||fz  «       Y d }~�ŒÓd }~ww xY w# t        $ r$}t        d|d   ›d|›�«       |dz  }Y d }~�Œtd }~ww xY w)%Nr   r(   z  Error on page %d: %srN   r   r	   z
Total unique items: %dz
=== %s ===rO   é(   rS   z  Title: %sz
  Date: %srR   z  Content (%d chars): %srA   r   z  Attachments: %dr9   z    r,   z -> r!   r
   )r   zPRAGMA busy_timeout=30000z)SELECT id FROM gov_raw WHERE page_url = ?z  Error fetching z: F)Úensure_asciiz§INSERT INTO gov_raw (title, content, summary, publish_date, page_url, site_name, attachments, group_name, source_url)
               VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)r-   rQ   z  Progress: %d/%d inserted...z-
Done. Inserted: %d, Existing: %d (total: %d))Úsqlite3Úsetr   rL   r   rH   r   ÚaddrW   r2   r6   rb   Úconnectr   ÚexecuteÚcursorÚ	enumerateÚfetchoner   ÚdumpsÚ	SITE_NAMEÚGROUPÚcommitÚclose)Ú	test_modeÚ	max_pagesrf   Ú	all_itemsÚseen_idsrI   rJ   r$   rU   rN   ÚparsedÚresultÚattÚconnÚcÚinsertedÚexistingÚtotalÚidxÚattachments_jsons                       r%   Úcrawlr�   �   s”  € Ûà€IÜ‹u€Hä�a˜ Q™Ó'ò ˆð	Ü" 4Ó(ˆDð
 ò 	%ˆDØ—8‘8˜F BÓ'ˆDØ�xÑØØ�L‰L˜ÔÜ$ TÓ*ˆFØ×Ñ˜VÕ$ð	%ò œ˜Y›¨1Ó,Ùð!ô$ 
Ð
$¤s¨9£~Ñ
5Ô6áØ˜b˜q�Mò 		KˆDÜ�. 4¨¡=°°"Ð#5Ñ5Ô6Ü! $ y¡/Ó2ˆFÚÜ�m f¨W¡oÑ5Ô6Ü�l V¨F¡^Ñ3Ô4ÜÐ0´C¸¸yÑ8IÓ4JÈFÐS\ÑL]Ð^bÐ_bÐLcÐ3dÑdÔeÜÐ)¬C°°}Ñ0EÓ,FÑFÔGØ! -Ñ0°°!Ð4ò K�CÝ¨C°«K¸¸U¹ÀCÀR¹ÐIÕJñKð		Kð 	à�?‰?œ7¨Bˆ?Ó/€DØ‡L�LÐ,Ô-Ø�‰‹€Aà€HØ€HÜ�	‹N€Eä˜yÓ)ò %G‰	ˆˆTØ	�	‰	Ð=ÀÀUÁ¸~ÔNØ�:‰:Œ<Ø˜‰MˆHØð	Ü! $ y¡/Ó2ˆFñ Ø˜‰MˆHØàTZÐ[hÒTiœ4Ÿ:™: f¨]Ñ&;È%ÕPÐoqÐà	�	‰	ð5ð �w‘Ø�yÑ!Ø˜‘ 3Ñ&¬Ñ2°SÑ8ÐW]Ð^gÒWh¸FÀ9Ñ<MÈdÈsÑ<SÐnpÑqØ�v‘Ò. $ v¡,Ø�U‘ÜØ ÜØ�Y‘ð
ô	
ð 	�A‰ˆØ�b‰=˜AÓØ�K‰KŒMÜÐ1°X¸uÐ4EÑEÕFðK%GðN 	‡K�K„MØ‡J�J„LÜ	Ð
:¸hÈÐRWÐ=XÑ
XÕYøô_ ò 	ÜÐ*¨d°A¨YÑ6Ô7Ýûð	ûô\ ò 	Ý¨t°F«|¹QÐ?Ô@Ø˜‰MˆHÝûð	ús/   ¤KÇ"K;Ë	K8ËK3Ë3K8Ë;	L(ÌL#Ì#L(Ú__main__z--testT)rs   )rs   rt   )Ú__doc__r   ÚsysÚosr   r   r   Úenvironr   r   r   ro   rp   rG   Ú	MAX_PAGESrF   rT   r&   rB   rL   rW   rb   r�   Ú__name__Úargv© rC   r%   ú<module>r‹      s¸   ðñ÷ )× (× (à
�*‰*�.‰.˜Ð$5Ó
6€ð DØØ0ØLñ	€ð C€	Ø€Ø€Ø€	à}€Ø_€
òò*% òPòò ðB  Yó XZðv ˆzÒØ�3—8‘8ÑÙ˜Öá˜¨Ö3ð	 rC   