Ë
    ¸¬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mZ ddl	m
Z
 ddlmZ  ej                  dd«      ZdZd	Zd
ZddiZdZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd"d„Zd„ Zedk(  rŒ eej>                  «      dkD  rej>                  d   ndZ e dk(  r e«        ye dk(  r e«        ye dk(  rF ed«      Z!e!r ee!«      ng Z" ed ee"«      › d�«       e"dd D ]  \  Z#Z$Z% e&de%› d e#dd! › �«       Œ yyy)#uî   
Crawler: éž�å±±å¸‚è¡Œæ”¿å®¡æ‰¹å±€ - é€šçŸ¥å…¬å‘Š (TRS WCM static HTML)
List: glist.html (page 1), glistN.html (page N+1), 101 pages x 20 = ~2015 items
Detail: /html/ASSPJ/YYYYMM/017xxxxxxxxxxxxx.html
Content div: hwq-info-article-center
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoup)ÚurljoinÚ	SEARCH_DBz/root/search.dbu   éž�å±±å¸‚è¡Œæ”¿å®¡æ‰¹å±€u   é€šçŸ¥å…¬å‘Šzhttp://xzspj.anshan.gov.cnz
User-AgentzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36)
z.docz.docxz.pdfz.xlsz.xlsxz.pptz.pptxz.zipz.rarz.7zée   c                 ó2   — t        dt        › d| › �d¬«       y )Nú[z] T)Úflush)ÚprintÚSITE)Úmsgs    ú'/root/gov_crawler/crawl_anshan_xzspj.pyÚlogr      s   € Ü	ˆAŒdˆV�2�c�UÐ
 4Ö(ó    c                 óì   — | dk(  r
t         › d�}nt         › d| dz
  › d�}	 t        j                  |t        d¬«      }d|_        |j
                  S # t        $ r}t        d| › d	|› �«       Y d
}~y
d
}~ww xY w)z<Fetch list page. page 1 = glist.html, page N+1 = glistN.htmlé   z/assxzspj/zwzx/tzgg/glist.htmlz/assxzspj/zwzx/tzgg/glistz.htmlé   ©ÚheadersÚtimeoutúutf-8z
List page z error: N)ÚBASE_URLÚrequestsÚgetÚHEADERSÚencodingÚtextÚ	Exceptionr   )Úpage_numÚurlÚrÚes       r   Úfetch_list_pager$      s|   € à�1‚}Ü�
Ð8Ð9‰ä�
Ð3°H¸q±L°>ÀÐGˆðÜ�L‰L˜¤g°rÔ:ˆØˆŒ
Ø�v‰vˆøÜò Üˆj˜˜
 (¨1¨#Ð.Ô/Üûðús    .A Á	A3ÁA.Á.A3c                 óö  — g }t        | d«      }|j                  dd„ ¬«      }|s'|j                  dd„ ¬«      }|r|j                  d«      }|r«|j                  dd	¬
«      }|D ]“  }|j                  dd„ ¬«      }|j                  dd„ ¬«      }|sŒ.|sŒ1|j                  d¬«      }	|j                  d«      }
|
sŒW|
j	                  d«      sŒi|
j                  d¬«      }|
d   }|j                  |||	f«       Œ• |S )z*Extract (title, url, date) from list page.úhtml.parserÚulc                 ó   — | r| xr d| v S dS )NÚdisplayF© )Úvs    r   ú<lambda>z!parse_list_page.<locals>.<lambda>3   s   € Á¨Ò)=¨y¸A¨~€ È€ r   )ÚstyleÚdivc                 ó.   — | xr d| j                  «       v S )NÚinfo©Úsplit©Úcs    r   r,   z!parse_list_page.<locals>.<lambda>6   s   € °QÒ5N¸6ÀQÇWÁWÃYÐ;N€ r   ©Úclass_ÚliF)Ú	recursivec                 ó6   — | r| xr d| j                  «       v S dS )NÚtimeFr1   r3   s    r   r,   z!parse_list_page.<locals>.<lambda>=   ó   € ÑTU°qÒ7P¸VÀqÇwÁwÃyÐ=P€ Ð[`€ r   c                 ó6   — | r| xr d| j                  «       v S dS )NÚnameFr1   r3   s    r   r,   z!parse_list_page.<locals>.<lambda>>   r;   r   T©ÚstripÚaÚhref)r   ÚfindÚfind_allÚget_textr   Úappend)ÚhtmlÚitemsÚsoupr'   Úinfo_divÚlisr7   Útime_divÚname_divÚdateÚa_tagÚtitler!   s                r   Úparse_list_pagerP   +   s   € à€Eô ˜˜}Ó-€Dà	�‰�4ÑMˆÓ	N€BÙà—9‘9˜UÑ+N�9ÓOˆÙØ—‘˜tÓ$ˆBá	Ø�k‰k˜$¨%ˆkÓ0ˆØò 		5ˆBØ—w‘w˜uÑ-`�wÓaˆHØ—w‘w˜uÑ-`�wÓaˆHÚšHØ×(Ñ(¨tÐ(Ó4�Ø Ÿ™ cÓ*�Ú˜UŸY™Y vÕ.Ø!ŸN™N°˜NÓ6�EØ ™-�CØ—L‘L %¨¨dÐ!3Õ4ð		5ð €Lr   c                 ó°   — 	 t        j                  | t        d¬«      }d|_        |j                  S # t
        $ r}t        d| › d|› �«       Y d}~yd}~ww xY w)zFetch detail page.r   r   r   zDetail error ú: N)r   r   r   r   r   r   r   )Ú
detail_urlr"   r#   s      r   Úfetch_detailrT   I   sQ   € ðÜ�L‰L˜¬W¸bÔAˆØˆŒ
Ø�v‰vˆøÜò Üˆm˜J˜< r¨!¨Ð-Ô.Üûðús   ‚.1 ±	AºAÁAc                 óR  — ddddœ}t        | d«      }|j                  dd„ ¬«      }|r|j                  d¬«      |d	<   |d	   s:t        j                  d
| «      }|r"|j                  d«      j                  «       |d	<   |j                  dd„ ¬«      }|r<|j                  «       }t        j                  d|«      }|r|j                  d«      |d<   |j                  dd„ ¬«      }|rt        t        |«      «      |d<   |S |j                  d«      }	|	r|	j                  dd¬«      |d<   |S )z.Extract title, date, content from detail page.Ú ©rO   Úpublish_dateÚcontentr&   r.   c                 ó6   — | r| xr d| j                  «       v S dS )Nzhwq-info-article-titleFr1   r3   s    r   r,   zparse_detail.<locals>.<lambda>Z   s#   € Ñab°!Ò2]Ð8PÐTU×T[ÑT[ÓT]Ð8]€ Ðhm€ r   r5   Tr>   rO   z<title>(.*?)</title>r   c                 ó6   — | r| xr d| j                  «       v S dS )Nzhwq-info-article-timeFr1   r3   s    r   r,   zparse_detail.<locals>.<lambda>c   s#   € Ñ_`°Ò1[Ð7NÐRS×RYÑRYÓR[Ð7[€ Ðfk€ r   z(\d{4}-\d{2}-\d{2})rX   c                 ó6   — | r| xr d| j                  «       v S dS )Nzhwq-info-article-centerFr1   r3   s    r   r,   zparse_detail.<locals>.<lambda>k   s#   € Ñde°AÒ4`Ð:SÐWX×W^ÑW^ÓW`Ð:`€ Ðkp€ r   rY   Úbodyú
©Ú	separatorr?   )	r   rB   rD   ÚreÚsearchÚgroupr?   Úextract_clean_textÚstr)
rF   rS   ÚresultrH   Ú	title_divÚmrK   Ú	time_textÚcontent_divr]   s
             r   Úparse_detailrk   T   s,  € à¨2¸"Ñ=€FÜ˜˜}Ó-€Dð —	‘	˜%Ñ(m�	Ón€IÙØ#×,Ñ,°4Ð,Ó8ˆˆw‰Ø�'Š?Ü�I‰IÐ-¨tÓ4ˆÙØŸg™g a›j×.Ñ.Ó0ˆF�7‰Oð �y‰y˜Ñ'kˆyÓl€HÙØ×%Ñ%Ó'ˆ	Ü�I‰IÐ,¨iÓ8ˆÙØ%&§W¡W¨Q£ZˆF�>Ñ"ð —)‘)˜EÑ*p�)Óq€KÙÜ.¬s°;Ó/?Ó@ˆˆyÑð €Mð	 �y‰y˜Ó ˆÙØ $§¡¸ÀD Ó IˆF�9Ñà€Mr   c                 ó   — | syt        | d«      }|j                  dd¬«      D ]R  }|j                  dd«      }|j                  d¬«      xs d}t	        t
        |«      }|j                  d	|› d
