Ë
    V_ŠjÔ"  ã                   ó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	e	dz   Z
dZdZdd	d
dœZd„ Zd!d„Zd„ Zd„ Zd„ Zd"d„Zedk(  réddlZ ej,                  d¬«      Zej1                  dedd¬«       ej1                  ddd¬«       ddlZ eej8                  «      dkD  r2ej8                  d   j;                  «       r eej8                  d   «      ndZe�+ ed e e«      z   «       ej8                  jC                  «        ejE                  «       Z# ee#jH                  e#jJ                  ¬ «       yy)#uÁ   ç« è´¡åŒºäººæ°‘æ”¿åºœ - é€šçŸ¥å…¬å‘Šçˆ¬è™«
ç«™ç‚¹: www.zgq.gov.cn (ç« è´¡åŒº, èµ£å·ž, æ±Ÿè¥¿)
æ �ç›®: /zgqzf/tzgg/list.shtml (é€šçŸ¥å…¬å‘Š)
CMS: ç« è´¡åŒºä¸»ç«™CMSï¼ˆå�Œarticle-content-bodyï¼‰
é    N)ÚBeautifulSoupzhttps://www.zgq.gov.cnz/zgqzf/tzgg/list.shtmlz/root/search.dbzwww.zgq.gov.cn-tzggz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36z`text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8zzh-CN,zh;q=0.9,en;q=0.8)z
User-AgentÚAcceptzAccept-Languagec                  óZ   — t        j                  t        «      } | j                  d«       | S )NzPRAGMA journal_mode=WAL)Úsqlite3ÚconnectÚDB_PATHÚexecute)Úconns    ú#/root/gov_crawler/crawl_zgq_tzgg.pyÚinit_dbr      s"   € Ü�?‰?œ7Ó#€DØ‡L�LÐ*Ô+Ø€Kó    c                 ó@  — 	 t        j                  | t        |¬«      }d|_        |j                  dk(  r|j
                  S t        d|j                  › d| › �t        j                  ¬«       y # t        $ r(}t        d|› �t        j                  ¬«       Y d }~y d }~ww xY w)N)ÚheadersÚtimeoutzutf-8éÈ   z  [WARN] HTTP z for )Úfilez  [ERROR] fetch failed: )
ÚrequestsÚgetÚHEADERSÚencodingÚstatus_codeÚtextÚprintÚsysÚstderrÚ	Exception)Úurlr   ÚrespÚes       r   Ú
fetch_pager       s†   € ð	Ü�|‰|˜C¬¸'ÔBˆØˆŒØ×Ñ˜sÒ"Ø—9‘9ÐÜ�˜t×/Ñ/Ð0°°c°UÐ;Ä#Ç*Á*ÕMØøÜò ÜÐ(¨¨Ð,´3·:±:Õ>Üûðús   ‚=A, Á +A, Á,	BÁ5BÂBc                 ó¾  — g }t        | d«      }|j                  d«      D �]¹  }|j                  dd¬«      }d}|D ]O  }|j                  d«      }|sŒd|j                  d	d
«      v sŒ,t	        |j                  d¬«      «      dkD  sŒK|dz  }ŒQ |dk\  sŒs|D �]@  }|j                  d«      }|rd|j                  d	d
«      vrŒ,|d	   j                  «       }|j                  d«      r
t        |z   }	n |j                  d«      r|}	nt        dz   |z   }	|j                  d«      xs |j                  d¬«      xs d
}
t        j                  dd|
«      j                  «       }
|
rt	        |
«      dk  rŒÙd
}|j                  g d¢«      D ];  }t        j                  d|j                  «       «      }|sŒ*|j                  d«      } n |j                  |	|
|dœ«       �ŒC  |S  |S )Núhtml.parserÚulÚliF)Ú	recursiver   Úaz/tzgg/ÚhrefÚ T©Ústripé   é   é
   ú/ÚhttpÚtitlez\s+ú é   )ÚspanÚemÚfontú(\d{4}-\d{2}-\d{2}))r   r0   Úpub_date)r   Úfind_allÚfindr   ÚlenÚget_textr*   Ú
