Ë
    ‹}jd!  ã                   óV  — 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
Z
ej                  j                  ej                  j                  e«      «      Zej                  j!                  de«       	 ddlmZ 	 ddlmZ ddlZddlZ ej2                  «        dZdZdZej                  j;                  e«      ZdZd	Z  e!ejD                  jG                  d
d«      xs d«      Z$dZ% ejL                  d ejN                   ej                  «       e%dz  z
  «      «      Z(e$dk\  re$ndZ)ejD                  jG                  dd«      Z*dd	dœZ+ ejX                  dejZ                  «      Z.d„ Z/d d„Z0d„ Z1d„ Z2d„ Z3d„ Z4dZ5d„ Z6d„ Z7e8dk(  r e7«        yy# e$ r dZY �Œw xY w# e$ r dZY �Œ&w xY w)!uƒ  é«˜é�’åŽ¿-çŽ¯è¯„ä¿¡æ�¯ (æ·„å�š gongkai å­�ç³»ç»Ÿ site_gqxsthjj)
åˆ—è¡¨: æœ�åŠ¡ç«¯æ¸²æŸ“ table.sk-table.zfxxgk-list, tr > td.zfxxgk-list-title > a[doc_xxx.html] + td.zfxxgk-list-time
åˆ†é¡µ: URL å�‚æ•° ?open=fdzdgknr&nr_page=N&nr_per_page=10 (æœ�åŠ¡ç«¯æ¸²æŸ“, é�ž AJAX)
è¯¦æƒ…: doc_xxx.html, h1.details-title + div.details-content (æŽ’é™¤ sk-breadcrumb), æ—¥æœŸ å�‘å¸ƒæ—¥æœŸï¼šYYYY-MM-DD
é    N)Úpush_to_searchdb)ÚBeautifulSoupu   é«˜é�’åŽ¿-çŽ¯è¯„ä¿¡æ�¯u   çŽ¯è¯„u   å±±ä¸œzhttp://www.gaoqing.gov.cnzehttp://www.gaoqing.gov.cn/gongkai/site_gqxsthjj/channel_c_5f9f6c84b9dfe9bfb0a8c873_n_1605684619.4558/Ú	MAX_PAGESÚ0iG  z%Y-%m-%di€Q é   é   Ú
JSONL_PATHÚ zkMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36)z
User-AgentÚRefererzx<td class="zfxxgk-list-title">\s*<a href="([^"]+\.html)">([^<]+)</a>\s*</td>\s*<td class="zfxxgk-list-time">([^<]+)</td>c                 ó²   — | syt        j                  | «      } t        j                  dd| «      j	                  «       } dD ]  }| j                  |d«      } Œ | S )Nr
   z\s+ú )u   â€‹u   â€Œu   â€�u   ï»¿)Úhtml_libÚunescapeÚreÚsubÚstripÚreplace)ÚtÚbads     ú'/root/gov_crawler/crawl_gaoqing_hjxx.pyÚclean_titler   1   sW   € ÙØÜ×Ñ˜!Ó€AÜ
�‰ˆv�s˜AÓ×$Ñ$Ó&€AØ7ò ˆØ�I‰I�c˜2Ó‰ðà€Hó    c                 ó  — t        |«      D ]h  }	 t        j                  | t        dd¬«      }|j                  xs d|_        |j                  dk(  r|j                  c S 	 t        j                  d«       Œj y # t        $ r Y Œ#w xY w)Né   F)ÚheadersÚtimeoutÚverifyúutf-8éÈ   g333333ó?)ÚrangeÚrequestsÚgetÚHEADERSÚapparent_encodingÚencodingÚstatus_codeÚtextÚ	ExceptionÚtimeÚsleep)ÚurlÚretriesÚiÚrs       r   Úfetchr/   ;   s€   € Ü�7‹^ò ˆð	Ü—‘˜S¬'¸2ÀeÔLˆAØ×,Ñ,Ò7°ˆAŒJØ�}‰} Ò#Ø—v‘v’ð $ô 	�
‰
�3�ðð øô ò 	Ùð	ús   �AA8Á8	BÂBc                 ó0   — | dk  rt         S t         d| z  z   S )Nr   z?nr_page=%d)ÚLIST_URL)Úpages    r   Úbuild_list_urlr3   H   s   € Øˆq‚yÜˆÜ�m dÑ*Ñ*Ð*r   c                 ó†  — g }t         j                  | «      D ]¦  }|j                  d«      t        |j                  d«      «      |j                  d«      j	                  «       }}}|rt        |«      dk  rŒ^|j                  d«      s$t        j                  j                  t        |«      }|j                  |||f«       Œ¨ |S )Nr   é   é   é   Úhttp)ÚROW_PATÚfinditerÚgroupr   r   ÚlenÚ
startswithÚurllibÚparseÚurljoinÚBASE_URLÚappend)Ú	html_textÚpage_urlÚitemsÚmÚhrefr   Úds          r   Ú
parse_listrI   N   sŸ   € Ø€EÜ×Ñ˜iÓ(ò #ˆØ—W‘W˜Q“Z¤¨Q¯W©W°Q«ZÓ!8¸!¿'¹'À!»*×:JÑ:JÓ:L�ˆaˆÙ”C˜“F˜Q’JØØ�‰˜vÔ&Ü—<‘<×'Ñ'¬°$Ó7ˆDØ�‰�d˜A˜q�\Õ"ð#ð €Lr   c                 ó0  — d}d}d}t         �rt        | d«      }|j                  d«      }|rt        |j                  d¬«      «      }|j                  d«      xs$ |j                  d«      xs |j                  d«      }|rH|j	                  d	«      D ]  }|j                  «        Œ dj                  d
„ |j                  D «       «      }|j                  d«      }	|	r7t        j                  d|	j                  «       «      }
|
r|
j                  d«      }|||fS )Nr
   úhtml.parserzh1.details-titleT)r   z'div.details-content div#details-contentz#details-contentzdiv.details-contentz.sk-breadcrumbc              3   ó2   K  — | ]  }t        |«      –— Œ y ­w©N©Ústr©Ú.0Úcs     r   ú	<genexpr>zparse_detail.<locals>.<genexpr>h   s   è ø€ Ò">¨a¤3 q§6Ñ">ùó   ‚z.details-release-datez20\d{2}-\d{2}-\d{2}r   )r   Ú
