Ë
    ¸¬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mZ ddlm	Z	 dZ
e
dz   ZdZdZd	xZZd
diZdZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zedk(  r ej6                   e«       «       yy)u�  
äº‘å�—ç¥¥ä¸°å®žä¸šé›†å›¢ - æœ€æ–°å…¬å‘Š (çŽ¯è¯„å…¬ç¤º) çˆ¬è™«
CMS: è‡ªå®šä¹‰PHP
WAF: äº‘é”� YunSuo (JS challenge + cookie)
åˆ—è¡¨: /list/xfhfPC/1/16/auto/20/{page}.html (0-based, 20æ�¡/é¡µ)
è¯¦æƒ…: /view/xfhfPC/1/16/view/{id}.html
è¯¦æƒ…æ ‡é¢˜: <title>
è¯¦æƒ…æ­£æ–‡: div.articleBox > p
è¯¦æƒ…æ—¥æœŸ: 2026å¹´07æœˆ09æ—¥ (from div.subCon or regex)

ç”¨æ³•:
  python3 crawl_xfhf.py
  python3 crawl_xfhf.py --pages 3
é    N)ÚBeautifulSoup)Úurljoinzhttps://www.xfhf.comz!/list/xfhfPC/1/16/auto/20/{}.htmlz/root/search.dbu   äº‘å�—ç¥¥ä¸°-æœ€æ–°å…¬å‘Šu   çŽ¯è¯„z
User-Agentz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36é   é   c                 ó2   — dj                  d„ | D «       «      S )NÚ c              3   óJ   K  — | ]  }t        t        |«      «      d d –— Œ y­w)é   N)ÚhexÚord)Ú.0Úcs     ú/root/gov_crawler/crawl_xfhf.pyú	<genexpr>zstr2hex.<locals>.<genexpr>$   s   è ø€ Ò. q”3”s˜1“v“;˜q˜r”?Ñ.ùs   ‚!#)Újoin)Úss    r   Ústr2hexr   #   s   € Ø�7‰7Ñ.¨AÔ.Ó.Ð.ó    c                 ó|  — t        j                  «       }|j                  j                  t        «       |j                  | t        ¬«       |j                  j                  dt        | «      dd¬«       t        d«      }|j                  | dz   |z   t        ¬«       |j                  | t        ¬«      }|j                  S )zBypass YunSuo WAF - 4 step flow©ÚtimeoutÚsrcurlzwww.xfhf.comú/)ÚdomainÚpathz1366,768z?security_verify_data=)ÚrequestsÚSessionÚheadersÚupdateÚHEADERSÚgetÚTIMEOUTÚcookiesÚsetr   Útext)ÚurlÚsessÚhex_dataÚrs       r   Úbypass_requestr*   '   s‘   € ä×ÑÓ€DØ‡L�L×ÑœÔ Ø‡H�HˆSœ'€HÔ"Ø‡L�L×Ñ�Xœw s›|°NÈÐÔMÜ�zÓ"€HØ‡H�HˆSÐ+Ñ+¨hÑ6Ä€HÔHØ�‰�œgˆÓ&€AØ�6‰6€Mr   c           
      óø   — t        d«      D ]  }	 t        | «      c S  y # t        $ rQ}|dk(  r-t        d|dz   › d| › d|› �t        j
                  ¬«       Y d }~ yt        j                  d«       Y d }~Œhd }~ww xY w)	Né   r
   u     [WARN] èŽ·å�–å¤±è´¥ (r   z/3): ú - ©Úfiler   )Úranger*   Ú	ExceptionÚprintÚsysÚstderrÚtimeÚsleep)r&   ÚattemptÚes      r   Úfetchr9   3   sw   € Ü˜“8ò ˆð	Ü! #Ó&Ò&ñøô ò 	Ø˜!Š|ÜÐ/°¸±	¨{¸%À¸uÀCÈÀsÐKÔRU×R\ÑR\Õ]ÝÜ�J‰J�q�M‰Mûð		ús   �
Ÿ	A9¨,A4ÁA4Á4A9c                 ó�  — g }t        | d«      }|j                  dd¬«      }|s|S |j                  dd¬«      D ]Š  }|j                  d«      }|sŒ|j	                  dd«      }|j                  d	¬
«      }|r|sŒ@t        t        |«      }|j                  d«      }	|	r|	j                  d	¬
«      nd}
|j                  |||
f«       ŒŒ |S )Núhtml.parserÚdivÚ	subPageRC©Úclass_Úwrapz
div.font aÚhrefr   T©Ústripzdiv.time)	r   ÚfindÚfind_allÚ
select_oner!   Úget_textr   ÚBASE_URLÚappend)ÚhtmlÚitemsÚsoupÚsubpager@   Úa_tagrA   ÚtitleÚfull_urlÚtime_tagÚdates              r   Úextract_list_itemsrS   >   sÓ   € Ø€EÜ˜˜}Ó-€DØ�i‰i˜ kˆiÓ2€GÙØˆØ× Ñ  ¨vÐ Ó6ò .ˆØ—‘ Ó-ˆÙØØ�y‰y˜ Ó$ˆØ—‘ T�Ó*ˆÙ™5ØÜœ8 TÓ*ˆØ—?‘? :Ó.ˆÙ08ˆx× Ñ  tÐ Ô,¸bˆØ�‰�h  tÐ,Õ-ð.ð €Lr   c                 ó4  — t        | d«      }d}|j                  d«      }|rK|j                  r?|j                  j                  «       }t	        j
                  dd|«      j                  «       }d}|j                  dd¬«      }|r]t	        j                  d|j                  «       «      }|r7|j                  d	«      ›d
