Ë
    †É…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mZmZ ddl	m
Z
 ddlmZ dZdZeez   dz   Zd	Zd
ZdZd
ZddddœZdZ ej,                  «       Zej0                  j3                  e«       dd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z d„ Z!e"dk(  r e «        yy)u•   
Crawler for å¯Ÿå¸ƒæŸ¥å°”åŽ¿äººæ°‘æ”¿åºœ - å…¬ç¤ºå…¬å‘Š
CMS: Visual SiteBuilder 9 (VSB), static .shtml pages
Site: www.xjcbcr.gov.cn/xjcbcr/c114052/
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoup)Úurljoinzhttp://www.xjcbcr.gov.cnz/xjcbcr/c114052z/list.shtmlu(   å¯Ÿå¸ƒæŸ¥å°”åŽ¿äººæ°‘æ”¿åºœ-å…¬ç¤ºå…¬å‘Šé   é   zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.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-Languageé   c                 óÊ  — ddl }t        t        | «      d«      }|j                  d«      D ]L  }|j	                  dd«      }|sŒ|j                  d«      rŒ*|r|j                  j                  ||«      n||d<   ŒN |j                  d«      D ]L  }|j	                  d	d«      }|sŒ|j                  d
«      rŒ*|r|j                  j                  ||«      n||d	<   ŒN t        |«      S )uA   ä¿�ç•™ HTML è¡¨æ ¼ç»“æž„ï¼Œä»…å°†ç›¸å¯¹é“¾æŽ¥/å›¾ç‰‡è½¬ç»�å¯¹ URLr   Núhtml.parserÚaÚhrefÚ )ÚhttpÚ
javascriptú#ÚimgÚsrc)r   z//zdata:)Úurllib.parser   ÚstrÚfind_allÚgetÚ
startswithÚparser   )ÚtableÚbase_urlÚurllibÚtblr   r   r   r   s           ú!/root/gov_crawler/crawl_xjcbcr.pyÚhtml_table_to_htmlr       sÐ   € ãÜ
œ˜E›
 MÓ
2€CØ�\‰\˜#Óò SˆØ�u‰u�V˜RÓ ˆÚ˜Ÿ™Ð(CÕDÙ@H˜Ÿ™×,Ñ,¨X°tÔ<ÈdˆAˆfŠIðSð �|‰|˜EÓ"ò RˆØ�g‰g�e˜RÓ ˆÚ�s—~‘~Ð&=Õ>Ù@H˜Ÿ™×-Ñ-¨h¸Ô<ÈcˆC�ŠJðRô ˆs‹8€Oó    c                 ó^   — t         j                  | t        ¬«      }d|_        |j                  S )N)Útimeoutzutf-8)Úsessionr   ÚTIMEOUTÚencodingÚtext)ÚurlÚresps     r   Úfetchr*   ,   s%   € Ü�;‰;�s¤Gˆ;Ó,€DØ€D„MØ�9‰9Ðr!   c                 óˆ  — t        | d«      }g }|j                  dd¬«      }|s|S |j                  d«      }|s|S |j                  d«      D �]r  }|j                  d«      }t        |«      dk  rŒ$|j                  d	d
d¬«      }|s2|j                  d	d¬«      }|sŒP|d   j	                  «       }d|v sd|v rŒl|d   j	                  «       }|j                  d«      xs |j                  d¬«      }	|	sŒ§t        |«      dkD  r|d   j                  d¬«      n|d   j                  d¬«      }
|j                  d«      r
t        |z   }nL|j                  d«      rt        t        z   dz   |dd z   }n$|j                  d«      st        t        z   dz   |z   }|	s�ŒJ|s�ŒN|j                  |	j	                  «       ||
dd f«       �Œu |S )z3Parse list page, return list of (title, url, date).r   ÚdivÚp10©Úclass_r   ÚtrÚtdé   r   Úc1457T)r/   r   ©r   r   Úc114052Úcommon_listÚtitle©Ústripé   ú/z./Nr   é
   )r   Úfindr   Úlenr9   r   Úget_textr   ÚBASE_URLÚ	LIST_PATHÚappend)ÚhtmlÚsoupÚitemsr-   r   r0   Úcellsr   r   r7   Údates              r   Ú
