Ë
    ¸¬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ZddlmZ dZ	dZ
dZdZdZd	e	d
z   dœZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)u:   Crawl tzw.nantong.gov.cn - é€šå·žæ¹¾ç¤ºèŒƒåŒº é€šçŸ¥å…¬å‘Šé    N)Údatetimezhttps://tzw.nantong.gov.cnÚtzwnantong_tzggz/root/search.dbé
   é   z<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36ú/tzwjhldkfsfq/tzgg/tzgg.html)z
User-AgentÚRefererc                 óÐ   — t         j                  j                  | t        ¬«      }t         j                  j	                  |d¬«      }|j                  «       j                  dd¬«      S )N)Úheadersé   )Útimeoutzutf-8Úreplace)Úerrors)ÚurllibÚrequestÚRequestr
   ÚurlopenÚreadÚdecode)ÚurlÚreqÚresps      ú&/root/gov_crawler/crawl_tzw_nantong.pyÚfetchr      sP   € Ü
�.‰.×
 Ñ
  ¬gÐ
 Ó
6€CÜ�>‰>×!Ñ! #¨rÐ!Ó2€DØ�9‰9‹;×Ñ˜g¨iÐÓ8Ð8ó    c                  óÎ   — t        t        dz   «      } t        j                  d| «      }|r|j	                  d«      S t        j                  d| «      }|r|j	                  d«      S dS )z*Extract columnId from list page JS config.r   zcolumnId:'([^']+)'é   zcolumnId:"([^"]+)"N)r   ÚBASEÚreÚsearchÚgroup)ÚhtmlÚms     r   Úget_column_idr#      sZ   € ä”Ð6Ñ6Ó7€DÜ
�	‰	Ð'¨Ó.€AÙØ�w‰w�q‹zÐä
�	‰	Ð'¨Ó.€AÙˆ1�7‰7�1‹:Ð$ Ð$r   c           	      óè  — t         › d| › d|› d|› dt        › �	}t        |«      }t        j                  d|«      }|sg S t        j                  |j                  «       «      }|j                  dd«      }g }t        j                  d|«      }	|	D ]¬  }
t        j                  d	|
«      }t        j                  d
|
«      }t        j                  d|
«      }|sŒH|sŒK|j                  d«      }|j                  d«      s	t         |z   }|j                  |j                  d«      ||r|j                  d«      nddœ«       Œ® t        j                  d|«      }|rt        |j                  d«      «      nd}||fS )zLGet article list from TrueCMS API. Returns list of {title, url, date, href}.z>/truecms/messageController/getMessage.do?callback=jq&columnId=z&startrecord=z&endrecord=z	&perpage=z\{.*\}ÚresultÚ z&<record><!\[CDATA\[(.*?)\]\]></record>zhref="([^"]+)"ztitle="([^"]*)"z<span[^>]*>(\d{4}-\d{2}-\d{2})r   Úhttp)Útitler   Údatez <totalrecord>(\d+)</totalrecord>r   )r   ÚPER_PAGEr   r   r   ÚjsonÚloadsr    ÚgetÚfindallÚ
startswithÚappendÚint)Ú	column_idÚstartÚendr   r   r"   ÚdataÚ
result_xmlÚarticlesÚrecordsÚrecÚhref_mÚtitle_mÚdate_mÚhrefÚtotal_mÚtotals                    r   Úget_articles_from_apir@       sW  € äˆVð $Ø$- ;Ø˜5˜' ¨S¨E°¼8¸*ðF€Cô �‹:€Dä
�	‰	�)˜TÓ"€AÙØˆ	Ü�:‰:�a—g‘g“iÓ €DØ—‘˜( BÓ'€Jð €HÜ�j‰jÐBÀJÓO€GØò ˆä—‘Ð,¨cÓ2ˆÜ—)‘)Ð.°Ó4ˆÜ—‘Ð<¸cÓBˆÚ’gØ—<‘< “?ˆDØ—?‘? 6Ô*Ü˜d‘{�Ø�O‰OØ Ÿ™ qÓ)ØÙ+1˜Ÿ™ Qœ°rñõ ðô  �i‰iÐ;¸ZÓH€GÙ%,ŒC�—‘˜aÓ Ô!°!€Eà�Uˆ?Ðr   c                 óˆ  — t        j                  dd| t         j                  ¬«      }t        j                  dd|t         j                  ¬«      }t        j                  dd|t         j                  ¬«      }t        j                  dd|t         j                  ¬«      }t        j                  d	d|t         j                  ¬«      }t        j                  d
d|«      }|j                  d«      D �cg c]  }|j	                  «       ‘Œ }}dj                  |«      }t        j                  d
d|«      }|j	                  «       S c c}w )z4Extract text from HTML, preserving paragraph breaks.z</p>ú

)Úflagsz	<br\s*/?>ú
ú</div>z*</?(?:b|span|font|strong|em|u|i|a)\b[^>]*>r&   z
<p\b[^>]*>z\n{3,})r   ÚsubÚIÚsplitÚstripÚjoin)Ú
html_chunkÚtextÚlÚliness       r   Úextract_clean_textrO   F   sã   € ä�6‰6�'˜6 :´R·T±TÔ:€DÜ�6‰6�,  d´"·$±$Ô7€DÜ�6‰6�)˜V T´·±Ô6€DÜ�6‰6Ð?ÀÀTÔQS×QUÑQUÔV€DÜ�6‰6�-  T´·±Ô6€DÜ�6‰6�)˜V TÓ*€DØ $§
¡
¨4Ó 0Ö1˜1ˆQ�W‰W�YÐ1€EÐ1Ø�9‰9�UÓ€DÜ�6‰6�)˜V TÓ*€DØ�:‰:‹<Ðùò 2s   Ã.D?c                 óä   — g }t        j                  d| t         j                  «      }|D ]4  \  }}t        |z   }|j	                  d|j                  «       › d|› d�«       Œ6 dj                  |«      S )z4Extract attachment links, return as markdown string.zR<a\s[^>]*href="(/truecms/attachmentController/download\.do[^"]*)"[^>]*>([^<]+)</a>ú[z](ú)rD   )r   r.   rG   r   r0   rI   rJ   )r!   ÚpartsÚlinksr=   ÚnameÚfull_urls         r   Úextract_attachmentsrW   T   sq   € à€EÜ�J‰JØ]ØŒb�d‰dó€Eð ò 6‰
ˆˆdÜ˜$‘;ˆØ�‰�q˜Ÿ™›˜ b¨¨
°!Ð4Õ5ð6ð �9‰9�UÓÐr   c                 ó~  — t        | «      }d}t        j                  d|«      }|r|j                  d«      j	                  «       }|sLt        j                  d|«      }|r4t        j
                  dd|j                  d«      «      j	                  «       }d}t        j                  d|«      }|r|j                  d«      }|s)t        j                  d|«      }|r|j                  d«      }d}t        j                  d|«      }	|	r|	j                  d«      j	                  «       }d}
