Ë
    —¦—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ddlZddlmZ ddl	m
Z
 ddlmZ dZdZdZd	Zd
ZdZdZddd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)ut  
Crawler for è‹�é”¡é€šç§‘æŠ€äº§ä¸šå›­åŒº - çŽ¯ä¿�å…¬ç¤º
CMS: TrueCMS jPage (embedded initData)
List: #initData div with 27 items (single page, no AJAX access)
Detail: #zoom.test-1 content, div.container-main-title title, Meta PubDate

Usage:
    python3 crawl_stpac_hbgs.py             # Full crawl (all items)
    python3 crawl_stpac_hbgs.py --max-pages 1  # Incremental
é    N)Údatetime)ÚBeautifulSoup)Úurljoinz/root/search.dbu(   è‹�é”¡é€šç§‘æŠ€äº§ä¸šå›­åŒº-çŽ¯ä¿�å…¬ç¤ºu   é¡¹ç›®çŽ¯ä¿�å…¬ç¤ºu   æ±Ÿè‹�zhttp://www.stpac.gov.cnz.http://www.stpac.gov.cn/stkjcyy/hbgs/hbgs.htmlé   zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36z?text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8zzh-CN,zh;q=0.9,en;q=0.8)z
User-AgentÚAcceptzAccept-Languagec                 ó   — t        | «      S )u'   ä¿�ç•™ HTML è¡¨æ ¼ç»“æž„ï¼ˆä¸�è½¬ mdï¼‰)Ústr)ÚtableÚargsÚkwargss      ú%/root/gov_crawler/crawl_stpac_hbgs.pyÚtable_to_mdr   $   s   € äˆu‹:Ðó    c                 óê  — g }| j                   D �]Q  }t        |t        «      r%|j                  «       }|sŒ'|j	                  |«       Œ9|j
                  dk(  rp|j                  dd«      j                  «       }|j                  d¬«      }|r'|r%t        ||«      }|j	                  d|› d|› d�«       Œ£|sŒ¦|j	                  |«       Œ¸|j
                  d	k(  rU|j                  d
d«      }|sŒÜ|j                  dd«      }	t        ||«      }
|j	                  |	r	d|	› d|
› d�nd|
› d�«       �Œt        |d«      s�Œ*|j                  dd¬«      }|s�ŒA|j	                  |«       �ŒT dj                  |«      S )NÚaÚhrefÚ T©Ústripú[ú](ú)ÚimgÚsrcÚaltú![ú![](Úget_textú )ÚcontentsÚ
isinstancer	   r   ÚappendÚnameÚgetr   r   ÚhasattrÚjoin)Úp_tagÚ
detail_urlÚpartsÚelemÚtr   ÚtextÚfullr   r   Úfull_srcs              r   Úrender_paragraphr/   (   sK  € Ø€EØ—‘ó  ˆÜ�dœCÔ Ø—
‘
“ˆAÚØ—‘˜Q•Ø�Y‰Y˜#ÒØ—8‘8˜F BÓ'×-Ñ-Ó/ˆDØ—=‘= t�=Ó,ˆDÙ™Ü˜z¨4Ó0�Ø—‘˜q   b¨¨¨aÐ0Õ1ÚØ—‘˜TÕ"Ø�Y‰Y˜%ÒØ—(‘(˜5 "Ó%ˆCÚØ—h‘h˜u bÓ)�Ü" :¨sÓ3�Ø—‘¹˜r #  b¨¨
°!Ñ4À4ÈÀzÐQRÐASÖTÜ�T˜:Ö&Ø—‘˜c¨�Ó.ˆAÛØ—‘˜Q–ð- ð. �8‰8�E‹?Ðr   c           	      ó6  — g }t        «       }| j                  ddg«      D ]  }|j                  «        Œ | j                  D �]E  }|j                  €Œ|j                  j                  «       }|dk(  r!t        ||«      }|sŒ?|j                  |«       ŒQ|dk(  rA|j                  d¬«      }t        |«      dk  rŒwt        |«      }	|	sŒ…|j                  |	«       Œ—|dk(  r}t        |«      |v rŒª|j                  t        |«      «       |j                  d	d
«      }
|
sŒÙ|j                  dd
«      }t        ||
«      }|j                  |r	d|› d|› d�nd|› d�«       �Œ|dv s�Œ|j                  g d¢d¬«      D �]  }t        |«      |v rŒ|j                  t        |«      «       |j                  dk(  r!t        ||«      }|sŒJ|j                  |«       Œ\|j                  dk(  rA|j                  d¬«      }t        |«      dk  rŒŒt        |«      }	|	sŒš|j                  |	«       Œ¬|j                  dk(  sŒ¼|j                  d	d
«      }
|
sŒÑ|j                  dd
«      }t        ||
«      }|j                  |r	d|› d|› d�nd|› d�«       �Œ �ŒH dj                  |«      S )NÚscriptÚstyleÚpr
   Tr   é   r   r   r   r   r   r   r   r   )ÚdivÚsectionÚcenter)r3   r
   r   )Ú	recursiveú

)ÚsetÚfind_allÚ	decomposeÚchildrenr#   Úlowerr/   r"   r   Úlenr   ÚidÚaddr$   r   r&   )Úcontent_divr(   r)   Ú	processedÚsÚchildÚtnÚtxtÚall_textÚmdr   r   r.   Úsubs                 r   Úextract_contentrK   D   su  € Ø€EÜ“€Ià×!Ñ! 8¨WÐ"5Ó6ò ˆØ	�‰�ðð ×%Ñ%ó 1]ˆØ�:‰:ÐØØ�Z‰Z×ÑÓˆà�Š9Ü" 5¨*Ó5ˆCÚØ—‘˜SÕ!à�7Š]Ø—~‘~¨D�~Ó1ˆHÜ�8‹}˜rÒ!ØÜ˜UÓ#ˆBÚØ—‘˜RÕ à�5Š[Ü�%‹y˜IÑ%ØØ�M‰Mœ"˜U›)Ô$Ø—)‘)˜E 2Ó&ˆCÚØ—i‘i  rÓ*�Ü" :¨sÓ3�Ø—‘¹˜r #  b¨¨
°!Ñ4À4ÈÀzÐQRÐASÖTàÐ/Ó/Ø—~‘~Ò&;Àt�~ÓLó ]�Ü�c“7˜iÑ'ØØ—‘œb ›gÔ&Ø—8‘8˜s’?Ü*¨3°
Ó;�CÚØŸ™ SÕ)Ø—X‘X Ò(Ø"Ÿ|™|°$˜|Ó7�HÜ˜8“} rÒ)Ø Ü$ SÓ)�BÚØŸ™ RÕ(Ø—X‘X Ó&ØŸ'™' %¨Ó,�CÚØ!Ÿg™g e¨RÓ0˜Ü#*¨:°sÓ#;˜ØŸ™Á r¨#¨¨b°°
¸!Ñ%<È4ÐPXÈzÐYZÐI[Ö\ò)]ð;1]ðf �;‰;�uÓÐr   c                 ó„  — g }t        «       }| j                  dd¬«      D ]�  }|d   }t        j                  d|t        j                  «      sŒ.t        ||«      }|j                  d¬«      xs& |j                  d«      d   j                  d	«      d
   }||vsŒy|j                  |«       |j                  ||dœ«       ŒŸ |S )Nr   T)r   r   z&\.(pdf|doc|docx|xls|xlsx|rar|zip|txt)$r   ú/éÿÿÿÿú?r   )r#   Úurl)