startswithÚBASE_URLÚreÚsubÚsearchÚgroupÚappend)ÚhtmlÚitemsÚsoupr#   ÚlisÚcountr$   r&   r'   Úfull_urlr0   r7   ÚspÚms                 r   Ú
parse_listrK   '   sÒ  € Ø€EÜ˜˜}Ó-€Dà�m‰m˜DÓ!ó ˆØ�k‰k˜$¨%ˆkÓ0ˆØˆØò 	ˆBØ—‘˜“ˆAÚ�X §¡ v¨bÓ!1Ò1´c¸!¿*¹*È4¸*Ó:PÓ6QÐTUÓ6UØ˜‘
‘ð	ð �B‹;Øó V�Ø—G‘G˜C“L�Ù˜H¨A¯E©E°&¸Ó,<Ñ<ØØ˜‘y—‘Ó(�Ø—?‘? 3Ô'Ü'¨$™‘HØ—_‘_ VÔ,Ø#‘Hä'¨#™~°Ñ4�HØŸ™˜g›ÒF¨!¯*©*¸4¨*Ó*@ÒFÀB�ÜŸ™˜v s¨EÓ2×8Ñ8Ó:�Ù¤ E£
¨Q¢ØØ�ØŸ+™+Ò&<Ó=ò �BÜŸ	™	Ð"8¸"¿+¹+»-ÓH�AÚØ#$§7¡7¨1£:˜Ùð	ð
 —‘ X¸È8ÑTÖUð+Vð, Ø€Lð?ð> €Lr   c                 óx  ‡— t        | d«      }d}|j                  d«      }|r|j                  d¬«      }|s%|j                  d«      }|r|j                  d¬«      }d}|j                  d«      }|r7t        j                  d|j                  «       «      }|r|j                  d	«      }|sQ|j                  g d
¢«      D ];  }	t        j                  d|	j                  «       «      }|sŒ*|j                  d	«      } n |j                  dd¬«      }
|
s|j                  dd¬«      }
d}|j                  d«      }|r|j                  dd¬«      }g }|
rØ|
j                  d«      D ]Ä  }|j                  dd«      j                  «       Št        ˆfd„dD «       «      sŒ8‰j                  d«      s t        j                  j                  |‰«      Š|j                  d¬«      xs t        j                  j!                  ‰«      }t        ˆfd„|D «       «      rŒ±|j#                  ‰|dœ«       ŒÆ d}|
�r&|
j                  ddg«      D ]  }	|	j%                  «        Œ t'        «       }|
j                  d«      D ];  }|j                  d¬«      }||v rŒ|j)                  |«       |t+        |«      dz   z  }Œ= t        t+        |
«      d«      }|j                  d«      D ]  }	|	j%                  «        Œ |j                  d«      }|rD|D �cg c]'  }|j                  d¬«      sŒ|j                  d¬«      ‘Œ) }}dj-                  |«      }n|j                  dd¬«      }t        j.                  dd|«      }|r|d|z   z  }t1        |j                  «       «      d k  r"d!|› d"|› d#�}|D ]  }|d$|d%   › d&|d'   › d(�z  }Œ ||||fS c c}w ))Nr"   r(   Ú	ucaptitleTr)   Úh1ÚPUBLISHTIMEr6   r,   )r3   ÚpÚdivu(   å�‘å¸ƒæ—¥æœŸ[ï¼š:]\s*(\d{4}-\d{2}-\d{2})rQ   zarticle-content-body)Úclass_zarticle-contentÚucapcontentz

)Ú	separatorr*   r&   r'   c              3   ó@   •K  — | ]  }‰j                  |«      –— Œ y ­w)N)Úendswith)Ú.0Úextr'   s     €r   ú	<genexpr>zparse_detail.<locals>.<genexpr>m   s   øè ø€ Òu¨#�4—=‘= ×%Ñuùs   ƒ)	z.docz.docxz.pdfz.xlsz.xlsxz.zipz.rarz.pptz.pptxr/   c              3   ó.   •K  — | ]  }|d    ‰k(  –— Œ y­w)r   N© )rW   r&   r'   s     €r   rY   zparse_detail.<locals>.<genexpr>q   s   øè ø€ ÒA°˜1˜U™8 tÕ+ÑAùs   ƒ)r   r0   ÚscriptÚstyleÚtablerP   z\n{4,}u   

[è¡¨æ ¼]

é   z<p><a href="z">z	</a></p>
u
   