|› d�«       ŒT |j                  g d¢«      D ]  }|j                  «        Œ g }|j                  ddg«      D ]u  }|j                  dk(  r|j                  t        |«      «       Œ-|j                  dk(  sŒ=|j                  d«      rŒO|j                  dd¬«      }	|	sŒe|j                  |	«       Œw |rdj                  |«      S | j                  «       S )zDConvert content HTML to text with markdown links, preserving tables.rV   r&   r@   T)rA   rA   r>   u   é™„ä»¶r
   z](ú))ÚspanÚbÚstrongÚfontÚemÚiÚuÚsÚtableÚpr_   z

)r   rC   r   rD   r   r   Úreplace_withÚunwrapr=   rE   re   Úfind_parentÚjoinr?   )
Úcontent_htmlrH   rN   rA   r   Úfull_urlÚtagÚpartsÚelÚts
             r   rd   rd   w   s:  € áØÜ˜ }Ó5€Dð —‘˜s¨�Ó.ò 4ˆØ�y‰y˜ Ó$ˆØ�~‰~ Dˆ~Ó)Ò5¨XˆÜœ8 TÓ*ˆØ×Ñ˜Q˜t˜f B x j°Ð2Õ3ð	4ð �}‰}ÒQÓRò ˆØ�
‰
�ðð €EØ�m‰m˜W c˜NÓ+ò  ˆØ�7‰7�gÒØ�L‰Lœ˜R›Õ!Ø�W‰W˜‹^ B§N¡N°7Õ$;Ø—‘ b°�Ó5ˆAÚØ—‘˜Q•ð ñ "'ˆ6�;‰;�uÓÐ@¨L×,>Ñ,>Ó,@Ð@r   c                 óö  — t        j                  «       t        | dz  ¬«      z
  j                  d«      }t	        d|› d�«       g }t        dt        dz   «      D ]¬  }t        |«      }|s n�t        |«      }|s nŽ|D ];  \  }}}||k  rŒ|rd|j                  «       v s|dk(  rŒ'|j                  |||d	œ«       Œ= t	        d
|› dt        |«      › dt        |«      › d�«       t        j                  d«       t        |«      dk  sŒ¬ n t	        dt        |«      › d�«       g }	t        |d«      D ]Å  \  }
}t        |d   «      }|r2t!        ||d   «      }|d   r|d   |d<   |d   r|d   |d<   |d   |d<   nd|d<   |	j                  |d   |d   |d   |j#                  dd«      t$        › dt&        › �t&        dœ«       |
dz  dk(  rt	        d|
› dt        |«      › �«       t        j                  d«       ŒÇ d}d}dd l}|j+                  t,        «      }|j/                  d«       |j/                  d«       |j1                  «       }|	D ]V  }	 |j/                  d|d   |d    |d    |d   |d   |d   |d   xs dd d! |d"   f«       |j2                  dkD  r|dz  }n|dz  }ŒX |j7                  «        |j9                  «        t	        d$|› d%|› d&�«       y # t4        $ r}t	        d#|› �«       |dz  }Y d }~Œ­d }~ww xY w)'Nr   ©Údaysú%Y-%m-%dzFull crawl (cutoff: rm   r   Úglistú#)rO   r!   rM   z  Page rR   z items (accumulated: ç      à?é   zAfter filter: ú itemsr!   rO   rX   rM   rY   rV   ú-©rO   Úpage_urlrX   rY   Ú	site_nameÚcolumnr   z
  Detail: ú/úPRAGMA journal_mode=WALúPRAGMA busy_timeout=10000ú‰INSERT OR IGNORE INTO gov_raw (site_name, source_url, page_url, title, publish_date, content, summary, category) VALUES (?,?,?,?,?,?,?,?)rŽ   r�   éô  r�   ú