select_oner   Úget_textÚselectÚ	decomposeÚjoinÚcontentsr   Úsearchr;   )rC   rD   ÚtitleÚdateÚcontent_htmlÚsoupÚhrH   ÚbÚdirF   s              r   Úparse_detailrc   Z   s  € Ø€EØ€DØ€LÞÜ˜Y¨Ó6ˆØ�O‰OÐ.Ó/ˆÙÜ §
¡
° 
Ó 6Ó7ˆEØ�O‰OÐEÓFò  XÈ$Ï/É/ÐZlÓJmò  XÐqu÷  rAñ  rAð  BWó  rXˆÙà—X‘XÐ.Ó/ò �Ø—‘•ðàŸ7™7Ñ">°1·:±:Ô">Ó>ˆLØ�_‰_Ð4Ó5ˆÙÜ—	‘	Ð0°"·+±+³-Ó@ˆAÙØ—w‘w˜q“z�Ø�$˜Ð$Ð$r   c                 óR  — d}g }t         r™t        | d«      } |ddg«      D ]  }|j                  «        Œ |j                  dd¬«      D ]  }|j                  «        Œ |j                  g d¢«      D ]  }t        ||«       Œ dj	                  d	„ |j
                  D «       «      }|d
|fS )uA   BS å®¹å™¨æ��å�–, é™„ä»¶ä»…æ‰©å±•å��åˆ¤å®š, æ™®é€šé“¾æŽ¥ä¿�ç•™ <a>r
   rK   ÚscriptÚstyleÚdivÚbdsharebuttonbox)Úclass_)	Úprg   ÚtrÚliÚh1Úh2Úh3Úh4Ú
