Ë
    Æq«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	 dZ
dZedz   ZdZdZd	d
iZddddddedœZdZdZd„ Zdd„Zd„ Zd„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)uQ  
crawl_penglai_tzgg.py - è“¬èŽ±åŒº-é€šçŸ¥å…¬å‘Š
CMS: è“¬èŽ±åŒºæ”¿åºœ JPAAS CMS
åˆ—è¡¨: GET /api-gateway/jpaas-publish-server/front/page/build/unit
      paramJson={"pageNo":N, "pageSize":25}, pageId=13426
è¯¦æƒ…: /col/col13426/art/YYYY/art_{hash}.html
æ ‡é¢˜: meta[ArticleTitle]
æ—¥æœŸ: meta[PubDate]
å†…å®¹: div#zoom (p + table æ··å�ˆ)
é    N)ÚBeautifulSoupz/root/search.dbzhttps://www.penglai.gov.cnz7/api-gateway/jpaas-publish-server/front/page/build/unitu   è“¬èŽ±åŒº-é€šçŸ¥å…¬å‘ŠÚ13426z
User-AgentzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36ÚbulidstaticÚ152ÚawU93spIZ5G7CYnk12KGtÚcolumnõ   å½“å‰�æ �ç›®åˆ—è¡¨Únull)Ú	parseTypeÚwebIdÚtplSetIdÚpageTypeÚtagIdÚeditTypeÚpageIdu   å±±ä¸œu   å…¶ä»–c                 óv  ‡— | s| S | D �cg c]  }t        |t        «      sŒ|‘Œ }}t        |«      t        | «      k7  r| S t        «       g }}| D ])  }||vsŒ|j	                  |«       |j                  |«       Œ+ |D �‡cg c]&  Št        ‰«      dk\  rt        ˆfd„|D «       «      s‰‘Œ( }}|r|S |S c c}w c c}w )uB  å‰”é™¤ã€Œå®¹å™¨æ®µã€�ï¼šfind_all(['p','div']) ä¼šå�Œæ—¶æ”¶ä¸‹å®¹å™¨ <div> ä¸Žå®ƒå†…éƒ¨çš„ <p>ï¼Œ
    å¯¼è‡´å�Œä¸€å†…å®¹é‡�å¤�ï¼ˆå®¹å™¨é‚£ä»½å¸¸è¿˜è¢« get_text(strip=True) æ‹�å¹³ï¼‰ã€‚
    åˆ¤æ�®ï¼šæŸ�æ®µè¢«åˆ—è¡¨å†…å�¦ä¸€æ®µå®Œå…¨åŒ…å�« â†’ å®ƒæ˜¯å®¹å™¨æ®µ â†’ å‰”é™¤ã€‚
    ä¿�æŠ¤ï¼šå‰”é™¤å�Žä¸ºç©ºåˆ™åŽŸæ ·è¿”å›žã€‚
    é(   c              3   ó:   •K  — | ]  }|‰uxr |xr |‰v –— Œ y ­w)N© )Ú.0ÚbÚas     €ú'/root/gov_crawler/crawl_penglai_tzgg.pyú	<genexpr>z(_drop_container_parts.<locals>.<genexpr>@   s&   øè ø€ Ò(SÈ¨°!¨Ò)D¸Ò)D¸aÀ1¸fÓ)DÑ(Sùs   ƒ)Ú