é™„ä»¶: [r0   z](r   ú))r   r9   r;   r>   r@   rA   r8   r   r*   Úanyr<   r   ÚcompatÚurljoinÚosÚpathÚbasenamerB   Ú	decomposeÚsetÚaddÚstrÚjoinr?   r:   )rC   r   rE   r0   ÚucaprN   r7   ÚptrJ   ÚtagÚcontent_divÚcontentÚucap_cÚattachmentsÚa_tagÚ	att_titleÚtables_htmlÚseen_tablesr^   ÚtxtÚcontent_div_cleanÚ
paragraphsrP   Ú
para_textsÚattr'   s                            @r   Úparse_detailr|   L   sš  ø€ Ü˜˜}Ó-€DØ€EØ�9‰9�[Ó!€DÙØ—‘ D�Ó)ˆÙØ�Y‰Y�t‹_ˆÙØ—K‘K d�KÓ+ˆEØ€HØ	�‰�=Ó	!€BÙ	Ü�I‰IÐ,¨b¯k©k«mÓ<ˆÙØ—w‘w˜q“zˆHÙØ—=‘=Ò!5Ó6ò 	ˆCÜ—	‘	ÐEÀsÇ|Á|Ã~ÓVˆAÚØŸ7™7 1›:�Ùð		ð
 —)‘)˜EÐ*@�)ÓA€KÙØ—i‘i Ð.?�iÓ@ˆØ€GØ�Y‰Y�}Ó%€FÙØ—/‘/¨F¸$�/Ó?ˆØ€KÙØ ×)Ñ)¨#Ó.ò 	JˆEØ—9‘9˜V RÓ(×.Ñ.Ó0ˆDÜÓuÐ1tÔuÕuØ—‘ vÔ.Ü#Ÿ?™?×2Ñ2°3¸Ó=�DØ!ŸN™N°˜NÓ6ÒP¼"¿'¹'×:JÑ:JÈ4Ó:P�	ÜÓA°[ÔAÕAØ×&Ñ&¨t¸iÑ'HÕIð	Jð €KÚØ×'Ñ'¨°7Ð(;Ó<ò 	ˆCØ�M‰M�Oð	ä“eˆØ ×)Ñ)¨'Ó2ò 	/ˆEØ—.‘. t�.Ó,ˆCØ�kÑ!ØØ�O‰O˜CÔ Øœ3˜u›:¨Ñ.Ñ.‰Kð	/ô *¬#¨kÓ*:¸MÓJÐØ$×-Ñ-¨gÓ6ò 	ˆCØ�M‰M�Oð	à&×/Ñ/°Ó4ˆ
ÙØ:DÖ_°QÈÏ
É
ÐY]È
ÕH^˜!Ÿ*™*¨4˜*Õ0Ð_ˆJÐ_Ø—k‘k *Ó-‰Gà'×0Ñ0¸6ÈÐ0ÓNˆGÜ�f‰f�Y ¨Ó0€GÙØÐ%¨Ñ3Ñ3ˆÜ
ˆ7�=‰=‹?Ó˜bÒ Ø    R¨ w¨jÐ9ˆØò 	CˆCØ˜ S¨¡\ N°"°S¸±Z°LÀÐBÑB‰Gð	Cà�'˜8 [Ð0Ð0ùò `s   Ë?N7ÌN7c                 óÄ   — |rt        j                  |d¬«      nd}t        t        |«      «      dz  dz   }| j	                  d|||||||||f	«       | j                  «        y )NF)Úensure_asciiz[]r-   r,   uû   
        INSERT OR REPLACE INTO gov_raw 
        (page_url, site_name, source_url, title, publish_date, summary, content, attachments, date_rank, status, category, visits)
        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 'published', 'é€šçŸ¥å…¬å‘Š', 0)
    )ÚjsonÚdumpsÚabsÚhashr	   Úcommit)	r
   Úpage_urlr0   Úsummary_textÚpublish_daterr   Ú	site_nameÚattachments_jsonÚlevels	            r   Úsave_articlerŠ   �   sg   € ÙFQ”t—z‘z +¸EÕBÐW[ÐÜ”�X“Ó "Ñ$ qÑ(€EØ‡L�Lð ð �I˜x¨°¸lÈLÐZjÐlqÐ	rô	tð
 	‡K�K…Mr   r+   c                 ó  — t        «       }d}d}t        «       }t        | «      D �]³  }|dk(  rt        }nt        j	                  dd|dz   › d�«      }t        d|dz   › d|› �«       t        |«      }|st        d|dz   › d�«        �nTt        |«      }	|	st        d	«        �n9|	D �
cg c]  }
|
d
   |vsŒ|
‘Œ }}
|	D ]  }
|j                  |
d
   «       Œ t        dt        |	«      › dt        |«      › d�«       |s|dkD  rt        d«        nÏ|D ]Ç  }|d
   }|d   }|d   }|r$|j                  d|f«      j                  «       }|rŒ8t        d|d d › d�«       t        |«      }|s|dz  }Œ]t        ||«      \  }}}}|s|r|}|rGt        ||||||t        «       |dz  }t        |«      }|rd|› d�nd}t        d|› d|d d › d|› �«       Œ½t        d«       ŒÉ �Œ¶ |j                  «        t        d|› d|› �«       y c c}