|j                  d«      ›d
|j                  d«      ›�}|sOt	        j                  d| «      }|r7|j                  d	«      ›d
|j                  d«      ›d
|j                  d«      ›�}d}|j                  dd¬«      }|rOg }	|j                  d«      D ](  }
|
j                  d¬«      }|sŒ|	j                  |«       Œ* dj                  |	«      }g }|j                  dd¬«      D ]d  }|d   }d|j                  «       v sŒ|j                  d¬«      xs |j                  d«      d   }|j                  |t        t        |«      dœ«       Œf ||||fS )Nr;   r   rO   u'   \|äº‘å�—ç¥¥ä¸°å®žä¸šé›†å›¢æœ‰é™�å…¬å�¸$r<   ÚsubConr>   u   (\d{4})å¹´(\d{2})æœˆ(\d{2})æ—¥r   ú-r
   r,   Ú
articleBoxÚpTrB   z

Úa)rA   rA   z.pdfr   éÿÿÿÿ)Únamer&   )r   rD   ÚstringrC   ÚreÚsubÚsearchrG   ÚgrouprE   rI   r   ÚlowerÚsplitr   rH   )rJ   rL   rO   Ú	title_tagrR   ÚsubconÚmÚcontentÚarticleÚpartsrX   r%   ÚattachmentsrY   rA   r[   s                   r   Úextract_detailrj   S   sß  € Ü˜˜}Ó-€Dà€EØ—	‘	˜'Ó"€IÙ�Y×%Ò%Ø× Ñ ×&Ñ&Ó(ˆÜ—‘ÐAÀ2ÀuÓM×SÑSÓUˆà€DØ�Y‰Y�u XˆYÓ.€FÙÜ�I‰IÐ7¸¿¹Ó9JÓKˆÙØ!"§¡¨¥¨Q¯W©W°Q­Z¸¿¹À¼ÐDˆDÙÜ�I‰IÐ7¸Ó>ˆÙØ!"§¡¨¥¨Q¯W©W°Q­Z¸¿¹À¼ÐDˆDà€GØ�i‰i˜ lˆiÓ3€GÙØˆØ×!Ñ! #Ó&ò 	#ˆAØ—:‘: D�:Ó)ˆDÚØ—‘˜TÕ"ð	#ð —+‘+˜eÓ$ˆà€KØ�]‰]˜3 Tˆ]Ó*ò OˆØ�‰yˆØ�T—Z‘Z“\Ò!Ø—:‘: D�:Ó)Ò@¨T¯Z©Z¸«_¸RÑ-@ˆDØ×Ñ¨´W¼XÀtÓ5LÑMÕNð	Oð �$˜ Ð,Ð,r   c                 ó¶  — d}d}|D ]‘  \  }}}}}dd l }	|r|	j                  |d¬«      nd}
|r|d d j                  dd«      n|}|s|rdj                  d„ |D «       «      }	 | j	                  d	||t
        |||||