isinstanceÚstrÚlenÚsetÚaddÚappendÚany)ÚpartsÚpÚpsÚseenÚuniqr   Úkeeps        ` r   Ú_drop_container_partsr(   -   sÇ   ø€ ñ ØˆØÖ	1�œj¨¬CÕ0Š!Ð	1€BÐ	1Ü
ˆ2ƒw”#�e“*ÒØˆô “˜ˆ$€DØò (ˆØ�DŠ=Ø�H‰H�QŒK˜Ÿ™ Q�ð(ð ÷ V�!Ü˜“F˜b’L¤SÓ(SÈdÔ(SÔ%Sò ð V€Dð Váˆ4Ð!˜TÐ!ùò 
2ùòVs   ŠB1 B1Á>+B6c                 ó¸  — t        t        «      }t        j                  ||dœd¬«      |d<   	 | j	                  t
        |t        d¬«      }|j                  «       }|j	                  di «      j	                  dd	«      }t        j                  d
|«      }|rt        |j                  d«      «      nd}||fS # t        $ r}	t        d|› d|	› �«       Y d}	~	yd}	~	ww xY w)z*Fetch one page of list data from JPAAS API)ÚpageNoÚpageSizeF)Úensure_asciiÚ	paramJsoné   )ÚparamsÚheadersÚtimeoutÚdataÚhtmlÚ zcount="(\d+)"é   r   z  [API ERROR] page ú: N)Nr   )ÚdictÚ
API_PARAMSÚ_jsonÚdumpsÚgetÚAPI_URLÚHEADERSÚjsonÚreÚsearchÚintÚgroupÚ	ExceptionÚprint)
ÚsessionÚpage_noÚ	page_sizer/   Úrr2   r3   Úcount_mÚtotalÚes
             r   Úfetch_list_pagerL   D   sÅ   € ä”*Ó€FÜŸ+™+°ÀiÑ&PÐ_dÔe€Fˆ;Ñð
Ø�K‰Kœ¨¼ÈˆKÓLˆØ�v‰v‹xˆØ�x‰x˜ Ó#×'Ñ'¨°Ó3ˆä—)‘)Ð,¨dÓ3ˆÙ)0”�G—M‘M !Ó$Ô%°aˆØ�Uˆ{ÐøÜò ÜÐ# G 9¨B¨q¨cÐ2Ô3Üûðús   ®BB5 Â5	CÂ>CÃCc                 ól  — g }t        | d«      }|j                  d¬«      }|s|S |j                  d«      D ]û  }|j                  d«      }|j                  d«      }|r|j                  d«      sŒ9|j                  dd«      j	                  «       }|j                  d	d«      j	                  «       xs |j                  d
¬«      }|r|j                  d
¬«      nd}	t        j                  d|	«      }
|
r|
j                  d«      nd}|j                  d«      r	t        |z   }|j                  |||f«       Œý |S )z:Parse JPAAS list HTML to extract (url, title, date) tuplesúhtml.parserr	   ©ÚidÚlir   ÚspanÚhrefr4   ÚtitleT©Ústripú(\d{4}-\d{2}-\d{2})r5   ú/)r   ÚfindÚselectr;   rV   Úget_textr?   ÚmatchrB   Ú
startswithÚBASE_URLr    )r3   ÚitemsÚsoupÚcontent_divrQ   r   rR   rS   rT   Ú	date_textÚdate_mÚdate_strs               r   Ú
parse_listre   U   s  € à€EÜ˜˜}Ó-€DØ—)‘)Ð3�)Ó4€KÙØˆØ× Ñ  Ó&ò .ˆØ�G‰G�C‹LˆØ�w‰w�v‹ˆÙ˜Ÿ™˜fœØØ�u‰u�V˜RÓ ×&Ñ&Ó(ˆØ—‘�g˜rÓ"×(Ñ(Ó*ÒD¨a¯j©j¸t¨jÓ.DˆÙ15�D—M‘M¨�MÔ-¸2ˆ	Ü—‘Ð0°)Ó<ˆÙ&,�6—<‘< ”?°"ˆØ�?‰?˜3ÔÜ˜d‘?ˆDØ�‰�d˜E 8Ð,Õ-ð.ð €Ló    c                 ó¢   — 	 | j                  |t        d¬«      }d|_        |j                  S # t        $ r}t        d|› �«       Y d}~yd}~ww xY w)zFetch detail page HTMLr.   )r0   r1   zutf-8zERR:N)r;   r=   ÚencodingÚtextrC   rD   )rE   ÚurlrH   rK   s       r   Úfetch_detailrk   l   sL   € ðØ�K‰K˜¤W°bˆKÓ9ˆØˆŒ
Ø�v‰vˆøÜò Ü��Q�CˆjÔÜûðús   ‚*- ­	A¶A	Á	Ac           	      ó¦  — t        | d«      }d}|j                  ddt        j                  dt        j                  «      i¬«      }|r$|j                  d«      r|d   j                  «       }|s%|j                  d«      }|r|j                  d	¬
«      }d}dD ]Œ  }|j                  ddt        j                  |t        j                  «      i¬«      }|sŒ=|j                  d«      sŒO|d   j                  «       }	t        j                  d|	«      }
|
sŒ{|
j                  d«      } n d}d}|j                  dd¬«      }|rïg }|j                  g d¢d	¬«      D ]¹  }|j                  dk(  r,|j                  d	¬
«      }|sŒ'|dvsŒ,|j                  |«       Œ>|j                  dk(  rd	}|j                  t        |«      «       Œj|j                  dv sŒy|j                  d	¬
«      }|sŒŽ|dvsŒ“|j                  ddg«      }|rŒ©|j                  |«       Œ» t        |«      }dj                  |«      }|rt        j                   dd|«      dd nd}|||||fS )z-Extract title, date, content from detail pagerN   r4   ÚmetaÚnameÚArticleTitle)ÚattrsÚcontentrT   TrU   )ÚPublishDateÚPubDateÚpublishdateÚpubdaterW   r5   FÚdivÚzoomrO   )r#   Útablerv   rR   )Ú	recursiver#   )õ   Â r4   rx   )rv   rR   z

z<[^>]+>NéÈ   )r   rY   r?   ÚcompileÚIr;   rV   r[   r\   rB   Úfind_allrn   r    r   r(   ÚjoinÚsub)r3   rj   r`   rT   Ú
meta_titleÚ	title_tagrd   rn   Ú	meta_dateÚrawÚmrq   Ú	has_tablerw   r"   Úelemri   Ú
has_nestedÚsummarys                      r   Úextract_detailrŠ   w   s+  € ä˜˜}Ó-€Dð €EØ—‘˜6¨&´"·*±*¸_ÌbÏdÉdÓ2SÐ)T�ÓU€JÙ�j—n‘n YÔ/Ø˜9Ñ%×+Ñ+Ó-ˆÙØ—I‘I˜gÓ&ˆ	ÙØ×&Ñ&¨TÐ&Ó2ˆEð €HØDò ˆØ—I‘I˜f¨V´R·Z±ZÀÄbÇdÁdÓ5KÐ,L�IÓMˆ	Ú˜Ÿ™ yÕ1Ø˜IÑ&×,Ñ,Ó.ˆCÜ—‘Ð/°Ó5ˆAÚØŸ7™7 1›:�Ùðð €GØ€IØ�9‰9�U˜vˆ9Ó&€DÙØˆØ—M‘MÒ"?È4�MÓPò 	+ˆDØ�y‰y˜CÒØ—}‘}¨4�}Ó0�Ú˜D¨Ò4Ø—L‘L Õ&Ø—‘˜gÒ%Ø �	Ø—‘œS ›YÕ'Ø—‘˜oÒ-à—}‘}¨4�}Ó0�Ú˜D¨Ò4à!%§¡¨C°¨>Ó!:�JÚ%ØŸ™ TÕ*ð	+ô  & eÓ,ˆØ—+‘+˜eÓ$ˆñ 8?Œb�f‰f�Z  WÓ-¨d¨sÑ3ÀB€Gà�(˜G W¨iÐ7Ð7rf   c                 ó  — ddl }|j                  t        d¬«      }|j                  «       }d}g }| D ]Ž  \  }}}}	}
}	 |j	                  d|f«       |j                  «       }|rŒ1|j	                  d||t        |||	|dt        |
rdndt        d	f«       |j                  }|r|j                  ||t        |	xs d
f«       |dz  }Œ� |j                  «        |rK|D ]  \  }}}}		 |j	                  d||||	f«       Œ  |j                  «        t        dt        |«      › d�«       |j                  «        |S # t        $ r}t        d|dd › d|› �«       Y d}~�Œ#d}~ww xY w# t        $ r}t        d|› d|› �«       Y d}~Œ¥d}~ww xY w)z.Batch insert into gov_raw and gov_search (FTS)r   Né
   )r1   z)SELECT id FROM gov_raw WHERE page_url = ?züINSERT INTO gov_raw 
                   (page_url, title, site_name, publish_date, content, summary, 
                    source_url, category, industry, has_table, group_name, script_name)
                   VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)u   æ”¿åºœå…¬å‘Šr5   zcrawl_penglai_tzgg.pyr4   z  [DB ERROR] r.   r6   zVINSERT OR IGNORE INTO gov_search(rowid, title, site_name, summary) VALUES (?, ?, ?, ?)z  [FTS ERROR] id=u     FTSå�Œæ­¥: õ   æ�¡)Úsqlite3ÚconnectÚDB_PATHÚcursorÚexecuteÚfetchoneÚ	SITE_NAMEÚINDUSTRYÚGROUPÚ	lastrowidr    rC   rD   Úcommitr   Úclose)Ú