|j                  d	«      }|d
k  r|j                  d«      }|d
kD  rÐ|j                  dd
|«      }|d
k  r|}|j                  d|«      dz   }d}|}|d
kD  r{|t        |«      k  rm|j                  d|«      }|j                  d|«      }|d
k  rnC|d
k\  r ||k  r|dz  }|j                  d|«      dz   }n
|dz  }|dz   }|d
kD  r|t        |«      k  rŒm|d
k(  r|||dz
   n||d }t        |«      }
t        |«      }|r|
r|
dz  }
|
|z  }
|||
|fS )z4Get (title, date, content, source) from detail page.r&   z<h1>([^<]+)</h1>r   z<title>([^<]+)</title>u   \s*[-â€“â€”|_].*$u(   å�‘å¸ƒæ—¶é—´[ï¼š:]\s*(\d{4}-\d{2}-\d{2})z$<span class="fl">(\d{4}-\d{2}-\d{2})u   æ�¥æº�[ï¼š:]\s*([^<]+)z	id="zoom"r   zclass="pp3"z<divú>rE   é   NrB   )r   r   r   r    rI   rF   ÚfindÚrfindÚlenrO   rW   )r   r!   r(   ÚtmÚtm2r)   ÚdmÚdm2ÚsourceÚsmÚcontentÚidxr3   ÚposÚdepthr4   ÚnoÚncÚchunkÚattachmentss                       r   Ú
get_detailrl   a   sK  € ä�‹:€Dð €EÜ	�‰Ð&¨Ó	-€BÙ	Ø—‘˜“×!Ñ!Ó#ˆÙÜ�i‰iÐ1°4Ó8ˆÙÜ—F‘FÐ/°°S·Y±Y¸q³\ÓB×HÑHÓJˆEð €DÜ	�‰Ð>ÀÓ	E€BÙ	Ø�x‰x˜‹{ˆÙÜ�i‰iÐ?ÀÓFˆÙØ—9‘9˜Q“<ˆDð €FÜ	�‰Ð,¨dÓ	3€BÙ	Ø—‘˜!“×"Ñ"Ó$ˆð €GØ
�)‰)�KÓ
 €CØ