f«      }|j                  dkD  r|d
z  }n|d
z  }Œ“ ||fS # t        $ r0}t        d|› d|› �t        j                  ¬«       |d
z  }Y d }~ŒÌd }~ww xY w)Nr   F)Úensure_asciir   éÈ   ú
ú c              3   ó:   K  — | ]  }d |d   › d|d   › d�–— Œ y­w)ú[r[   z](r&   ú)N© )r   rY   s     r   r   zpush_to_db.<locals>.<genexpr>ƒ   s'   è ø€ ÒRÀ ! A f¡I ;¨b°°5±°
¸!Ô <ÑRùs   ‚z“INSERT OR REPLACE INTO gov_raw (page_url, title, site_name, publish_date, content, date_rank, summary, attachments) VALUES (?, ?, ?, ?, ?, ?, ?, ?)r   z  [ERR] DB: r-   r.   )ÚjsonÚdumpsÚreplacer   ÚexecuteÚ	SITE_NAMEÚrowcountr1   r2   r3   r4   )ÚconnrK   ÚsavedÚskippedr&   rO   rR   rf   ri   rt   Úattachments_jsonÚsummaryÚcurr8   s                 r   Ú
push_to_dbr€   {   s  € Ø€EØ€GØ27ò Ñ.ˆˆU�D˜' ;ÛÙJU˜4Ÿ:™: kÀ˜:ÔFÐ[]ÐÙ6=�'˜$˜3�-×'Ñ'¨¨cÔ2À5ˆÙ™;Ø—i‘iÑRÀkÔRÓRˆGð	Ø—,‘,ð2ð �eœY¨¨g°t¸WÐFVÐWó	ˆCð �|‰|˜aÒØ˜‘
‘à˜1‘�øð!ð( �'ˆ>Ðøô ò 	Ü�L   S¨¨Ð,´3·:±:Õ>Ø�q‰L�Gûð	ús   Á!8BÂ	CÂ(&CÃCc                  ót  — t         } t        t        j                  «      D ]K  \  }}|dk(  sŒ|dz   t	        t        j                  «      k  sŒ,t        t        j                  |dz      «      }  n t        j                  t        d¬«      }|j                  d«       g }t        d| › d�«       t        | «      D �]1  }t        j                  |«      }t        d|dz   › d	| › d
|› �«       t        |«      }|sŒ>t        |«      }|st        d«        nÝt        dt	        |«      › d�«       |D ]½  \  }	}
}t!        j"                  d«       t        dt	        |«      dz   › d
|
d d › d�dd¬«       t        |	«      }|st        d«       ŒYt%        |«      \  }}}}|s|
}|s|}|j'                  |	||||f«       |rdnd}|rdt	        |«      › d�nd}t        d|› dt	        |«      › d|› d�«       Œ¿ �Œ4 |r<t)        ||«      \  }}|j+                  «        t        d|› d |› d!t	        |«      › �«       |j-                  «        y")#Nz--pagesr   é<   r   zPRAGMA journal_mode=WALu"   äº‘å�—ç¥¥ä¸°-æœ€æ–°å…¬å‘Š: çˆ¬å�– u    é¡µu     [åˆ—è¡¨é¡µ r   z] u       -> æ— æ•°æ�®ï¼Œå�œæ­¢u       -> æ‰¾åˆ° u    æ�¡g      à?z    [é(   z...ro   T)ÚendÚflushÚfailÚokÚemptyz +Úpdfr   ú(z, u   å­—rr   u   
å®Œæˆ�! æ–°å¢ž: u
   , è·³è¿‡: u
   , æ€»å…±: r   )Ú	MAX_PAGESÚ	enumerater3   ÚargvÚlenÚintÚsqlite3ÚconnectÚDB_PATHrw   r2   r0   ÚLIST_URLÚformatr9   rS   r5   r6   rj   rI   r€   ÚcommitÚclose)ÚpagesÚirY   rz   Ú	all_itemsÚidxÚlist_urlrJ   rK   Úitem_urlÚ
item_titleÚ	item_dateÚdetail_htmlrO   rR   rf   ri   ÚstatusÚ
attach_msgr{   r|   s                        r   Úmainr¢   •   s:  € Ü€EÜœ#Ÿ(™(Ó#ò ‰ˆˆ1Ø�	‹>˜a !™e¤c¬#¯(©(£mÓ3ÜœŸ™  Q¡™Ó(ˆEÙðô
 �?‰?œ7¨BÔ/€DØ‡L�LÐ*Ô+Ø€IÜ	Ð.¨u¨g°TÐ
:Ô;Ü�U‹|ó @ˆÜ—?‘? 3Ó'ˆÜ�˜c !™e˜W A e W¨B¨x¨jÐ9Ô:Ü�X‹ˆÙØÜ" 4Ó(ˆÙÜÐ-Ô.ÙÜ�œs 5›z˜l¨$Ð/Ô0Ø/4ò 	@Ñ+ˆH�j )Ü�J‰J�sŒOÜ�Eœ#˜i›.¨Ñ*Ð+¨2¨j¸¸"¨oÐ->¸cÐBÈÐSWÕXÜ ›/ˆKÙÜ�f”ØÜ0>¸{Ó0KÑ-ˆE�4˜ +ÙØ"�ÙØ �Ø×Ñ˜h¨¨t°W¸kÐJÔKÙ$‘T¨'ˆFÙ7B˜2œc +Ó.Ð/¨sÑ3ÈˆJÜ�A�f�X˜R¤ G£˜~¨S°°¸AÐ>Õ?ò	@ð@ñ6 Ü# D¨)Ó4‰ˆˆwØ�‰ŒÜÐ" 5 '¨°G°9¸JÄsÈ9Ã~ÐFVÐWÔXØ‡J�J„LØr   Ú__main__)Ú__doc__r]   r3   r5   r   r�   Úbs4r   Úurllib.parser   rH   r“   r’   rx   ÚCATEGORYÚGROUPr    r‹   r"   r   r*   r9   rS   rj   r€   r¢   Ú__name__Úexitrs   r   r   ú<module>r«      sž   ðñ÷ (× 'Ó 'Ý Ý  à!€ØÐ9Ñ9€Ø
€Ø'€	ØÐ €ˆ5ð ÐPð€ð €	Ø
€ò/ò	òòò*%-òPò4+ð\ ˆzÒØ€C‡H�H‰T‹VÕð r   