Ë
    V_Š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mZ ddlm	Z	 dZ
dZdZdZd	Zd
ZddddœZdZd„ Zdd„Zd„ Zd„ Zd„ Zdefd„Zd„ Zedk(  rxdej4                  v ZerdneZdej4                  v rKej4                  j;                  d«      Zedz    eej4                  «      k  r e ej4                  edz      «      Z eee¬«       yy)u�   
å¿»å·žå¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€ - é€šçŸ¥å…¬å‘Šå…¬ç¤º
https://zwgk.sxxz.gov.cn/szfgzbm/shjbhj/gzdt_9907/tzgg/
è‡ªå®šä¹‰ CMS (æ”¿åºœä¿¡æ�¯å…¬å¼€å¹³å�°)
é    N)ÚBeautifulSoup)Úurljoinz/root/search.dbu%   å¿»å·žå¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€-é€šçŸ¥å…¬å‘Šu   å±±è¥¿z7https://zwgk.sxxz.gov.cn/szfgzbm/shjbhj/gzdt_9907/tzgg/é   é   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-Languagez›INSERT OR IGNORE INTO gov_raw 
    (site_name, page_url, title, publish_date, summary, content, category, attachments)
    VALUES (?, ?, ?, ?, '', ?, ?, ?)c                  ó|   — dd l } | j                  t        «      }|j                  d«       |j                  d«       |S )Nr   zPRAGMA journal_mode=WALzPRAGMA busy_timeout=5000)Úsqlite3ÚconnectÚDB_PATHÚexecute)r	   Úconns     ú/root/gov_crawler/crawl_sxxz.pyÚinit_dbr      s2   € ÛØ�?‰?œ7Ó#€DØ‡L�LÐ*Ô+Ø‡L�LÐ+Ô,Ø€Kó    c                 óL   — t        j                  | t        |¬«      }d|_        |S )N)ÚheadersÚtimeoutzutf-8)ÚrequestsÚgetÚHEADERSÚencoding)Úurlr   Úrs      r   Úfetchr   $   s    € Ü�‰�S¤'°7Ô;€AØ€A„JØ€Hr   c                 ó   — t        | «      S )u'   ä¿�ç•™ HTML è¡¨æ ¼ç»“æž„ï¼ˆä¸�è½¬ mdï¼‰)Ústr)ÚtableÚargsÚkwargss      r   Útable_to_markdownr    *   s   € äˆu‹:Ðr   c                 óü   — g }| j                  dd¬«      }|r/|D ])  }|j                  dd¬«      }|sŒ|j                  |«       Œ+ n&| j                  dd¬«      }|r|j                  |«       dj                  |«      S )zqExtract text preserving <p> boundaries as 

 separators.
    Handles nested <p> (CMS wraps content in extra <p>).ÚpT)Ú	recursiveú ©Ústripú

)Úfind_allÚget_textÚappendÚjoin)ÚelementÚpartsÚinner_psr"   Útxts        r   Úextract_text_paragraphsr0   .   s†   € ð €EØ×Ñ ¨tÐÓ4€HÙØò 	"ˆAØ—*‘*˜S¨�*Ó-ˆCÚØ—‘˜SÕ!ñ	"ð
 ×Ñ˜s¨$ÐÓ/ˆÙØ�L‰L˜ÔØ�;‰;�uÓÐr   c                 óh  — 	 t        | «      }|j                  dk7  ry t	        |j
                  d«      }d}|j                  dd	d
i¬«      }|r$|j                  d«      r|d   j                  «       }d}|j                  dd	di¬«      }|rD|j                  d«      r3|d   j                  «       }|j                  dd«      j                  «       }d}|j                  d«      }	|	rÕg }
|	j                  D ]w  }|j                  €Œ|j                  j                  «       }|dv r t        |«      }|sŒ<|
j                  |«       ŒN|dk(  r t!        |«      }|sŒa|
j                  |«       Œs|dv sŒxŒy dj#                  |
«      }t%        j&                  dd|«      }t%        j&                  dd|«      j                  «       }g }|j)                  dd¬«      D ]u  }|d   }t%        j*                  d|t$        j,                  «      sŒ.|j/                  d¬«      xs |j1                  d«      d   }t3        | |«      }|j                  ||dœ«       Œw t5        |j                  «       «      dk  r	d| › d |› d!�}||||rt7        j8                  |d"¬#«      d$œS dd$œS # t        $ r}t        d| › d|› �d¬«       Y d }~y d }~ww xY w)%Nz
  [ERROR] ú: T©ÚflushéÈ   úhtml.parserÚ ÚmetaÚnameÚArticleTitle)ÚattrsÚcontentÚPubDatez	 00:00:00zdiv.article-body)r"   Údivr   )ÚscriptÚstyleÚbrr'   z\n{3,}u$   æ‰«ä¸€æ‰«åœ¨æ‰‹æœºæ‰“å¼€å½“å‰�é¡µé�¢Úa)ÚhrefrC   z"\.(pdf|doc|docx|xls|xlsx|rar|zip)$r%   ú/éÿÿÿÿ)r9   r   r   z<p><a href="z">u!   </a></p>