ˆQ‚wØ�i‰i˜Ó&ˆØ
ˆQ‚wØ—
‘
˜6 1 cÓ*ˆØ�1Š9ØˆEØ�i‰i˜˜SÓ! AÑ%ˆàˆØˆØ�aŠi˜C¤# d£)šOØ—‘˜6 3Ó'ˆBØ—‘˜8 SÓ)ˆBØ�AŠvØØ�QŠw˜2 š7Ø˜‘
�Ø—i‘i  RÓ(¨1Ñ,‘à˜‘
�Ø˜1‘f�ð �aŠi˜C¤# d£)›Oð $)¨A¢:��S˜˜Q™‘°4¸¸°:ˆÜ$ UÓ+ˆô & dÓ+€KÙÙØ�vÑˆGØ�;Ñˆà�$˜ Ð'Ð'r   c                 ób  — | syt        j                  t        «      }|j                  d«       |j	                  «       }d}| D ]Ú  }|j                  d|d   f«      j                  «       }|rt        d|d   d d › �«       Œ>|d   xs d	d d
 }|j                  dt        |d   |d   |d   |d   |d   r0t        t        j                  |d   d«      j                  «       «      nd|d d |f«       |j                  «        |dz  }t        d|d   d d › d|d   › �«       ŒÜ |j                  «        |S )Nr   zPRAGMA busy_timeout=30000z)SELECT id FROM gov_raw WHERE source_url=?r   z  SKIP: r(   é(   rd   r&   iˆ  zŒINSERT INTO gov_raw (site_name, source_url, page_url, title, publish_date, date_rank, summary, content)
            VALUES (?,?,?,?,?,?,?,?)r)   z%Y-%m-%déÈ   r   z  OK: é2   z | )Úsqlite3ÚconnectÚDB_PATHÚexecuteÚcursorÚfetchoneÚprintÚ	SITE_NAMEr1   r   ÚstrptimeÚ	timestampÚcommitÚclose)r8   ÚconnÚcÚcountÚrÚexistingrd   s          r   Ú
save_to_dbr‚   ¥   sF  € ÙØÜ�?‰?œ7Ó#€DØ‡L�LÐ,Ô-Ø�‰‹€AØ€EØò 8ˆØ—9‘9ÐHÈ1ÈUÉ8È+ÓV×_Ñ_ÓaˆÙÜ�H˜Q˜w™Z¨¨˜_Ð-Ð.Ô/ØØ�Y‘<Ò% 2 u¨Ð-ˆØ	�	‰	ð (ä˜˜%™ ! E¡(¨A¨g©J¸¸&¹	ØJKÈFÊ)ŒS”×"Ñ" 1 V¡9¨jÓ9×CÑCÓEÔFÐYZØ�T�cˆ]˜Gð%ô	&ð
 	�‰ŒØ�‰