items_datarŽ   ÚconnÚcÚinsertedÚ	fts_batchrT   rd   rq   r‰   r†   Úpage_urlÚexistingÚnew_idrK   ÚridÚsites                    r   Ú
save_to_dbr¤   ¯   s«  € ãØ�?‰?œ7¨Bˆ?Ó/€DØ�‰‹€AØ€HØ€IØBLò 5Ñ>ˆˆx˜ '¨9°hð	5à�I‰IÐAÀHÀ;ÔOØ—z‘z“|ˆHÙØà�I‰IðBð ˜5¤)¨X°wÀØ˜>¬8¹)±QÈÌEÐSjðlôð —[‘[ˆFÙØ× Ñ  &¨%´¸GºMÀrÐ!JÔKØ˜‰M‰Hð'5ð, 	‡K�K„Mñ Ø)2ò 	6Ñ%ˆC�˜˜gð6Ø—	‘	ØlØ˜%  wÐ/õð	6ð 	�‰ŒÜ�œc )›nÐ-¨SÐ1Ô2à‡J�J„LØ€Oøô% ò 	5Ü�M %¨¨ * ¨R°¨sÐ3×4Ò4ûð	5ûô ò 6ÜÐ)¨#¨¨b°°Ð4×5Ñ5ûð6ús6   ½%D2Á#AD2Ã EÄ2	EÄ;EÅEÅ	FÅ&E<Å<Fc            
      ó>  — dd l } | j                  t        › d�¬«      }|j                  dt        dd¬«       |j                  dd	d
