Ë
    %&˜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mZmZ ddlm	Z	 ddl
mZ dZdZdZd	d
iZdZd„ Zd„ Zefd„Zd„ Zedk(  r e«        yy)u?  
ä¸–ç§‘ç”Ÿæ€�çŽ¯å¢ƒç§‘æŠ€(è‹�å·ž)æœ‰é™�å…¬å�¸ - å…¬ç¤ºå…¬å‘Š çˆ¬è™«
http://www.sk-env.com/index.php/list-article-cid-238.html

CMS: Custom PHP (thinkcmf-like)
åˆ†é¡µ: /index.php/list-article-cid-238.html + /index.php/list-article-cid-238-p-{N}.html
åˆ—è¡¨: ul > li > a > div.news-int > span (æ ‡é¢˜) + span (æ—¥æœŸ)
è¯¦æƒ…: div.nr-content > p
ç™»å½•å¢™: å�‘å¸ƒæ—¥æœŸ >1ä¸ªæœˆ çš„è¯¦æƒ…é¡µ 302 â†’ /index.php/membernews-login-gid-{id}.html
ç­–ç•¥: --days N (é»˜è®¤31) å�ªæŠ“æœ€è¿‘ N å¤©, åˆ—è¡¨æ—¥æœŸæ—©äºŽ cutoff ç›´æŽ¥è·³è¿‡(é�¿å…�æ’žç™»å½•å¢™), æ•´é¡µå…¨æ—§åˆ™å�œæ­¢ç¿»é¡µ
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoup)Úurljoinz/mnt/data/search.dbz9http://www.sk-env.com/index.php/list-article-cid-238.htmlu   ä¸–ç§‘ç”Ÿæ€�çŽ¯å¢ƒ-å…¬ç¤ºå…¬å‘Šz
User-AgentzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36é   c                 ó0  — t        j                  | t        t        ¬«      }d|_        |j
                  dk7  rt        d|j
                  › d�«       yt        |j                  d«      }|j                  d«      }|st        d	«       y|j                  d
«      }|st        d«       yg }|j                  d«      D ]Û  }|j                  dd¬«      }|sŒ|d   j                  «       }d|vrŒ1|j                  d«      }	d}
d}|	D ]>  }|j                  d¬«      }t        j                  d|«      r|}Œ.t!        |«      dkD  sŒ=|}
Œ@ |
s0|j                  d¬«      j#                  |d«      j                  «       }
t%        | |«      }|j'                  |
||dœ«       ŒÝ |S )z Parse list page and return items©ÚheadersÚtimeoutúutf-8éÈ   z  HTTP z
, stoppingNúhtml.parserzdiv.ny-newsz  No ny-news foundÚulz  No ul foundÚliÚaT)Úhrefr   z/show-article-cid-238-id-ÚspanÚ ©Ústripz\d{4}-\d{2}-\d{2}é   )ÚtitleÚurlÚdate)ÚrequestsÚgetÚHEADERSÚTIMEOUTÚencodingÚstatus_codeÚprintr   ÚtextÚ
select_oneÚfindÚfind_allr   Úget_textÚreÚmatchÚlenÚreplacer   Úappend)Úpage_urlÚrÚsoupÚnewsr   Úitemsr   r   r   Úspansr   r   ÚsÚtxtÚfull_urls                  ú /root/gov_crawler/crawl_skenv.pyÚ
crawl_pager6      s…  € ä�‰�X¤w¼Ô@€AØ€A„JØ‡}�}˜ÒÜ�˜Ÿ™� jÐ1Ô2Øä˜Ÿ™ Ó/€DØ�?‰?˜=Ó)€DÙÜÐ"Ô#Øà	�‰�4‹€BÙÜˆoÔØà€EØ�k‰k˜$Óò FˆØ�G‰G�C˜dˆGÓ#ˆÙØà�‰y�‰Ó ˆØ&¨dÑ2Øà—
‘
˜6Ó"ˆØˆØˆØò 	ˆAØ—*‘* 4�*Ó(ˆCÜ�x‰xÐ,¨cÔ2Ø‘Ü�S“˜A“Ø‘ð	ñ Ø—J‘J T�JÓ*×2Ñ2°4¸Ó<×BÑBÓDˆEä˜8 TÓ*ˆØ�‰˜u¨X¸tÑDÕEð/Fð2 €Ló    c                 ó<  ‡‡— t        j                  «       }|j                  t        t        t
        ¬«      }|j                  | d   i t        ¥dt        i¥t
        d¬«      }d|_        |j                  dk7  sd|j                  v sd	|j                  v rt        d