r:   r;   ÚreÚsearchÚIr   r   ÚsplitrA   r"   )Úsoupr(   ÚattsÚseenr   r   Úfull_urlr#   s           r   Úextract_attachmentsrY   ƒ   s²   € Ø€DÜ‹5€DØ�]‰]˜3 Tˆ]Ó*ò =ˆØ�‰yˆÜ�9‰9Ð>ÀÄbÇdÁdÕKÜ˜z¨4Ó0ˆHØ—:‘: D�:Ó)ÒN¨T¯Z©Z¸«_¸RÑ-@×-FÑ-FÀsÓ-KÈAÑ-NˆDØ˜tÒ#Ø—‘˜Ô"Ø—‘ T°(Ñ;Õ<ð=ð €Kr   c                 ó.  — 	 t        j                  | t        d¬«      }d|_        t        |j                  d«      }d}|j                  d	d
di¬«      }|r$|j                  d«      r|d   j                  «       }|s|j                  d	d
di¬«      }|s'|j                  dd¬«      }|r|j                  d¬«      }|sL|j                  d«      }|r9|j                  d¬«      }t        j                  dd|«      j                  «       }|}d}	|j                  d	d
di¬«      }|rŠ|j                  d«      ryt        j                  d|d   j                  «       «      }
|
rPdt!        |
j#                  d«      «      t!        |
j#                  d«      «      t!        |
j#                  d«      «      fz  }	|	s3t        j$                  d|j                  «      }|r|j#                  d«      }	|j                  dd¬«      }t'        || «      }|rt)        || «      }nd}t+        |j                  «       «      dk  r�d| › d|› d �}|j-                  d!«      }g }|D ]U  }|j                  d"d«      }|sŒt/        | |«      }|j                  d#d«      }|j1                  |r	d$|› d%|› d&�nd'|› d&�«       ŒW |r|d(d(j3                  |«      z   z  }|r|D ]  }|d)|d
   › d%|d*   › d&�z  }Œ ||	||fS # t        $ r1}t        d| › d|› �t        j                  ¬«       d d d g fcY d }~S d }~ww xY w)+Né   ©ÚheadersÚtimeoutúutf-8z  fetch_detail error z: ©Úfileúhtml.parserr   Úmetar#   ÚArticleTitle)ÚattrsÚcontentr5   zcontainer-main-title©Úclass_Tr   Útitleu>   \s*[-_â€”|]+\s*(?:çŽ¯ä¿�å…¬ç¤º|è‹�é”¡é€šç§‘æŠ€äº§ä¸šå›­åŒº).*$ÚPubDateõ)   (\d{4})[-/å¹´.](\d{1,2})[-/æœˆ.](\d{1,2})ú%04d-%02d-%02dr   é   é   u)   å�‘å¸ƒæ—¶é—´[ï¼š:]?\s*(\d{4}-\d{2}-\d{2})Úzoom©r@   z<p><a href="z">z</a></p>r   r   r   r   r   r   r   r9   u   

