Ë
    'ˆ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Z ej                  dd«      ZdZd	Zed
z   Zedz   ZdZdZdZdedœZddiZ ej0                  «       Zdd„Zd„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)uÅ   crawl_netda_tzgg.py - å�—é€šç»�æµŽæŠ€æœ¯å¼€å�‘åŒºé€šçŸ¥å…¬å‘Š

TrueCMS Variant B: Inline (first 30) + API pagination
List: /ntjjkfqrmzf/tzgg/tzgg.html
Detail: /ntjjkfqrmzf/tzgg/content/{uuid}.html
é    N)ÚBeautifulSoup)Úurljoinzhttp://www.netda.gov.cnÚ	SEARCH_DBz/root/search.dbu(   å�—é€šç»�æµŽæŠ€æœ¯å¼€å�‘åŒº-é€šçŸ¥å…¬å‘Šzcrawl_netda_tzgg.pyz/ntjjkfqrmzf/tzgg/tzgg.htmlz(/truecms/messageController/getMessage.doz$24981568-7339-431d-80a7-86e939bf6728é
   é   z<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36)ú
User-AgentÚRefererr   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_netda_tzgg.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        | d«      }|j                  dd¬«      }|sg S g }|j                  dd¬«      D ]»  }|j                  d«      }|sŒ|j                  d	«      }|j                  d
«      }|sŒ<|sŒ?|j                  dd«      }|j                  dd«      xs |j                  j                  «       }	|j                  j                  «       }
|j                  |	t        t        |«      |
dœ«       Œ½ |S )z8Extract items from inline initData div (first 30 items).r   ÚdivÚinitData©ÚidÚulÚcon©Úclass_Úlir   Úlabelr   r   Útitle©r,   ÚurlÚdate)	r   Úfindr   r   ÚtextÚstripÚappendr   ÚBASE_URL)ÚhtmlÚsoupÚinitÚitemsr&   r*   r   r+   r   r,   r/   s              r   Úextract_inline_itemsr9   /   så   € ä˜˜}Ó-€DØ�9‰9�U˜zˆ9Ó*€DÙØˆ	Ø€EØ�m‰m˜D¨ˆmÓ/ò ˆØ�W‰W�T‹]ˆÙØØ�G‰G�C‹LˆØ—‘˜Ó ˆÚ’Ø—5‘5˜ Ó$ˆDØ—E‘E˜' 2Ó&Ò8¨!¯&©&¯,©,«.ˆEØ—:‘:×#Ñ#Ó%ˆDØ�L‰LØÜœx¨Ó.Øñõ ðð €Lr    c                 ó  — | dz
  t         z  dz   }|t         z   dz
  }t        |«      t        |«      t        t         «      t        dœ}t        j	                  t
        |t        d¬«      }|j                  «       }|j	                  dd«      }|j                  dd«      j                  dd«      }|j                  d	d