| d   dd › d�«       yt        |j                  d«      }|j                  d«      }|st        d«       y|j                  g d¢«      D ]  }|j                  «        Œ g Šˆˆfd„Š ‰|«       ‰rdj                  ‰«      n|j!                  dd¬«      }|rt#        |«      dk  ry|j%                  d«      }|r|j!                  d¬«      nd}	t'        j(                  dd|	«      j+                  «       }
|
rt#        |
«      t#        | d   «      k  r| d   }
| d   sM|j                  d«      }|r:t'        j,                  d|j!                  «       «      }|r|j/                  d«      | d<   |
|| d   | d   t0        dœS )z>Fetch and parse detail page. Handle login redirect gracefully.r	   r   ÚRefererT)r
   r   Úallow_redirectsr   r   zclass="login"zmembernews-loginz  Login required: r   Né(   ú...r   zdiv.nr-contentz  No nr-content)ÚscriptÚstyleÚiframec                 óô  •‡— | j                   D ]ç  }t        |dd «      }|dk(  r(|j                  dd¬«      }|sŒ+‰j                  |«       Œ=|dk(  r‰j                  t	        |«      «       Œ]|dk(  r?dj                  |j                  d	g «      «      Št        ˆfd
„dD «       «      rŒ˜ ‰|«       Œ¡|�Œ¤t        |t        «      sŒµ|j                  «       }|sŒÈt        |«      dkD  sŒ×‰j                  |«       Œé y )NÚnameÚpr   T©Ú	separatorr   ÚtableÚdivú Úclassc              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­w)N© )Ú.0ÚkÚclss     €r5   ú	<genexpr>z8fetch_detail.<locals>.extract_content.<locals>.<genexpr>y   s   øè ø€ ÒF A�q˜C”xÑFùs   ƒ)ÚprevÚnextÚreturnbté   )ÚchildrenÚgetattrr&   r+   ÚstrÚjoinr   ÚanyÚ
isinstancer   r)   )ÚnodeÚchildÚtagr3   rM   Úextract_contentÚpartss       @€€r5   r\   z%fetch_detail.<locals>.extract_contentm   sÏ   ù€ Ø—]‘]ò 	&ˆEÜ˜% ¨Ó.ˆCØ�cŠzØ—n‘n¨r¸�nÓ>�ÚØ—L‘L Õ%Ø˜’Ø—‘œS ›ZÕ(Ø˜’à—h‘h˜uŸy™y¨°"Ó5Ó6�ÜÓFÐ)EÔFÔFØÙ Õ&Ø‘¤¨E´3Õ!7Ø—k‘k“m�Úœ3˜s›8 a›<Ø—L‘L Õ%ñ#	&r7   z

r   rC   é   r   u   \s*[-_â€•]\s*.*r   zdiv.nr-infoz(\d{4}-\d{2}-\d{2})é   )r   Úcontentr   r   Ú	site_name)r   ÚSessionr   ÚBASE_URLr   r   r   r    r"   r   r!   r   r#   r%   Ú	decomposerV   r&   r)   r$   r'   Úsubr   ÚsearchÚgroupÚ	SITE_NAME)ÚitemÚsessÚ	list_respÚrespr.   Úcontent_divr[   r`   Ú	title_tagÚ	raw_titleÚ
full_titleÚinfo_divÚmr\   r]   s                @@r5   Úfetch_detailrs   N   s  ù€ ä×ÑÓ€Dð —‘œ¬7¼G�ÓD€Ið �8‰8�D˜‘Kð *Ü
ð*à”8ñ*ô ¨ð ó .€Dð
 €D„Mð ×Ñ˜3Ò /°T·Y±YÑ">ÐBTÐX\×X`ÑX`ÑB`ÜÐ" 4¨¡=°°"Ð#5Ð"6°cÐ:Ô;Øä˜Ÿ™ MÓ2€DØ—/‘/Ð"2Ó3€KÙÜ�Ô!Øà×#Ñ#Ò$AÓBò ˆØ�‰�ðð €Eõ&ñ( �KÔ Ù$)ˆf�k‰k˜%Ô ¨{×/CÑ/CÈbÐX\Ð/CÓ/]€Gá”c˜'“l RÒ'Øð —	‘	˜'Ó"€IÙ2;�	×"Ñ"¨Ð"Ô.À€IÜ—‘Ð*¨B°	Ó:×@Ñ@ÓB€JÙœ˜Z›¬3¨t°G©}Ó+=Ò=Ø˜'‘]ˆ