ˆÜ��q˜‘z # 2�Ð' s¨1¨V©9¨+Ð6Õ7ð8ð 	‡J�J„LØ€Lr   c                  óL  — t        dt        › d�«       t        «       } | st        d«       y t        d| › �«       t        | dt        «      \  }}|st        d«       y t        d|› d|t        z  dz   › d	�«       t        |«      }t        t        dz   t        |t        t        z  «      dz   t        «      D ]�  }t        |t        z   dz
  |«      }|t        z  dz   }t        d
|› d|› d|› d�«       t        | ||«      \  }}|st        d«        n+t        dt        |«      › d�«       |j                  |«       Œƒ t        dt        |«      › d�«       g }	t        |«      D ]h  \  }
}t        d|
dz   › dt        |«      › d|d   d d › d�«       	 t        |d   «      \  }}}}|	j                  |xs |d   |d   |xs |d   ||dœ«       Œj t#        |	«      }t        d|› dt        |	«      › d�«       y # t        $ r,}t        d|› �«       t        j                   «        Y d }~ŒÂd }~ww xY w)Nz=== Crawling z ===zERROR: Cannot find columnIdzColumn ID: r   zERROR: No articles foundzTotal: z articles (z pages)z
Page z
 (records ú-z)...z  No more items, stoppingz  Got z	 articlesz
=== Total: z articles ===z
[ú/z] r(   rp   z...r   r)   )r(   r   r)   rd   rb   z	  ERROR: z
=== Complete: z new records ===)rw   rx   r#   r@   r*   ÚlistÚrangeÚminÚ	MAX_PAGESr]   ÚextendÚ	enumeraterl   r0   Ú	ExceptionÚ	tracebackÚ	print_excr‚   )r2   r7   r?   Úall_articlesr3   r4   Úpage_numÚitemsÚ_r8   ÚiÚar(   r)   rd   rb   ÚeÚsaveds                     r   Úmainr—   ¾   sQ  € Ü	ˆMœ)˜ DÐ
)Ô*ô “€IÙÜÐ+Ô,ØÜ	ˆK˜	�{Ð
#Ô$ô ,¨I°q¼(ÓC�O€HˆeÙÜÐ(Ô)ØÜ	ˆG�E�7˜+ e¬xÑ&7¸!Ñ&;Ð%<¸GÐ
DÔEä˜“>€Lô ”x !‘|¤S¨´	¼HÑ0DÓ%EÈÑ%IÌ8ÓTò 	#ˆÜ�%œ(Ñ" QÑ&¨Ó.ˆØœHÑ$ qÑ(ˆÜ�˜�z ¨E¨7°!°C°5¸Ð=Ô>Ü(¨°E¸3Ó?‰ˆˆqÙÜÐ-Ô/ÙÜ�”s˜5“z�l )Ð,Ô-Ø×Ñ˜EÕ"ð	#ô 
ˆMœ#˜lÓ+Ð,¨MÐ
:Ô;ð €GÜ˜,Ó'ò "‰ˆˆ1Ü��A�a‘C�5˜œ#˜lÓ+Ð,¨B¨q°©z¸#¸2¨Ð.?¸sÐCÔDð	"Ü+5°a¸±hÓ+?Ñ(ˆE�4˜ &Ø�N‰NØÒ, ! G¡*Ø˜‘xØÒ)  &¡	Ø"Ø ñõ ð	"ô �wÓ€EÜ	Ð˜U˜G 1¤S¨£\ NÐ2BÐ
CÕDøô ò 	"Ü�I˜a˜S�/Ô"Ü×Ñ×!Ñ!ûð	"ús   Æ
;G.Ç.	H#Ç7"HÈH#Ú__main__)Ú__doc__Úsysr   r+   rq   Úurllib.requestr   r�   r   r   rx   rs   r*   r‰   r
   r   r#   r@   rO   rW   rl   r‚   r—   Ú__name__© r   r   ú<module>rž      s„   ðá @ß 8× 8× 8Ý à#€Ø€	Ø
€Ø€Ø€	ð QØÐ4Ñ4ñ€ò
9ò
%ò#òLò
òA(òHò23Eðl ˆzÒÙ…Fð r   