parse_listrH   2   sÃ  € ä˜˜}Ó-€DØ€Eð �)‰)�E %ˆ)Ó
(€CÙØˆà�H‰H�WÓ€EÙØˆà�n‰n˜TÓ"ó #;ˆØ—‘˜DÓ!ˆÜˆu‹:˜Š>Øð �G‰G�C ¨dˆGÓ3ˆÙØ—‘˜ $�Ó'ˆAÙØà�V‘9—?‘?Ó$ˆDØ˜DÑ  M°TÑ$9Øà�V‘9—?‘?Ó$ˆDð —‘�g“Ò8 !§*¡*°4 *Ó"8ˆÙØô 14°E³
¸Q²ˆu�Q‰x× Ñ  tÐ Ô,ÀEÈ!ÁH×DUÑDUÐ\`ÐDUÓDaˆð �?‰?˜3ÔÜ˜d‘?‰DØ�_‰_˜TÔ"ÜœiÑ'¨#Ñ-°°Q°R°Ñ8‰DØ—‘ Ô(ÜœiÑ'¨#Ñ-°Ñ4ˆDã“TØ�L‰L˜%Ÿ+™+›-¨¨t°C°R¨yÐ9Ö:ðG#;ðH €Lr!   c                 óH  — t        | d«      }|j                  d«      }|r|j                  d¬«      nd}d}|j                  dd¬«      }|rc|j                  dt        j                  d	«      ¬
«      }|r;|j                  d¬«      }t        j
                  d|«      }	|	r|	j                  d«      }d}
|j                  dd¬«      xs |j                  dd¬«      }|r |j                  dd¬«      }|rt        |«      }
g }|j                  dd¬«      D ]Š  }|d   j                  «       j                  «       }|j                  d«      sŒ6|d   j                  «       }|j                  d«      s	t        |z   }|j                  |j                  d¬«      xs d|dœ«       ŒŒ |||
||dœS )zParse detail page content.r   Úh1Tr8   r   r,   Úp15r.   zfont-size.*14)Ústylez(\d{4}-\d{2}-\d{2})r:   Úvsb_content)ÚidÚv_news_contentr   r4   r   )z.pdfz.docz.docxz.xlsz.xlsxz.zipz.rarr   u   é™„ä»¶)r7   r(   ©r7   rG   ÚcontentÚattachmentsÚ
source_url)r   r=   r?   ÚreÚcompileÚsearchÚgroupr   r   r9   ÚlowerÚendswithr   r@   rB   )rC   r(   rD   rJ   r7   Úpub_daterK   Úmeta_divÚtxtÚmÚcontent_htmlÚvsbÚvncrR   r   ÚahrefÚfull_urls                    r   Úparse_detailrc   g   s¢  € ä˜˜}Ó-€Dð 
�‰�4‹€BÙ')ˆB�K‰K˜dˆKÔ#¨r€Eð €HØ
�)‰)�E %ˆ)Ó
(€CÙ
Ø—8‘8˜E¬¯©Ð4DÓ)E�8ÓFˆÙØ×#Ñ#¨$Ð#Ó/ˆCÜ—	‘	Ð0°#Ó6ˆAÙØŸ7™7 1›:�ð €LØ
�)‰)�E˜mˆ)Ó
,Ò
V°·	±	¸%È°	Ó0V€CÙ
Ø�h‰h�uÐ%5ˆhÓ6ˆÙÜ˜s›8ˆLð €KØ�]‰]˜3 Tˆ]Ó*ò 	ˆØ�&‘	—‘Ó!×'Ñ'Ó)ˆØ�>‰>ÐTÕUØ˜‘y—‘Ó(ˆHØ×&Ñ& vÔ.Ü# hÑ.�Ø×ÑØŸ™¨$˜Ó/Ò;°8Øñ õ ð	ð ØØØ"Øñð r!   c                 ó’  — | rt        | j                  «       «      dk  rdj                  ||«      S t        | d«      }g }|j	                  g d¢d¬«      D �]„  }|j
                  dk(  r–|j                  dd¬	«      }|j	                  d
«      }|r[|D ]V  }|j                  dd«      }	|	sŒ|	j                  d«      st        ||	«      n|	}	|j                  dj                  |	«      «       ŒX |sŒ—|j                  |«       Œ©|j
                  dk(  r!t        ||«      }
|
sŒÇ|j                  |
«       ŒÙ|j
                  dv r8|j                  dd¬	«      }|sŒý|j                  dj                  |«      «       �Œ|j
                  d
k(  s�Œ0|j                  dd«      }	|	s�ŒF|	j                  d«      st        ||	«      n|	}	|j                  dj                  |	«      «       �Œ‡ dj                  d„ |D «       «      j                  «       }t        j                  dd|«      }t        |j                  «       «      dk  rdj                  ||«      S |S )z:Convert VSB content HTML to readable markdown with tables.é2   ú[{}]({})r   )Úpr   rJ   Úh2Úh3Úh4r   T)Ú	recursiverg   ú r8   r   r   r   r   u   ![å›¾ç‰‡]({})r   )rJ   rh   ri   rj   z
{}z

c              3   ó&   K  — | ]	  }|sŒ|–— Œ y ­w)N© )Ú.0rg   s     r   ú	<genexpr>z!render_content.<locals>.<genexpr>º   s   è ø€ Ò/˜qªQœÑ/ùs   ‚Šz\n{3,}r
   )r>   r9   Úformatr   r   Únamer?   r   r   r   rB   r    ÚjoinrT   Úsub)r^   r7   r(   rD   ÚpartsÚelr'   Úimgsr   r   Útbl_htmlÚresults               r   Úrender_contentrz   ˜   sù  € áœ3˜|×1Ñ1Ó3Ó4°rÒ9Ø× Ñ  ¨Ó,Ð,ä˜ }Ó5€DØ€Eà�m‰mÒIÐUYˆmÓZó :ˆØ�7‰7�cŠ>Ø—;‘;˜s¨$�;Ó/ˆDØ—;‘;˜uÓ%ˆDÙØò B�CØŸ'™' %¨Ó,�CÚØ7:·~±~ÀfÔ7Mœg c¨3Ô/ÐSV˜ØŸ™ _×%;Ñ%;¸CÓ%@ÕAð	Bò
 Ø—‘˜TÕ"Ø�W‰W˜ÒÜ)¨"¨cÓ2ˆHÚØ—‘˜XÕ&Ø�W‰WÐ0Ñ0Ø—;‘;˜s¨$�;Ó/ˆDÚØ—‘˜VŸ]™]¨4Ó0Ö1Ø�W‰W˜ÔØ—&‘&˜ Ó#ˆCÛØ/2¯~©~¸fÔ/E”g˜c 3Ô'È3�Ø—‘˜_×3Ñ3°CÓ8Ö9ð1:ð4 �[‰[Ñ/ EÔ/Ó/×5Ñ5Ó7€FÜ�V‰V�I˜v vÓ.€Fä
ˆ6�<‰<‹>Ó˜RÒØ× Ñ  ¨Ó,Ð,Ø€Mr!   c                  ój   — t        t        j                  «      dkD  xr t        j                  d   dk(  S )Nr:   Úincremental)r>   ÚsysÚargvrn   r!   r   Úis_incrementalr   Â   s'   € ÜŒs�x‰x‹=˜1ÑÒ=¤§¡¨!¡°Ñ!=Ð=r!   c                  ót	  — t        «       } t        dj                  t        | t        «      «       g }t        dt        dz   «      D ]¸  }|dk(  rt        }n5dj                  t        j                  d«      j                  dd«      |«      }t        dj                  ||«      «       	 t        |«      }t        |«      }t        d	j                  t        |«      «      «       |st        d
«        n|j                  |«       Œº t        dj                  t        |«      «      «       |st        d«       y d }| rœt        j                  «       t!        t"        ¬«      z
  }t        dj                  |j%                  «       «      «       |D ��	�
cg c]  \  }}	}
|
sŒ
t'        |
|«      sŒ||	|
f‘Œ }}	}}
|}t        dj                  t        |«      «      «       g }t)        |«      D ]‡  \  }\  }}}t        dj                  |dz   t        |«      |d d «      «       	 t        |«      }t-        ||«      }|d   s||d<   |d   s||d<   t/        |d   |d   |«      |d<   |j+                  |«       Œ‰ t        dj                  t        |«      «      «       |st        d«       y t1        j2                  dddd¬«      }dj                  t        t        |«      «      }|D ]X  }|d   |d   |d   |d   t        |d   |j5                  d g «      d!œ}|j7                  t9        j:                  |d¬"«      d#z   «       ŒZ |j=                  «        t        d$j                  |j>                  «      «       tA        jB                  d%j                  |j>                  |«      «      }|d&k(  rt        d'«       n/t        d(j                  |«      «       tE        jF                  d«       t@        jH                  jK                  |j>                  «      r!	 tA        jL                  |j>                  «       y y # t        $ r%}t        dj                  |«      «       Y d }~�Œ d }~ww xY wc c}
}	}w # t        $ rL}t        dj                  |«      «       |j+                  ||dj                  ||«      g |dœ«       Y d }~�ŒÆd }~ww xY w# tN        $ r Y y w xY w))Nz2[{}] Starting crawl (incremental={}, max_pages={})r:   z{}/list_{}.shtmlr;   z
list.shtmlr   z  Fetching page {}: {}z    ERROR: {}z    Found {} itemsz    No more items, stoppingz
  Total items from list: {}z  No items found, exiting)Údaysz  Incremental mode: cutoff = {}z$  After incremental filter: {} itemsz  [{}/{}] Fetching: {}...é(   rf   rP   r7   rG   rQ   z
  Total valid items: {}z  No items to import, exitingÚwz.jsonlFz/tmp)ÚmodeÚsuffixÚdeleteÚdiru
   {} ({}æ�¡)rS   rR   )r7   Úpage_urlrQ   Úpublish_dateÚ	site_namerS   rR   )Úensure_asciiú
z  JSONL written: {}z3python3 /root/gov_crawler/import_jsonl.py '{}' '{}'r   z  OK Import completez  FAIL Import failed (exit={}))(r   Úprintrq   Ú	SITE_NAMEÚ	MAX_PAGESÚrangeÚLIST_URLÚrstripÚreplacer*   Ú	ExceptionrH   r>   Úextendr   Únowr   ÚINCREMENTAL_DAYSrG   Údate_filterÚ	enumeraterB   rc   rz   ÚtempfileÚNamedTemporaryFiler   ÚwriteÚjsonÚdumpsÚcloserr   ÚosÚsystemr}   ÚexitÚpathÚexistsÚunlinkÚOSError)r|   Ú	all_itemsÚpagerˆ   rC   ÚerE   Úcutoff_dateÚtÚuÚdÚfilteredÚresultsÚidxr7   r(   Údate_from_listÚdetailÚtmpÚlabelÚrÚlineÚrets                          r   Úmainr¸   Æ   sB  € Ü Ó"€KÜ	Ð
>×
EÑ
EÄiÐQ\Ô^gÓ
hÔið €IÜ�aœ Q™Ó'ò  ˆØ�1Š9Ü‰Hà)×0Ñ0´·±ÀÓ1E×1MÑ1MÈlÐ\^Ó1_ÐaeÓfˆHÜÐ&×-Ñ-¨d°HÓ=Ô>ð	Ü˜“?ˆDô ˜4Ó ˆÜÐ"×)Ñ)¬#¨e«*Ó5Ô6ÙÜÐ/Ô0ÙØ×Ñ˜Õð! ô$ 
Ð
)×
0Ñ
0´°Y³Ó
@ÔAÙÜÐ)Ô*Øð €KÙÜ—l‘l“n¤yÔ6FÔ'GÑGˆÜÐ/×6Ñ6°{×7GÑ7GÓ7IÓJÔKØ-6×\Ð\¡' ! Q¨º!ÄÈAÈ{Õ@[�Q˜˜1’IÐ\ˆÒ\Øˆ	ÜÐ4×;Ñ;¼CÀ	»NÓKÔLð €GÜ-6°yÓ-Aò Ñ)ˆÑ)ˆe�S˜.ÜÐ)×0Ñ0°°q±¼#¸i».È%ÐPSÐQSÈ*ÓUÔVð		Ü˜“:ˆDô ˜d CÓ(ˆØ�gŠØ#ˆF�7‰OØ�fŠ~Ø+ˆF�6‰Nä*¨6°)Ñ+<¸fÀW¹oÈsÓSˆˆyÑØ�‰�vÕð)ô, 
Ð
%×
,Ñ
,¬S°«\Ó
:Ô;ÙÜÐ-Ô.Øô ×
%Ñ
%¨3°xÈÐSYÔ
Z€CØ×Ñ¤	¬3¨w«<Ó8€EØò 
?ˆà�w‘ZØ˜,™Ø˜‘|Ø˜f™IÜ"Ø˜L™/ØŸ5™5 °Ó3ñ
ˆð 	�	‰	”$—*‘*˜T°Ô6¸Ñ=Õ>ð
?ð ‡I�I„KÜ	Ð
×
&Ñ
& s§x¡xÓ
0Ô1ô �)‰)ÐI×PÑPÐQT×QYÑQYÐ[`ÓaÓ
b€CØ
ˆa‚xÜÐ$Õ%äÐ.×5Ñ5°cÓ:Ô;Ü�‰�Œô 
‡w�w‡~�~�c—h‘hÔð	Ü�I‰I�c—h‘hÕð  øô_ ò 	Ü�/×(Ñ(¨Ó+Ô,Ýûð	üô( ]øô ò 	Ü�/×(Ñ(¨Ó+Ô,Ø�N‰NØ¨Ø%×,Ñ,¨U°CÓ8Ø!°ñô õ
 ûð	ûôh ò 	Ùð	úsU   Â$PÆQÆQÆ QÈQÏ:R+ Ð	Q	Ð$QÑQ	Ñ	R(ÑAR#Ò#R(Ò+	R7Ò6R7c                 óX   — 	 t        j                  | d«      }||k\  S # t        $ r Y yw xY w)Nz%Y-%m-%dT)r   ÚstrptimeÚ
ValueError)Údate_strÚcutoffr­   s      r   r˜   r˜   *  s5   € ðÜ×Ñ˜h¨
Ó3ˆØ�F‰{ÐøÜò Ùðús   ‚ �	)¨)Ú__main__)r   )#Ú__doc__ÚrequestsrT   r�   r}   r    rš   r   r   Úbs4r   r   r   r@   rA   r‘   rŽ   r—   r�   ÚPER_PAGEÚHEADERSr%   ÚSessionr$   ÚheadersÚupdater    r*   rH   rc   rz   r   r¸   r˜   Ú__name__rn   r!   r   ú<module>rÈ      sÉ   ðñ÷
 -× ,× ,ß (Ý Ý  à%€Ø€	Ø�iÑ -Ñ/€Ø6€	ØÐ Ø€	Ø€ð DØOØ0ñ€ð
 €à
ˆ(×
Ñ
Ó
€Ø ‡�× Ñ �wÔ óòò2òj.òb'òT>òaòHð ˆzÒÙ…Fð r!   