é™„ä»¶ï¼š[rP   )Úrequestsr$   ÚHEADERSÚencodingÚ	ExceptionÚprintÚsysÚstderrr   r,   Úfindr   r   rQ   rJ   ÚmatchÚintÚgrouprR   rY   rK   r?   r;   r   r"   r&   )rP   ÚrÚerU   ri   ÚmtÚctÚ	title_tagr+   Údate_strÚdm0ÚdmrB   Úattachmentsrf   ÚimgsÚ	img_linesr   r   r.   r   r   s                         r   Úfetch_detailr‡   “   s,  € ð$Ü�L‰L˜¤g°rÔ:ˆØˆŒ
ô
 ˜Ÿ™ Ó/€Dð €EØ	�‰�6 &¨.Ð!9ˆÓ	:€BÙ	ˆb�f‰f�YÔØ�9‘×#Ñ#Ó%ˆÙØ�Y‰Y�v f¨nÐ%=ˆYÓ>ˆÙØ�Y‰Y�uÐ%;ˆYÓ<ˆÙØ—K‘K d�KÓ+ˆEÙØ—I‘I˜gÓ&ˆ	ÙØ×"Ñ"¨Ð"Ó.ˆAÜ—‘ÐXÐZ\Ð^_Ó`×fÑfÓhˆAØˆEð €HØ	�‰�6 &¨)Ð!4ˆÓ	5€BÙ	ˆb�f‰f�YÔä�h‰hÐCÀRÈ	Á]×EXÑEXÓEZÓ[ˆÙØ'¬3¨s¯y©y¸«|Ó+<¼cÀ#Ç)Á)ÈAÃ,Ó>OÔQTÐUX×U^ÑU^Ð_`ÓUaÓQbÐ*cÑcˆHÙÜ�Y‰YÐCÀQÇVÁVÓLˆÙØ—x‘x “{ˆHð —)‘)˜E f�)Ó-€KÜ% d¨CÓ0€KáÜ! +¨sÓ3‰àˆô ˆ7�=‰=‹?Ó˜bÒ Ø    R¨ w¨hÐ7ˆØ�}‰}˜UÓ#ˆØˆ	Øò 	YˆCØ—'‘'˜% Ó$ˆCÚÜ" 3¨Ó,�Ø—g‘g˜e RÓ(�Ø× Ñ ¹C 2 c U¨"¨X¨J°aÑ!8ÀtÈHÈ:ÐUVÐEWÕXð	Yñ Ø�v §¡¨IÓ 6Ñ6Ñ6ˆGáØò 	AˆAØ˜¨¨&©	 {°"°Q°u±X°J¸aÐ@Ñ@‰Gð	Að �(˜G [Ð0Ð0øôA ò $ÜÐ% c U¨"¨Q¨CÐ0´s·z±zÕBØ�T˜4 Ð#Õ#ûð$ús   ‚#K Ë	LË#&LÌ	LÌLc           	      ó  — | dkD  rg S 	 t        j                  t        t        d¬«      }d|_        t        |j                  d«      }|j                  d	d