«      }t        |d«      }g }|j                  d«      D ]§  }	|	j                  d«      }
|	j                  d«      }|
sŒ(|sŒ+|
j	                  dd«      }|
j	                  dd«      xs |
j                  j                  «       }|j                  j                  «       }|j                  |t        t         |«      |dœ«       Œ© |S )z7Fetch one page via API (starts from page 4, items 31+).é   )ÚstartrecordÚ	endrecordÚperpageÚcolumnIdé   )ÚparamsÚheadersÚtimeoutÚresultr   z	<![CDATA[z]]>z\/ú/r   r*   r   r+   r   r,   r-   )ÚPER_PAGEr   Ú	COLUMN_IDÚsessionr   ÚAPI_URLÚHEADERSÚjsonÚreplacer   r   r0   r1   r2   r3   r   r4   )Úpage_numr<   r=   rA   ÚrÚdataÚresult_htmlr6   r8   r*   r   r+   r   r,   r/   s                  r   Úfetch_api_pagerQ   H   sZ  € à˜a‘<¤8Ñ+¨aÑ/€KØœhÑ&¨Ñ*€Iä˜;Ó'Ü˜“^Ü”x“=Üñ	€Fô 	�‰”G F´GÀRˆÓH€AØ�6‰6‹8€DØ—(‘(˜8 RÓ(€Kà×%Ñ% k°2Ó6×>Ñ>¸uÀbÓI€Kà×%Ñ% e¨SÓ1€KÜ˜ mÓ4€DØ€EØ�m‰m˜DÓ!ò ˆØ�G‰G�C‹LˆØ—‘˜Ó ˆÚ’Ø—5‘5˜ Ó$ˆDØ—E‘E˜' 2Ó&Ò8¨!¯&©&¯,©,«.ˆEØ—:‘:×#Ñ#Ó%ˆDØ�L‰LØÜœx¨Ó.Øñõ ðð €Lr    c                 óÞ  — 	 t         j                  | t        d¬«      }d|_        t        |j                  d«      }|j                  dd	d
¬«      }|s|j                  dd
¬«      }|st        dt        j                  ¬«       y|j                  dd¬«      }|r|j                  j                  «       nd}|j                  dd¬«      }d}|rX|j                  dd¬«      }	|	rC|	j                  j                  «       }
t        j                  d|
«      }|r|j                  d«      }|sT|j                  dddi¬«      }|r=|j                  d	«      r,t        j                  d|d	   «      }|r|j                  d«      }|j                  dd¬«      }|st        dt        j                  ¬«       |}nŠg }|j                  D ]h  }|j                   dk(  r'|j#                  d¬«      }|sŒ'|j%                  |«       Œ9|j                   dk(  sŒIt'        || «      }|sŒX|j%                  |«       Œj d j)                  |«      }|||d!œS # t        $ r(}t        d|› �t        j                  ¬«       Y d}~yd}~ww xY w)"z.Extract title, date, content from detail page.r@   ©rB   rC   úutf-8z  [ERROR] Fetch detail failed: ©ÚfileNr   r"   ÚcontentÚzoom)r)   r%   r$   z  [ERROR] No zoom div foundr,   r(   r   ÚstitleÚspanÚflz(\d{4}-\d{2}-\d{2})r;   ÚmetaÚnameÚPubDate)Úattrsr'   z  [ERROR] No div.con foundÚpT)r2   r   z

)r,   r/   rW   )rH   r   ÚDETAIL_HEADERSÚencodingÚ	ExceptionÚprintÚsysÚstderrr   r1   r0   r2   ÚreÚsearchÚgroupÚchildrenr]   Úget_textr3   r   Újoin)Ú
detail_urlrN   Úer6   rX   Ú	title_divr,   rY   r/   rZ   Ú	date_textÚmr\   r'   rW   Ú
paragraphsÚchildÚtxtÚtbl_htmls                      r   Úextract_detailrv   j   s7  € ðÜ�K‰K˜
¬NÀBˆKÓGˆØˆŒ
ô
 ˜Ÿ™ Ó/€DØ�9‰9�U 9°ˆ9Ó8€DÙØ�y‰y˜ 6ˆyÓ*ˆÙÜÐ+´3·:±:Õ>Øð —	‘	˜%¨�	Ó0€IÙ&/ˆI�N‰N× Ñ Ô"°R€Eð �Y‰Y�u XˆYÓ.€FØ€DÙØ�{‰{˜6¨$ˆ{Ó/ˆÙØŸ	™	Ÿ™Ó)ˆIä—	‘	Ð0°)Ó<ˆAÙØ—w‘w˜q“z�ñ Ø�y‰y˜¨°	Ð':ˆyÓ;ˆÙ�D—H‘H˜YÔ'Ü—	‘	Ð0°$°y±/ÓBˆAÙØ—w‘w˜q“z�ð �)‰)�E %ˆ)Ó
(€CÙÜÐ*´#·*±*Õ=Ø‰àˆ
Ø—\‘\ò 	0ˆEØ�z‰z˜SÒ Ø—n‘n¨4�nÓ0�ÚØ×%Ñ% cÕ*Ø—‘˜wÓ&Ü-¨e°ZÓ@�ÚØ×%Ñ% hÕ/ð	0ð —+‘+˜jÓ)ˆð ØØñð øôm ò ÜÐ/°¨sÐ3¼#¿*¹*ÕEÜûðús   ‚#H; È;	I,ÉI'É'I,c                  óz  — d} t        t        j                  «      dkD  rt        t        j                  d   «      } t	        dt
        › �t        j                  ¬«       t        j                  t
        t        d¬«      }d|_
        |j                  }t        |«      }t	        dt        |«      › �t        j                  ¬«       | t        z  }t        |«      |k  rÁt        t        z  dz   }t        |«      |k  r£|t        |«      t        z
  t        z  z   }||k  r|}t	        d	|› d
�t        j                  ¬«       t        |«      }|st	        d|› �t        j                  ¬«       n5|j!                  |«       t#        j$                  d«       t        |«      |k  rŒ£|d | }t	        dt        |«      › �t        j                  ¬«       g }t'        |«      D ]˜  \  }	}
t	        d|	dz   › dt        |«      › d|
d   d d › �t        j                  ¬«       t)        |
d   «      }|r8|j+                  |d   |
d   |d   xs |
d   d|d   |d   r|d   d d nddœ«       t#        j$                  d«       Œš t-        j.                  t0        d¬«      }|j3                  «       }d}d}|D ]µ  }	 |j5                  d|d   f«       |j7                  «       r|dz  }Œ0|d   xs d}|j5                  dt8        t
        |d   |d   |d   xs d |d   xs d |d!   xs dd d d"d#d|ddd$d%d&|v rdndt:        f«       |j<                  dkD  r|dz  }n|dz  }|j?                  «        Œ· |jC                  «        t	        d(|› d)|› d*t        |«      › d+�d,¬-«       y # t@        $ r)}t	        d'|› �t        j                  ¬«       Y d }~�Œd }~ww xY w).Né   r;   zFetching list page: rU   r@   rS   rT   zInline items: z  Fetching API page z...z%  [WARN] Empty API response for page g      à?zTotal items to process: z  [rE   z] r,   é(   r.   r/   u   å�—é€šç»�æµŽæŠ€æœ¯å¼€å�‘åŒºrW   éÈ   r   )r,   Úpage_urlr/   Ú	site_namerW   Úsummaryr   )rC   r   z'SELECT id FROM gov_raw WHERE page_url=?r{   aF  
                INSERT OR IGNORE INTO gov_raw
                (site_name, source_url, page_url, title, publish_date, date_rank, summary, status,
                 category, visits, content, tags, industry, attachments, group_name, has_table, script_name)
                VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
            z