DB error: úResult: ú new, ú skipped)r   Únowr   Ústrftimer   ÚrangeÚ	MAX_PAGESr$   rP   ÚlowerrE   Úlenr:   ÚsleepÚ	enumeraterT   rk   r   r   ÚCOLUMNÚsqlite3ÚconnectÚDB_PATHÚexecuteÚcursorÚrowcountr   ÚcommitÚclose)Úmonths_backÚcutoffÚ	all_itemsÚpgrF   rG   rO   r!   rM   ÚenrichedÚidxÚitemÚdetailÚstoredÚskippedr¢   Úconnr4   r#   s                      r   Ú	crawl_allrµ   “   sI  € Ü�l‰l‹nœy¨k¸BÑ.>Ô?Ñ?×IÑIÈ*ÓU€FÜÐ
˜v˜h aÐ(Ô)à€IÜ�A”y 1‘}Ó%ò ˆÜ˜rÓ"ˆÙÙÜ Ó%ˆÙÙØ %ò 
	ÑˆE�3˜Ø�fŠ}Øá˜' S§Y¡Y£[Ñ0°C¸3²JØØ×ÑØØØñõ ð
	ô 	ˆg�b�T˜œC ›J˜<Ð'<¼SÀ»^Ð<LÈAÐNÔOÜ�
‰
�3Œäˆu‹:˜‹?Ùð-ô0 ˆ.œ˜Y›Ð(¨Ð/Ô0ð €HÜ˜y¨!Ó,ò ‰	ˆˆTÜ˜D ™KÓ(ˆÙÜ! $¨¨U©Ó4ˆFØ�gŠØ & w¡��W‘Ø�nÒ%Ø% nÑ5��V‘Ø$ YÑ/ˆD�ŠOà ˆD�‰Oà�‰Ø˜'‘]Ø˜U™Ø  ™LØ—x‘x 	¨2Ó.Ü ˜6 ¤6 (Ð+Üñ
ô 	ð �‰8�qŠ=Ü�*˜S˜E ¤3 y£>Ð"2Ð3Ô4Ü�
‰
�3�ð-ð2 €FØ€GÛØ�?‰?œ7Ó#€DØ‡L�LÐ*Ô+Ø‡L�LÐ,Ô-Ø�‰‹€AØò ˆð	Ø�I‰Ið,ð �kÑ" D¨Ñ$4°d¸:Ñ6FØ�g‘  ^Ñ 4°d¸9±oØ�y‘/Ò' R¨¨#Ð.°°X±ð@ô	Að �z‰z˜AŠ~Ø˜!‘‘à˜1‘�øðð  	‡K�K„MØ‡J�J„LÜˆ(�6�(˜&  	¨Ð2Õ3øô ò 	Ü�*˜Q˜CÐ Ô!Ø�q‰L�Gûð	ús   É
AKË	K8ËK3Ë3K8c                  ó"  — t        j                  «       t        d¬«      z
  j                  d«      } t	        d| › d�«       t        d«      }|sy t        |«      }|D ���cg c](  \  }}}|| k\  sŒ|j                  d«      rŒd|vsŒ$|||f‘Œ* }}}}g }|D ]m  \  }}	}