¬«      }|st        dt        j                  ¬«       g S g }|j                  dd¬«      D �]  }|j                  d«      }|j                  d«      }|sŒ)|j                  d«      sŒ;|d   j                  «       }	t        t        |	«      }
|j                  d¬«      }|r|j                  d¬«      nd}|rx|j                  «       }t!        j"                  d|«      }|rPdt%        |j'                  d«      «      t%        |j'                  d«      «      t%        |j'                  d«      «      fz  }|s�Œ|
s�Œ|j)                  ||
|f«       �Œ t        dt+        |«      › d�t        j                  ¬«       |S # t
        $ r*}t        d|› �t        j                  ¬«       g cY d}~S d}~ww xY w)z|Extract items from #initData embedded in page 1.
    Page 1 has all 27 items. Page 2+ not accessible (no working AJAX).
    r   r[   r\   r_   z  Error fetching list: r`   Nrb   r5   ÚinitDatarp   z  No #initData found!Úulzlist-ulrg   r   Úspanr   Tr   r   rk   rl   rm   rn   z  Found z items in embedded data)rq   r$   ÚLIST_URLrr   rs   rt   ru   rv   rw   r   r,   rx   r;   r   r   r   rQ   ry   rz   r{   r"   r?   )Úpage_numr|   r}   rU   Úinit_divÚitemsrŠ   r   r‹   r   rP   ri   r�   Údmls                 r   Úextract_list_pager‘   Ü   s¾  € ð �!‚|Øˆ	ðÜ�L‰Lœ¬7¸BÔ?ˆØˆŒ
ô
 ˜Ÿ™ Ó/€DØ�y‰y˜ :ˆyÓ.€HÙÜÐ%¬C¯J©JÕ7Øˆ	à€EØ×Ñ ¨YÐÓ7ó 5ˆØ�G‰G�C‹LˆØ�w‰w�v‹ˆÚ�—‘�v•Ø�V‘9—?‘?Ó$ˆDÜœ( DÓ)ˆCØ—J‘J T�JÓ*ˆEÙ48�t—}‘}¨4�}Ô0¸bˆHáØ#Ÿ>™>Ó+�Ü—h‘hÐKÈXÓV�ÙØ/´3°s·y±yÀ³|Ó3DÄcÈ#Ï)É)ÐTUË,ÓFWÔY\Ð]`×]fÑ]fÐghÓ]iÓYjÐ2kÑk�HÛ›Ø—‘˜e S¨(Ð3Ö4ð5ô" 
ˆH”S˜“Z�LÐ 7Ð
8¼s¿z¹zÕJØ€Løô; ò ÜÐ'¨ sÐ+´#·*±*Õ=Ø�	ûðús   ‰'G Ç	H	ÇHÇ>H	ÈH	c                  ó€   — t        j                  t        d¬«      } | j                  d«       | j                  d«       | S )Né<   )r^   zPRAGMA journal_mode=WALzPRAGMA busy_timeout=5000)Úsqlite3ÚconnectÚDB_PATHÚexecute)Úconns    r   Úinit_dbr™     s1   € Ü�?‰?œ7¨BÔ/€DØ‡L�LÐ*Ô+Ø‡L�LÐ+Ô,Ø€Kr   c                 ó‚  — |r|n|}t        j                  dd|«      j                  «       }|rt        j                  |d¬«      nd}	 | j                  dt        |||j                  «       |||t        |t        f
«      }|j                  dkD  S # t        $ r(}	t        d|	› �t        j                  ¬	«       Y d }	~	yd }	~	ww xY w)
Nz\s+r   F)Úensure_asciiz[]zÍINSERT OR IGNORE INTO gov_raw
               (site_name, source_url, page_url, title, publish_date, summary, content, category, attachments, group_name)
               VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)r   z  DB error: r`   )rQ   rJ   r   ÚjsonÚdumpsr—   Ú	SITE_NAMEÚCATEGORYÚGROUPÚrowcountrt   ru   rv   rw   )
r˜   ri   Úpage_urlÚpublish_daterf   r„   ÚsummaryÚatt_jsonÚcurr}   s
             r   Úsave_articler§     s®   € Ù ‰g e€GÜ�f‰f�V˜S 'Ó*×0Ñ0Ó2€GÙ>IŒt�z‰z˜+°EÕ:Èt€HðØ�l‰lð8ô ˜ (¨E¯K©K«M¸<Ø�gœx¨´5ð:ó	
ˆð �|‰|˜aÑÐøÜò Ü�˜Q˜CÐ ¤s§z¡zÕ2Üûðús   ÁAB Â	B>ÂB9Â9B>c            
      óÚ  — t         } t        t        j                  «      dkD  r	 t	        t        j                  d   «      } t        dt        › �t        j                  ¬«       t        «       }d}d}t        d| dz   «      D �]:  }t        |«      }|s"t        d|› d�t        j                  ¬«        �n|t        |«      z  }|D ]õ  \  }}}|r*|d	k  r%t        d
|› d|d d › �t        j                  ¬«       Œ3|j                  d|f«      }	|	j                  «       rŒWt        |«      \  }
}}}|
xs |}|xs |}|xs	 d|› d|› d�}|xs g }t        ||||||«      r*|dz  }t        d|› d|d d › �t        j                  ¬«       n!t        d|d d › �t        j                  ¬«       t!        j"                  d«       Œ÷ �Œ= |j%                  «        |j'                  «        t        d|› d|› �t        j                  ¬«       y # t
        $ rb t        j                  d   dv rIt        t        j                  «      dkD  r-	 t	        t        j                  d   «      } n# t
        $ r Y nw xY wY �Œ)w xY w)Nr   )z--max-pagesrm   z	Scraping r`   r   z  Page z: 0 articles (end)z