1900-01-01r}   Ú	publishedu   é€šçŸ¥å…¬å‘Šz[]u   æ±Ÿè‹�z<tableu     DBé”™è¯¯: u   å®Œæˆ�: æ–°å¢žu    è·³è¿‡u    å…±u   æ�¡T)Úflush)"Úlenre   ÚargvÚintrd   ÚLIST_URLrf   rH   r   rJ   rb   r1   r9   rF   ÚINLINE_COUNTrQ   ÚextendÚtimeÚsleepÚ	enumeraterv   r3   Úsqlite3ÚconnectÚDB_PATHÚcursorÚexecuteÚfetchoneÚ	SITE_NAMEÚSCRIPT_NAMEÚrowcountÚcommitrc   Úclose)ÚpagesrN   r5   Ú	all_itemsÚneededÚapi_start_pageÚpageÚ	api_itemsÚresultsÚiÚitemÚdetailÚconnÚcurÚ	new_countÚ
skip_countÚrecrW   rn   s                      r   Úmainr£   ¬   sž  € Ø€EÜ
Œ3�8‰8ƒ}�qÒÜ”C—H‘H˜Q‘KÓ ˆô 
Ð ¤ 
Ð
+´#·*±*Õ=Ü�‰”H¤g°rˆÓ:€AØ€A„JØ�6‰6€Dô % TÓ*€IÜ	ˆNœ3˜y›>Ð*Ð
+´#·*±*Õ=ð ”XÑ€FÜ
ˆ9ƒ~˜Òä&¬(Ñ2°aÑ7ˆÜ�)‹n˜vÒ%Ø!¤S¨£^´lÑ%BÄxÑ$OÑOˆDØ�nÒ$Ø%�ÜÐ(¨¨¨cÐ2¼¿¹ÕDÜ& tÓ,ˆIÙÜÐ=¸d¸VÐDÌ3Ï:É:ÕVØØ×Ñ˜YÔ'Ü�J‰J�sŒOô �)‹n˜vÓ%ð ˜'˜6Ð"€IÜ	Ð$¤S¨£^Ð$4Ð
5¼C¿J¹JÕGð €GÜ˜YÓ'ò ‰ˆˆ4Ü��A�a‘C�5˜œ#˜i›.Ð)¨¨D°©M¸#¸2Ð,>Ð+?Ð@ÄsÇzÁzÕRÜ  U¡Ó,ˆÙØ�N‰NØ ™Ø  ™KØ˜v™Ò6¨$¨v©,Ø:Ø! )Ñ,Ø6<¸YÒ6G˜6 )Ñ,¨T¨cÑ2ÈRñô ô 	�
‰
�3�ðô �?‰?œ7¨BÔ/€DØ
�+‰+‹-€CØ€IØ€JØò 7ˆð	7Ø�K‰KÐAÀCÈ
ÁOÐCUÔVØ�|‰|Œ~Ø˜a‘�
ØØ˜)‘nÒ*¨ˆGØ�K‰Kð ô œ8 S¨¡_°c¸'±lÀCÈÁKÒD_ÐS_Ø�F‘Ò+˜|¨c°)©nÒ.BÀÀDÀSÐ-IØ˜^¨Q°¸¸RÀØ˜x¨7Ñ2™!¸¼;ð	ô
ð �|‰|˜aÒØ˜Q‘‘	à˜a‘�
Ø�K‰K�Mð-7ð2 	‡J�J„LÜ	ˆN˜9˜+ W¨Z¨L¸¼SÀ»\¸NÈ#Ð
NÐVZÖ[øô ò 	7Ü�L  Ð$¬3¯:©:×6Ó6ûð	7ús   Ê#+NËBNÎ	N:ÎN5Î5N:Ú__main__)r   ) Ú__doc__Úrequestsre   rg   r†   rK   r‰   ÚosÚbs4r   r   r   r4   Úgetenvr‹   r�   r�   rƒ   rI   rG   rF   r„   rJ   ra   ÚSessionrH   r   r9   rQ   rv   r£   Ú__name__© r    r   ú<module>r­      sÈ   ðñ÷ 2× 1× 1Ó 1Ý Ý  à$€Ø
ˆ"�)‰)�KÐ!2Ó
3€Ø6€	Ø#€ØÐ3Ñ3€Ø
Ð?Ñ
?€Ø2€	Ø€Ø€ð QØñ€ð
 ÐPð€ð ˆ(×
Ñ
Ó
€óòò2òD?òDS\ðl ˆzÒÙ…Fð r    