ï¼ˆæœ¬æ–‡ä¸ºPDFé™„ä»¶ï¼‰F)Úensure_ascii)Útitler<   Úpub_dateÚattachments)r   Ú	ExceptionÚprintÚstatus_coder   ÚtextÚfindr   r&   ÚreplaceÚ
select_oneÚchildrenr9   Úlowerr0   r*   r    r+   ÚreÚsubr(   ÚsearchÚ
IGNORECASEr)   Úsplitr   ÚlenÚjsonÚdumps)r   r   ÚeÚsouprG   ÚmtrH   ÚmdÚcontent_textÚbodyr-   ÚchildÚtnr/   Úattachments_listÚa_tagÚhÚatÚfus                      r   Úextract_detailrh   ?   s®  € ðÜ�#‹Jˆð 	‡}�}˜ÒØÜ˜Ÿ™ Ó/€Dà€EØ	�‰�6 &¨.Ð!9ˆÓ	:€BÙ	ˆb�f‰f�YÔØ�9‘×#Ñ#Ó%ˆà€HØ	�‰�6 &¨)Ð!4ˆÓ	5€BÙ	ˆb�f‰f�YÔØ�i‘=×&Ñ&Ó(ˆØ×#Ñ# K°Ó4×:Ñ:Ó<ˆà€LØ�?‰?Ð-Ó.€DÙØˆØ—]‘]ò 	ˆEØ�z‰zÐ!ØØ—‘×!Ñ!Ó#ˆBØ�\Ñ!Ü-¨eÓ4�ÚØ—L‘L Õ%Ø�w’Ü& uÓ-�ÚØ—L‘L Õ$ØÐ0Ò0Øð	ð —{‘{ 5Ó)ˆÜ—v‘v˜i¨°Ó>ˆÜ—v‘vÐEÀrÈ<ÓX×^Ñ^Ó`ˆàÐØ—‘˜s¨�Ó.ò =ˆØ�&‰MˆÜ�9‰9Ð:¸A¼r¿}¹}ÕMØ—‘ d�Ó+Ò?¨q¯w©w°s«|¸BÑ/?ˆBÜ˜˜a“ˆBØ×#Ñ#¨R¸Ñ$;Õ<ð=ô ˆ<×ÑÓÓ  2Ò%Ø% c U¨"¨U¨GÐ3UÐVˆð ØØÙK[”t—z‘zÐ"2ÀÔGñ	ð ð bdñ	ð øôg ò Ü�
˜3˜%˜r ! Ð%¨TÕ2Üûðús   ‚J Ê	J1ÊJ,Ê,J1Fc                 óf  — t        dt        › d|› �d¬«       t        «       }|j                  «       }dx}x}}t	        d|dz   «      D �]9  }t        |«      }|st        d|› d�d¬«        �n|dz  }|D ]Í  }	|	d	   |	d
   |	d   }}}
|j                  d|f«       |j                  «       r|dz  }Œ;t        |«      }|€|dz  }ŒN|d	   rt        |d	   «      t        |
«      kD  r|d	   }
t        j                  dd|
«      }
|d   }|d   }|j                  t        t        ||
|xs |d   |t        |f«       |dz  }| sŒÇ|dk\  sŒÍ n |j                  «        | r|dk\  rt        d|› �d¬«        nt        j                   d«       �Œ< |j#                  «        t        dt        › d|› d|› d|› �d¬«       |S )Nú[z] Starting, max_pages=Tr3   r   é   ú  Page z empty, stoprG   r   Údatez)SELECT id FROM gov_raw WHERE page_url = ?u   ^æ ‡é¢˜[ï¼š:]\s*r7   r<   rI   rH   é
   z  Test: stop after z] Done. Inserted=z