2020-01-01z  Skip old: r   é(   z)SELECT id FROM gov_raw WHERE page_url = ?r   r   r   z  + é2   z  - skip dup: g333333Ó?z
Done! Found: z, New: )Ú	MAX_PAGESr?   rv   Úargvrz   Ú
ValueErrorru   rž   rw   r™   Úranger‘   r—   Úfetchoner‡   r§   ÚtimeÚsleepÚcommitÚclose)Ú	max_pagesr˜   Ú	total_newÚtotal_foundÚpnÚarticlesri   r¢   Údater¦   Ú	det_titleÚdet_dateÚdet_contentÚdet_attsÚfinal_titleÚ
final_dateÚfinal_contentÚ
final_attss                     r   ÚmainrÂ   #  sF  € Ü€IÜ
Œ3�8‰8ƒ}�qÒð	ÜœCŸH™H Q™KÓ(ˆIô 
ˆI”i�[Ð
!¬¯
©
Õ3Ü‹9€DØ€IØ€Kä�A�y 1‘}Ó%ó ˆÜ$ RÓ(ˆÙÜ�G˜B˜4Ð1Ð2¼¿¹ÕDÚà”s˜8“}Ñ$ˆà%-ò 	Ñ!ˆE�8˜TÙ˜˜|Ò+Ü˜ T F¨!¨E°#°2¨J¨<Ð8¼s¿z¹zÕJØð —,‘,ÐJÈXÈKÓXˆCØ�|‰|Œ~Øä9EÀhÓ9OÑ6ˆI�x ¨hØ#Ò, uˆKØ!Ò) TˆJØ'ÒI¨Q¨{¨m¸2¸h¸ZÀqÐ+IˆMØ!š RˆJä˜D +¨x¸À]ÐT^Ô_Ø˜Q‘�	Ü˜˜Z˜L¨¨+°c°rÐ*:Ð);Ð<Ä3Ç:Á:ÖNä˜ {°3°BÐ'7Ð&8Ð9ÄÇ
Á
ÕKä�J‰J�s�Oò-	ðð@ 	‡K�K„MØ‡J�J„LÜ	ˆO˜K˜=¨°	¨{Ð
;Ä#Ç*Á*ÖMøô] ò 	Ü�x‰x˜‰{Ð.Ñ.´3´s·x±x³=À1Ò3DðÜ #¤C§H¡H¨Q¡KÓ 0‘IøÜ!ò Ùðýð		ús5   ¤G? Ç?:I*È:IÉI*É	I#É I*É"I#É#I*É)I*Ú__main__)Ú__doc__rq   rQ   rœ   r”   r°   Úosrv   r   Úbs4r   Úurllib.parser   r–   rž   rŸ   r    ÚBASE_URLrŒ   r«   rr   r   r/   rK   rY   r‡   r‘   r™   r§   rÂ   Ú__name__© r   r   ú<module>rË      sž   ðñ	÷ 2× 1× 1Ó 1Ý Ý Ý  à
€Ø6€	Ø€Ø€Ø$€Ø;€Ø€	ð DØOØ0ñ€òòò8:ò~ò D1òR'òXòò(3Nðl ˆzÒÙ…Fð r   