ð �Š<Ø—?‘? =Ó1ˆÙÜ—	‘	Ð0°(×2CÑ2CÓ2EÓFˆAÙØ Ÿw™w q›z��V‘ð ØØ�V‘Ø�E‰{Üñð r7   c           
      óŠ  — | syt        j                  |d¬«      }|j                  «       }d}| D ]=  }	 |j                  d|d   |d   |d   |d   |d	   f«       |j                  dkD  r|d
z  }Œ? |j                  «        |j                  «        |j                  «        |S # t
        $ r}t        d|› �«       Y d }~ŒŽd }~ww xY w)Nr   é<   )r   zhINSERT OR IGNORE INTO gov_raw (title, content, page_url, publish_date, site_name) VALUES (?, ?, ?, ?, ?)r   r`   r   r   ra   r_   z  DB error: )	Úsqlite3ÚconnectÚcursorÚexecuteÚrowcountÚ	Exceptionr!   ÚcommitÚclose)ÚrecordsÚdb_pathÚconnÚcÚinsertedÚrecÚes          r5   Ú
save_to_dbr…   ž   sÍ   € ÙØÜ�?‰?˜7¨BÔ/€DØ�‰‹€AØ€HØò 
&ˆð		&Ø�I‰Ið)à�W‘˜s 9™~¨s°5©z¸3¸v¹;ÈÈKÑHXÐYôð
 �z‰z˜AŠ~Ø˜A‘�øð
&ð 	‡K�K„MØ‡K�K„MØ‡J�J„LØ€Oøô ò 	&Ü�L  Ð$×%Ñ%ûð	&ús   ³:B!Â!	CÂ*B=Â=Cc            	      ó°  — dd l } | j                  «       }|j                  dt        dd¬«       |j                  dt        dd¬«       |j                  d	t        d d
¬«       |j                  dt        d d¬«       |j                  «       }|j                  r|j                  nt        }|j                  €*t        j                  «       j                  d«      }d|› d�}nMt        j                  «       t        |j                  ¬«      z
  j                  d«      }d|j                  › d|› d�}t        dt        › d�«       t        d|j                  › d|j                  |j                   z   dz
  › �«       t        d|› d�«       d}d}t#        |j                  |j                  |j                   z   «      D �]r  }|dk(  rt$        }	nd|› d�}	t        d|› d�«       t'        |	«      }
|
€t        d|› �«        �n3|
st        d|› �«       ŒTt        d t)        |
«      › d!�«       |
D �cg c]  }|d"   |k\  sŒ|‘Œ }}t)        |
«      t)        |«      z
  }|rt        d#|› d$|› d%�«       |st        d&|› d'�«        n´t        d(t)        |«      › d!�«       |t)        |«      z  }g }|D ]5  }t+        |«      }|r|j-                  |«       t/        j0                  d)«       Œ7 |r-t3        ||«      }||z  }t        d*|› d+t)        |«      › d,�«       nt        d-«       t/        j0                  d.«       �Œu t        d/d0› �«       t        d1|› �«       t        d2|› �«       y c c}w )3Nr   z--startr_   z
Start page)ÚtypeÚdefaultÚhelpz--pageséB   zMax pages to crawlz--daysz@Crawl items within last N days (default: current calendar month)z--dbz%SQLite DB path (default: server path)z%Y-%m-01zcurrent calendar month (>= ú))Údaysz%Y-%m-%dzlast z
 days (>= z=== z ===zPages: z to zDate cutoff: z (older items need login, 302)z7http://www.sk-env.com/index.php/list-article-cid-238-p-z.htmlz
Page r<   z  Stopped at page z  Empty page z  Found z itemsr   z
  Skipped z older than z (login-protected)z  No items within cutoff (z%), stopping (list is date-descending)z	  Fresh: g333333Ó?z  Inserted ú/z newz"  0 inserted (all login-protected)g      à?ú
z(========================================zFresh items found: zTotal inserted: )ÚargparseÚArgumentParserÚadd_argumentÚintrU   Ú
parse_argsÚdbÚDB_PATHrŒ   r   ÚnowÚstrftimer   r!   rh   ÚstartÚpagesÚrangerc   r6   r)   rs   r+   ÚtimeÚsleepr…   )r�   ÚparserÚargsr   ÚcutoffÚcutoff_descÚtotal_insertedÚtotal_freshÚpage_numr,   r0   ÚitÚfresh_itemsÚskippedÚbatchri   Údetailr‚   s                     r5   Úmainr©   ´   sF  € ÛØ×$Ñ$Ó&€FØ
×Ñ˜	¬°Q¸\ÐÔJØ
×Ñ˜	¬°RÐ>RÐÔSØ
×Ñ˜¤s°Dð  @BÐô  CØ
×Ñ˜¤S°$Ð=dÐÔeØ×ÑÓ€DØŸšˆd�gŠg¤g€Gð ‡y�yÐÜ—‘“×(Ñ(¨Ó4ˆØ3°F°8¸1Ð=‰ä—,‘,“.¤9°$·)±)Ô#<Ñ<×FÑFÀzÓRˆØ˜dŸi™i˜[¨
°6°(¸!Ð<ˆÜ	ˆD”�˜4Ð
 Ô!Ü	ˆG�D—J‘J�<˜t D§J¡J°·±Ñ$;¸aÑ$?Ð#@Ð
AÔBÜ	ˆM˜+˜Ð&DÐ
EÔFà€NØ€Kä˜$Ÿ*™* d§j¡j°4·:±:Ñ&=Ó>ó /ˆØ�qŠ=Ü‰HàPÐQYÐPZÐZ_Ð`ˆHä�˜�z Ð%Ô&Ü˜8Ó$ˆàˆ=ÜÐ& x jÐ1Ô2ÚáÜ�M ( Ð,Ô-Øä�œ˜U›˜ FÐ+Ô,ð %*ÖB˜b¨R°©Z¸6Ó-A’rÐBˆÐBÜ�e“*œs ;Ó/Ñ/ˆÙÜ�J˜w˜i |°F°8Ð;MÐNÔOáäÐ.¨v¨hÐ6[Ð\Ô]Ùä�	œ#˜kÓ*Ð+¨6Ð2Ô3Ø”s˜;Ó'Ñ'ˆàˆØò 	ˆDÜ! $Ó'ˆFÙØ—‘˜VÔ$Ü�J‰J�s�Oð		ñ Ü! %¨Ó1ˆHØ˜hÑ&ˆNÜ�K ˜z¨¬3¨u«:¨,°dÐ;Õ<äÐ6Ô8ä�
‰
�3Žð_/ôb 
ˆBˆvˆhˆ-ÔÜ	Ð ˜}Ð
-Ô.Ü	Ð˜^Ð,Ð
-Õ.ùò? Cs   È"MÈ0MÚ__main__)Ú__doc__Úsysr›   r'   r   rv   r   r   Úbs4r   Úurllib.parser   r•   rc   rh   r   r   r6   rs   r…   r©   Ú__name__rJ   r7   r5   ú<module>r°      s~   ðñ
ó Û Û 	Û Û ß (Ý Ý  à
€ØF€Ø-€	ð ð  Dð€ð €ò-ò^Nð` !(ó ò,L/ð\ ˆzÒÙ…Fð r7   