, Skipped=z, Pages=)rK   Ú	SITE_NAMEr   ÚcursorÚrangeÚextract_list_pager   Úfetchonerh   rX   rS   rT   Ú
INSERT_SQLÚCATEGORYÚcommitÚtimeÚsleepÚclose)Ú	test_modeÚ	max_pagesr   ÚcurÚtotal_insertedÚtotal_skippedÚpages_crawledÚpnÚitemsÚitemrG   r   rm   Údetailr<   rI   s                   r   Úcrawlr„   }   sð  € Ü	ˆAŒiˆ[Ð.¨y¨kÐ
:À$ÕGÜ‹9€DØ
�+‰+‹-€CØ56Ð6€NÐ6�] ]Ü�A�y 1‘}Ó%ó  ˆÜ! "Ó%ˆÙÜ�G˜B˜4˜|Ð,°DÕ9ÚØ˜ÑˆØò 	ˆDØ# G™}¨d°5©k¸4À¹<˜�3ˆEØ�K‰KÐCÀcÀVÔLØ�|‰|Œ~Ø Ñ"�ØÜ# CÓ(ˆFØˆ~Ø Ñ"�ØØ�gŠ¤3 v¨g¡Ó#7¼#¸e»*Ò#DØ˜w™�Ü—F‘FÐ.°°EÓ:ˆEØ˜YÑ'ˆGØ  Ñ/ˆKØ�K‰Kœ
Ü˜3  tÒ'A¨v°jÑ/AØœ ;ð%ô ð ˜aÑˆNÚ˜^¨rÓ1Ùð+	ð, 	�‰ŒÙ˜¨2Ò-ÜÐ'¨Ð'7Ð8ÀÕEÙÜ�
‰
�1ŽðA ðB 	‡J�J„LÜ	ˆAŒiˆ[Ð)¨.Ð)9¸ÀMÀ?ÐRZÐ[hÐZiÐ
jÐrvÕwØÐr   c                 ó  — | dk(  rt         }nt         › d| dz
  › d�}	 t        |«      }|j                  dk7  rt        d	|j                  › d
| › �d¬«       g S t        |j                  d«      }g }|j                  dd¬«      D ]¼  }|j                  d«      }|sŒ|j                  dd«      j                  «       }|j                  dd«      j                  «       }	|	s|j                  d¬«      }	|	r|sŒpt        t         |«      }
|j                  d¬«      }|r|j                  d¬«      nd}|j                  |	|
|dœ«       Œ¾ t        d| › dt        |«      › d�d¬«       |S # t        $ r}t        d| › d|› �d¬«       g cY d }~S d }~ww xY w)Nrk   Úindex_z.shtmlz  [ERROR] Page r2   Tr3   r5   z  [ERROR] HTTP z page r6   Úlizgovinfo-list-title-item)Úclass_rB   rC   r7   rG   r%   Úright)rG   r   rm   rl   z items)ÚBASE_URLr   rJ   rK   rL   r   rM   r(   rN   r   r&   r)   r   r*   rX   )Úpage_numr   r   r[   r\   r�   r‡   rB   rC   rG   Úfull_urlÚ	date_spanÚdate_strs                r   rr   rr   ¨   sŒ  € Ø�1‚}Ü‰ä�
˜& ¨A¡ ¨fÐ5ˆðÜ�#‹Jˆð 	‡}�}˜ÒÜ� §¡˜¨f°X°JÐ?ÀtÕLØˆ	Ü˜Ÿ™ Ó/€DØ€EØ�m‰m˜DÐ)BˆmÓCò JˆØ�G‰G�C‹LˆÙØØ�u‰u�V˜RÓ ×&Ñ&Ó(ˆØ—‘�g˜rÓ"×(Ñ(Ó*ˆÙØ—J‘J T�JÓ*ˆEÙ™DØÜœ8 TÓ*ˆØ—G‘G 7�GÓ+ˆ	Ù5>�9×%Ñ%¨DÐ%Ô1ÀBˆØ�‰˜u¨X¸xÑHÕIðJô 
ˆG�H�:˜R¤ E£
˜|¨6Ð
2¸$Õ?Ø€Løô/ ò Ü� ˜z¨¨A¨3Ð/°tÕ<Ø�	ûðús   �E Å	FÅ(FÅ<FÆFÚ__main__z--testé   z--max-pagesrk   )rz   r{   )é   )!Ú__doc__rY   rS   Úsysrw   r   Úbs4r   Úurllib.parser   r   ro   ru   rŠ   Ú	MAX_PAGESÚPER_PAGEr   rt   r   r   r    r0   rh   r„   rr   Ú__name__Úargvrz   ÚmpÚindexÚidxrX   Úint© r   r   ú<module>rŸ      sù   ðñ÷
 %× $Ó $Ý Ý  à
€Ø3€	Ø€ØD€Ø€	Ø€ð DØOØ0ñ€ð
(€
ò
óòòò";ð|  Yó (òVðB ˆzÒØ˜CŸH™HÐ$€IÙ‰˜Y€BØ˜Ÿ™Ñ Ø�h‰h�n‰n˜]Ó+ˆØ�‰7‘S˜Ÿ™“]Ò"Ù�S—X‘X˜c A™gÑ&Ó'ˆBÙ	�I¨Ö,ð r   