¬«       |j                  «       }|j                  rdn|j                  }t        j                  «       }d}t        d|dz   «      D �]B  }t        dt        j                  d«      › d|› d�dd¬«       t        ||«      \  }}|st        d«        nüt        |«      }	|	st        d«        nât        t!        |	«      › d�d¬«       g }
|	D ]_  \  }}}t#        ||«      }|sŒt%        ||«      \  }}}}}|xs |}|xs |}|
j'                  ||||||f«       t        j(                  d«       Œa t+        |
«      }||z  }t        d|› dt!        |
«      › d|› d�d¬«       |j                  r�Œ!|dk(  s�Œ(t!        |
«      dkD  s�Œ8t        d«        n t        d«       t        d |› d!�«       t        d"t        › �«       t        d#t,        › �«       y )$Nr   u   çˆ¬è™«)Údescriptionz--pagesé   u   çˆ¬å�–é¡µæ•°)ÚtypeÚdefaultÚhelpz--fullÚ
store_trueu   å…¨é‡�çˆ¬å�–)Úactionrª   iç  r5   ú[z%H:%M:%Su   ] ç¬¬u   é¡µ...ú T)ÚendÚflushu   å¤±è´¥u   æ— æ•°æ�®ï¼Œå�œæ­¢r�   )r°   g333333Ó?u     å…¥åº“rX   u   æ�¡ (ç´¯è®¡ú)u      å…¨éƒ¨å·²å­˜åœ¨ï¼Œå¢žé‡�å�œæ­¢u   
===== å®Œæˆ� =====u   æ–°å¢žå…¥åº“: u    æ�¡u   ç«™ç‚¹: u   åˆ†ç»„: )ÚargparseÚArgumentParserr”   Úadd_argumentrA   Ú
parse_argsÚfullÚpagesÚrequestsÚSessionÚrangerD   ÚtimeÚstrftimerL   re   r   rk   rŠ   r    Úsleepr¤   r–   )r²   ÚparserÚargsÚ	max_pagesrE   Ú	total_newrF   r3   rJ   r_   ÚbatchrS   rT   rd   Údetail_htmlÚdetail_titleÚdetail_daterq   r‰   r†   Úfinal_titleÚ
final_dateÚsaveds                          r   ÚmainrÉ   ß   s   € ÛØ×$Ñ$´I°;¸fÐ1EÐ$ÓF€FØ
×Ñ˜	¬°Q¸^ÐÔLØ
×Ñ˜¨¸NÐÔKØ×ÑÓ€Dà—y’y‘ d§j¡j€IÜ×ÑÓ €Gà€Iä˜˜I¨™MÓ*ó ˆÜ�”$—-‘- 
Ó+Ð,¨E°'°¸&ÐAÀsÐRVÕWÜ% g¨wÓ7‰ˆˆeÙÜ�(ŒOÙä˜4Ó ˆÙÜÐ&Ô'ÙÜ”�U“�˜CÐ ¨Õ-àˆØ%*ò 	Ñ!ˆD�%˜Ü& w°Ó5ˆKÙØÜESÐT_ÐaeÓEfÑBˆL˜+ w°¸Ø&Ò/¨%ˆKØ$Ò0¨ˆJØ�L‰L˜+ z°7¸GÀYÐPTÐUÔVÜ�J‰J�s�Oð	ô ˜5Ó!ˆØ�UÑˆ	Ü�˜˜˜q¤ U£ ¨K¸	°{À!ÐDÈDÕQð �yŒy˜U aœZ¬C°«J¸¬NÜÐ4Ô5Ùð?ôB 
Ð Ô"Ü	ˆN˜9˜+ TÐ
*Ô+Ü	ˆH”Y�KÐ
 Ô!Ü	ˆH”U�GÐ
Õrf   Ú__main__)é   )Ú__doc__r¸   r?   ÚsysÚosr»   r>   r9   Úbs4r   r�   r^   r<   r”   ÚPAGE_IDr=   r8   r–   r•   r(   rL   re   rk   rŠ   r¤   rÉ   Ú__name__r   rf   r   ú<module>rÒ      s¶   ðñ	ó Û 	Û 
Û 	Û Û Ý à
€Ø'€Ø
ÐNÑ
N€Ø$€	Ø
€ð ð  Dð€ð
 ØØ'ØØ!ØØñ€
ð 	€Ø€ò"ó.ò"ò.ò58òp-ò`0ðf ˆzÒÙ…Fð rf   