w )Nr   z.shtmlÚ_r,   z[PAGE z] z  [WARN] Page z unreachable, stoppingz  No articles found, stoppingr   z  Found z articles (z new)z  No new items, stoppingr0   r7   z/SELECT page_url FROM gov_raw WHERE page_url = ?z
  [FETCH] é2   z...z +u   é™„ä»¶r(   u       âœ“ saved [u       âœ— empty title, skippedz
[DONE] Total: z articles, Errors: )r   rh   ÚrangeÚLIST_URLÚreplacer   r    rK   ri   r:   r	   Úfetchoner|   rŠ   Ú	SITE_NAMEÚclose)Ú	max_pagesÚincrementalr
   ÚtotalÚerrorsÚ	seen_urlsÚpageÚlist_urlrC   rD   ÚitÚunique_itemsÚitemr   r0   Ú	list_dateÚexistingÚdetail_htmlÚdetail_titlerp   r7   rr   Ú	att_countÚatt_strs                           r   Úcrawlr¤   š   sY  € Ü‹9€DØ€EØ€FÜ“€IÜ�iÓ ó -7ˆØ�1Š9Ü‰Hä×'Ñ'¨°A°d¸1±f°X¸VÐ2DÓEˆHÜ��t˜A‘v�h˜b  
Ð+Ô,Ü˜(Ó#ˆÙÜ�N 4¨¡6 (Ð*@ÐAÔBÚÜ˜4Ó ˆÙÜÐ1Ô3ÚØ%*ÖI˜r¨b°©i¸yÒ.HšÐIˆÐIØò 	%ˆBØ�M‰M˜"˜U™)Õ$ð	%ä�œ˜U›˜ K´°LÓ0AÐ/BÀ%ÐHÔIÙØ�aŠxÜÐ0Ô2ÙØ ò 	7ˆDØ�u‘+ˆCØ˜‘MˆEØ˜ZÑ(ˆIÙØŸ<™<Ð(YÐ\_Ð[aÓb×kÑkÓm�ÙØÜ�J˜u S b˜z˜l¨#Ð.Ô/Ü$ S›/ˆKÙØ˜!‘�ØÜ;GÈÐUXÓ;YÑ8ˆL˜' 8¨[Ù¡	Ø$�ÙÜ˜T 3¨°g¸xÈÔV_Ô`Ø˜‘
�Ü Ó,�	Ù4=˜B˜y˜k¨Ñ0À2�Ü˜¨ z°°LÀÀ"Ð4EÐ3FÀcÈ'ÈÐSÕTäÐ4Õ6ò/	7ð--7ð\ 	‡J�J„LÜ	Ð˜U˜GÐ#6°v°hÐ
?Õ@ùòC Js   Â&G=Â3G=Ú__main__u'   ç« è´¡åŒºäººæ°‘æ”¿åºœé€šçŸ¥å…¬å‘Šçˆ¬è™«)Údescriptionz--max-pagesu   æœ€å¤§çˆ¬å�–é¡µæ•°)ÚtypeÚdefaultÚhelpz--incrementalÚ
store_trueu   å¢žé‡�æ¨¡å¼�)Úactionr©   r,   éÿÿÿÿz[AutoPg] max_pages=)r”   r•   )é   )r+   F)&Ú__doc__r   r   r>   r   rd   r   Úbs4r   r=   r�   r   r’   r   r   r    rK   r|   rŠ   r¤   Ú__name__ÚargparseÚArgumentParserÚparserÚadd_argumentÚintÚ_SYS2r:   ÚargvÚisdigitÚ_MAX_PGr   rj   ÚpopÚ
parse_argsÚargsr”   r•   r[   r   r   ú<module>r½      s<  ðñ÷ ,× +× +Ý à#€ØÐ.Ñ.€Ø
€Ø!€	ð QØpØ0ñ€òó

ò#òJB1òHó4Aðl ˆzÒÛØ$ˆX×$Ñ$Ð1ZÔ[€FØ
×Ñ˜¨C¸ÐAUÐÔVØ
×Ñ˜°À>ÐÔRãÙ%(¨¯©£_°qÒ%8¸U¿Z¹ZÈ¹^×=SÑ=SÔ=U‰c�%—*‘*˜R‘.Ô!Ð[_€GØÐÙÐ#¡c¨'£lÑ2Ô3Ø�
‰
�‰ÔØ×ÑÓ€DÙ	�D—N‘N°×0@Ñ0@ÖAð r   