blockquotec              3   ó2   K  — | ]  }t        |«      –— Œ y ­wrM   rN   rP   s     r   rS   zhtml_to_text.<locals>.<genexpr>}   s   è ø€ Ò8 Qœ#˜aŸ&Ñ8ùrT   F)r   rX   Úfind_allÚ
_link_replrY   rZ   )rC   rD   ÚcontentÚattsr_   Útagrg   rj   s           r   Úhtml_to_textrx   q   s«   € à€GØ€DÝÜ˜Y¨Ó6ˆÙ˜ 7Ð+Ó,ò 	ˆCØ�M‰M�Oð	à—=‘= Ð/A�=ÓBò 	ˆCØ�M‰M�Oð	à—‘Ò]Ó^ò 	$ˆAÜ�q˜(Õ#ð	$à—'‘'Ñ8¨$¯-©-Ô8Ó8ˆØ�E˜4ÐÐr   )z.pdfz.docz.docxz.xlsz.xlsxz.pptz.pptxz.zipz.rarz.7zz.wpsz.etz.dpsz.txtz.csvc                 ó²  ‡— | j                  dd¬«      D ]À  }|d   j                  «       }|j                  d«      s t        j                  j                  ||«      }|j                  «       Š‰j                  d«      s‰j                  d«      r|j                  «        ŒŠt        ˆfd„t        D «       «      }|r|j                  d	|z   d	z   «       Œ¼||d<   ŒÂ y
)uJ   ä»…é™„ä»¶æ‰©å±•å��é“¾æŽ¥è¿› attachments; æ™®é€šé“¾æŽ¥ä¿�ç•™å†…è�” <a href>ÚaT)rG   rG   r8   zjavascript:ú#c              3   ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wrM   )Úendswith)rQ   ÚextÚlows     €r   rS   z_link_repl.<locals>.<genexpr>Ž   s   øè ø€ ÒB¨c˜Ÿ™ S×)ÑBùs   ƒr   N)rs   r   r=   r>   r?   r@   ÚlowerrX   ÚanyÚ_ATTACH_EXTSÚreplace_with)rw   rD   rz   rG   Ú	is_attachr   s        @r   rt   rt   „   s°   ø€ à�\‰\˜# Dˆ\Ó)ò ˆØ�‰y�‰Ó ˆØ�‰˜vÔ&Ü—<‘<×'Ñ'¨°$Ó7ˆDØ�j‰j‹lˆØ�>‰>˜-Ô(¨C¯N©N¸3Ô,?Ø�K‰KŒMØÜÓB´\ÔBÓBˆ	ÙØ�N‰N˜3 ™:¨Ñ+Õ,àˆAˆfŠIñr   c                  óæ  — t         } t        j                  dd  }t        |«      D ]_  \  }}|dk(  r$|dz   t	        |«      k  r	 t        ||dz      «      } Œ/|j                  d«      sŒA	 t        |j                  dd«      d   «      } Œa t        dt        | t        fz  d¬«       g }g }t        «       }d}d}t        d| dz   «      D �]  }		 t        |	«      }
t        |
«      }|st        d	|	z  d¬«        �nót!        ||
«      }|st        d|	z  d¬«        �nÒt        d|	t	        |«      fz  d¬«       |D �]™  \  }}}||v rŒ|j%                  |«       |r
|t        k  rŒ*t        |«      }|s|dz  }Œ=t'        ||«      \  }}}|s|}|s|}|r|t        k  r|dz  }Œft)        ||«      \  }}}t	        t+        j,                  dd|«      j/                  «       «      }t+        j0                  d|t*        j2                  «       xr | }|dk  s|rt        d|d d z  d¬«       |dz  }Œït        ||||d|t4        dt6        |rdj9                  d„ |D «       «      nddœ}t:        r/|j=                  |«       t        d|d d ›d|›d�d¬«       |dz  }�ŒX|j=                  |«       |dz  }t        d|d d ›d|›d�d¬«       t?        j@                  d«       �Œœ t?        j@                  d«       �Œ" t:        rltC        t:        dd¬«      5 }|D ]+  }|jE                  tG        jH                  |d¬ «      d!z   «       Œ- 	 d d d «       t        d"t:        t	        |«      fz  d¬«       ntK        |tL        ¬#«       t        d$|z  d¬«       t        d%|z  d¬«       t        d&t        z  d¬«       y # t        $ r Y �Œ…w xY w# t        $ r Y �Œ•w xY w# t"        $ r}t        d
|	|fz  d¬«       Y d }~ Œùd }~ww xY w# 1 sw Y   Œ¸xY w)'Nr   z--pagesz--pages=ú=z!=== %s | pages=%d | cutoff=%s ===T)Úflushr   zPage %d fetch failedzPage %d fetch error: %szPage %d: empty, stopzPage %d: found %d itemsz<[^>]+>r
   z<p[ >]é
   z  skip empty/placeholder: %sé(   z; c              3   ó0   K  — | ]  \  }}|›d |›�–— Œ y­w)ú|N© )rQ   Úur   s      r   rS   zmain.<locals>.<genexpr>Ö   s   è ø€ Ò(K¹d¸aÀ²A±qÔ)9Ñ(Kùs   ‚)Ú	site_nameÚ
source_urlr+   r\   Úpub_dateÚsummaryru   ÚcategoryÚtagsÚ
group_nameÚattachmentsz
  JSONL + z (ú)z  + g{®Gáz´?g333333Ó?Úwr   )r%   F)Úensure_asciiú
zJSONL written: %s (%d rows))Úbatch_labelu
   æ–°å¢ž: %du
   è·³è¿‡: %dz=== %s done ===)'ÚPAGESÚsysÚargvÚ	enumerater<   ÚintÚ