t        |	«      }|rt        ||	«      nd	d	d	d
œ}|j                  |d   xs ||	|
|d   t        › dt        › �t        dœ«       t        j                  d«       Œo d}d}dd l}|j!                  t"        «      }|j%                  d«       |j%                  d«       |j'                  «       }|D ]V  }	 |j%                  d|d   |d   |d   |d   |d   |d   |d   xs d	d d |d   f«       |j(                  dkD  r|dz  }n|dz  }ŒX |j-                  «        |j/                  «        t	        d|› d|› d�«       y c c}}}w # t*        $ r}t	        d|› �«       |dz  }Y d }~Œ´d }~ww xY w)Né   rƒ   r…   zIncremental (since rm   r   Úhttpr†   rV   rW   rO   rY   r‹   rŒ   rˆ   r   r‘   r’   r“   rŽ   r�   rX   r”   r�   r•   r–   r—   r˜   )r   r™   r   rš   r   r$   rP   Ú
startswithrT   rk   rE   r   r¡   r:   rŸ   r¢   r£   r¤   r¥   r¦   r§   r   r¨   r©   )r«   rF   rG   r�   rt   ÚdÚfilteredr®   rO   r!   rM   r±   r²   r³   r¢   r´   r4   r°   r#   s                      r   Úcrawl_incrementalr¼   é   sD  € Ü�l‰l‹nœy¨aÔ0Ñ0×:Ñ:¸:ÓF€FÜÐ
˜f˜X QÐ'Ô(ô ˜1Ó€DÙØÜ˜DÓ!€EØ).×pÐp™g˜a  A°!°v³+ÀaÇlÁlÐSYÕFZÐ_fÐnoÒ_o��A�q’	Ðp€HÒpà€HØ$ò Ñˆˆs�DÜ˜CÓ ˆÙ,0”˜d CÔ(ÀÐTVÐceÑ6fˆØ�‰Ø˜G‘_Ò-¨ØØ Ø˜iÑ(Ü ˜6 ¤6 (Ð+Üñ
ô 	ô 	�
‰
�3�ðð €FØ€GÛØ�?‰?œ7Ó#€DØ‡L�LÐ*Ô+Ø‡L�LÐ,Ô-Ø�‰‹€AØò ˆð	Ø�I‰Ið,ð �kÑ" D¨Ñ$4°d¸:Ñ6FØ�g‘  ^Ñ 4°d¸9±oØ�y‘/Ò' R¨¨#Ð.°°X±ð@ô	Að �z‰z˜AŠ~Ø˜!‘‘à˜1‘�øðð  	‡K�K„MØ‡J�J„LÜˆ(�6�(˜&  	¨Ð2Õ3ùôS qøôH ò 	Ü�*˜Q˜CÐ Ô!Ø�q‰L�Gûð	ús1   ÁG!Á.G!Â G!ÂG!ÅAG(Ç(	HÇ1H	È	HÚ__main__r   ÚincrementalÚfullÚlistzPage 1: rŠ   é   z  z | é<   )é$   )'Ú__doc__ÚsysÚosÚjsonra   r:   r   r   r   Úbs4r   Úurllib.parser   Úgetenvr¤   r   r¡   r   r   ÚATTACH_EXTSrœ   r   r$   rP   rT   rk   rd   rµ   r¼   Ú__name__rž   ÚargvÚmoderF   rG   r�   rt   rº   r   r*   r   r   ú<module>rÏ      s@  ðñ÷ )× (× (ß (Ý Ý  à
ˆ"�)‰)�KÐ!2Ó
3€Ø!€Ø	€Ø'€àð  Dð€ð a€Ø€	ò)òòò<ò òFAó8S4òl24ðj ˆzÒÙ˜cŸh™h›-¨!Ò+ˆ3�8‰8�AŠ;°€DØˆ}ÒÙÕØ	�ŠÙ�Ø	�ŠÙ˜qÓ!ˆÙ)-‘ Ô%°2ˆÙˆh‘s˜5“z�l &Ð)Ô*Ø˜R˜a�yò 	'‰GˆAˆq�!Ù�B�q�c˜˜Q˜s ˜V˜HÐ%Õ&ñ	'ð	 
ð r   