ValueErrorr=   ÚsplitÚprintÚ	SITE_NAMEÚCUTOFF_DATEÚsetr    r3   r/   rI   r(   Úaddrc   rx   r   r   r   r[   ÚIÚCATEGORYÚ
GROUP_NAMErY   r	   rB   r)   r*   ÚopenÚwriteÚjsonÚdumpsr   ÚSCRIPT_NAME)Ú_pagesÚargsr-   rz   ÚbatchÚ
jsonl_rowsÚseenÚ	new_countÚ
skip_countr2   r+   rC   rE   ÚeÚabs_urlr\   r]   ÚdhtmlÚdtitleÚddater^   ru   Ú	has_tablerv   Ú	plain_lenÚno_paraÚitemÚfÚrows                                r   ÚmainrÁ   •   s÷  € Ü€FÜ�8‰8�A�Bˆ<€DÜ˜$“ò 
‰ˆˆ1Ø�	Š>˜a !™e¤c¨$£iÒ/ðÜ˜T ! a¡%™[Ó)‘ð �\‰\˜*Õ%ðÜ˜QŸW™W S¨!›_¨QÑ/Ó0‘ð
ô 
Ð
-´¸FÄKÐ0PÑ
PÐX\Õ]Ø€EØ€JÜ‹5€DØ€IØ€JÜ�a˜ !™Ó$ó 8ˆð		Ü  Ó&ˆCÜ˜c›
ˆIÙÜÐ,¨tÑ3¸4Õ@ÚÜ˜y¨#Ó.ˆEñ ÜÐ(¨4Ñ/°tÕ<ÚÜÐ'¨4´°U³Ð*<Ñ<ÀDÕIØ$)ó (	Ñ ˆG�U˜DØ˜$‰ØØ�H‰H�WÔÙ˜œ{Ò*ØÜ˜'“NˆEÙØ˜a‘�
ØÜ*6°u¸gÓ*FÑ'ˆF�E˜<ÙØ�ÙØ�Ù˜¤Ò,Ø˜a‘�
ØÜ'3°LÀ'Ó'JÑ$ˆG�Y ÜœBŸF™F :¨r°7Ó;×AÑAÓCÓDˆIÜŸ)™) I¨|¼R¿T¹TÓBÐBÒTÈ9À}ˆGØ˜2Š~¡ÜÐ4°v¸c¸r°{ÑBÈ$ÕOØ˜a‘�
Øä&°gÀgØ¨U¸rØ"´À"Ü(ÙOS˜tŸy™yÑ(KÀdÔ(KÔKÐY[ñˆDõ Ø×!Ñ! $Ô'Ý¨V°C°Rª[º%Ð@ÈÕMØ˜Q‘�	ÙØ�L‰L˜ÔØ˜‰NˆIÝ 6¨#¨2¢;²Ð6¸dÕCÜ�J‰J�tÖðQ(	ôR 	�
‰
�3Žðq8õt Ü”*˜c¨GÔ4ð 	D¸Ø!ò D�Ø—‘œŸ
™
 3°UÔ;¸dÑBÕCñD÷	Dô 	Ð+¬z¼3¸z»?Ð.KÑKÐSWÖXä˜¬KÕ8ä	ˆ,˜Ñ
"¨$Õ/Ü	ˆ,˜Ñ
#¨4Õ0Ü	Ð
œiÑ
'¨tÖ4øôc ò Úðûô
 ò Úðûô  ò 	ÜÐ+¨t°Q¨iÑ7¸tÕDÝûð	ú÷f	Dð 	DúsN   ÁNÁ'N.Ã(N>Ã3N>Ë>1O'Î	N+Î*N+Î.	N;Î:N;Î>	O$ÏOÏO$Ï'O0Ú__main__)r6   )9Ú__doc__rœ   Úosr   r)   Úhtmlr   Úurllib.parser>   Úsqlite3r¬   ÚpathÚdirnameÚabspathÚ__file__Ú	_BASE_DIRÚinsertÚcrawler_libr   r(   Úbs4r   ÚImportErrorr!   Úurllib3Údisable_warningsr£   r¨   r©   Úbasenamer®   rA   r1   rŸ   Úenvironr"   r   ÚDAYS_CUTOFFÚstrftimeÚ	localtimer¤   r›   r	   r#   ÚcompileÚSr9   r   r/   r3   rI   rc   rx   r‚   rt   rÁ   Ú__name__rŒ   r   r   ú<module>rÛ      s­  ðñ÷
 H× G× G× Gà�G‰G�O‰O˜BŸG™GŸO™O¨HÓ5Ó6€	Ø ‡�‡���9Ô ðÝ,ðÝ!÷ Ø €× Ñ Ô à$€	Ø€Ø€
Ø�g‰g×Ñ˜xÓ(€Ø&€Ør€á�—
‘
—‘˜{¨CÓ0Ò7°CÓ8€	Ø€Øˆd�m‰m˜J¨¨¯©°y°t·y±y³{À[ÐSXÑEXÑ7XÓ(YÓZ€Ø !’^‰	¨€Ø�Z‰Z�^‰^˜L¨"Ó-€
ð @Øvñ€ð
 ˆ"�*‰*ØØ‡D�Dó€òó
ò+ò	ò%ò. ð  I€òò"X5ðv ˆzÒÙ…Fð øðE ò ØÓðûð
 ò ØƒMðús$   Á4F Á;F ÆFÆFÆF(Æ'F(