Ë
    ¸¬uj)  ã                   ó   — 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ZdZedz   Zedz   ZdZdZd	Zej$                  j'                  d
d«      ZddiZdZ eej0                  «      D ]=  \  ZZedk(  sŒedz    eej0                  «      k  sŒ% eej0                  edz      «      Z n d„ Zdd„Zd„ Zd„ Z d„ Z!d„ Z"e#dk(  r e"«        yy)u0   æ‰¬å·žå¸‚äººæ°‘æ”¿åºœ - é¡¹ç›®å®¡æ‰¹æ ¸å‡†å¤‡æ¡ˆé    N)ÚBeautifulSoupzhttps://www.yangzhou.gov.cnz0/zfxxgk/fdgkzdnr/zdjsxmpzyss/xmsphzba/index.htmlz7/api-gateway/jpaas-publish-server/front/page/build/unitu"   æ‰¬å·žå¸‚-é¡¹ç›®å®¡æ‰¹æ ¸å‡†å¤‡æ¡ˆu   æ‰¬å·žå¸‚äººæ°‘æ”¿åºœu   çŽ¯è¯„å¹³å�°Ú	SEARCH_DBz/root/search.dbz
User-Agentz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36z--pagesé   c                 ó<  — t         j                  j                  | t        ¬«      }	 t         j                  j	                  |d¬«      j                  «       j                  dd¬«      S # t        $ r+}t        d| › d|› �t        j                  ¬	«       Y d }~y
d }~ww xY w)N©Úheadersé   ©Útimeoutúutf-8Úreplace©Úerrorsz[WARN] fetch failed: ú - ©ÚfileÚ )ÚurllibÚrequestÚRequestÚHEADERSÚurlopenÚreadÚdecodeÚ	ExceptionÚprintÚsysÚstderr)ÚurlÚreqÚes      ú$/root/gov_crawler/crawl_yangzhou2.pyÚfetchr#      sƒ   € Ü
�.‰.×
 Ñ
  ¬gÐ
 Ó
6€CðÜ�~‰~×%Ñ% c°2Ð%Ó6×;Ñ;Ó=×DÑDÀWÐU^ÐDÓ_Ð_øÜò ÜÐ% c U¨#¨a¨SÐ1¼¿
¹
ÕCÜûðús   §?A' Á'	BÁ0!BÂBc                 óB  — dddddddt        j                  | |dœd	¬
«      dœ}t        dz   t        j                  j                  |«      z   }t        j                  j                  |t        ¬«      }	 t        j                  j                  |d¬«      j                  «       j                  dd¬«      }t        j                  |«      }|j                  di «      j                  dd«      S # t        $ r+}t        d| › d|› �t         j"                  ¬«       Y d}~yd}~ww xY w)zFetch list page via APIÚbulidstaticÚtFIcy4xO0XyLY0I8q8verÚvZipBrGoUwNeJkXNxyu7kÚcolumnu   é‡�å¤§é¡¹ç›®æ¸…å�•listÚnullÚ2Uuasr1ED4kdAJD1f6x3J)ÚpageNoÚpageSizeF©Úensure_ascii)Ú	parseTypeÚwebIdÚtplSetIdÚpageTypeÚtagIdÚeditTypeÚpageIdÚ	paramJsonú?r   r	   r
   r   r   r   ÚdataÚhtmlr   z[WARN] API fetch failed page ú: r   N)ÚjsonÚdumpsÚAPI_URLr   ÚparseÚ	urlencoder   r   r   r   r   r   ÚloadsÚgetr   r   r   r   )Úpage_noÚ	page_sizeÚparamsr   r    Úrespr8   r!   s           r"   Ú	fetch_apirF      sÿ   € ð #Ø(Ø+ØØ)ØØ)Ü—Z‘Z¨7À	Ñ JÐY^Ô_ñ	€Fô �C‰-œ&Ÿ,™,×0Ñ0°Ó8Ñ
8€CÜ
�.‰.×
 Ñ
  ¬gÐ
 Ó
6€CðÜ�~‰~×%Ñ% c°2Ð%Ó6×;Ñ;Ó=×DÑDÀWÐU^ÐDÓ_ˆÜ�z‰z˜$ÓˆØ�x‰x˜ Ó#×'Ñ'¨°Ó3Ð3øÜò ÜÐ-¨g¨Y°b¸¸Ð<Ä3Ç:Á:ÕNÜûðús   Á3A6C* Ã*	DÃ3!DÄDc                 óº  — t        | d«      }g }|j                  d«      D ]¸  }|j                  dd¬«      }|sŒ|d   j                  «       }|j	                  d¬«      }|j                  d«      }d	}|r7t        j                  d
|j	                  «       «      }	|	r|	j                  d«      }|j                  d«      s	t        |z   }|j                  |||dœ«       Œº |S )zExtract items from API HTMLúhtml.parserzli.clearfixÚaT©ÚhrefrK   ©ÚstripÚspanr   ú(\d{4}-\d{2}-\d{2})r   Úhttp)Útitler   Údate)r   ÚselectÚfindrM   Úget_textÚreÚsearchÚgroupÚ
startswithÚBASE_URLÚappend)
r9   ÚsoupÚitemsÚlirI   rK   rQ   rN   Ú	date_textÚms
             r"   Úextract_itemsra   5   sÐ   € ä˜˜}Ó-€DØ€EØ�k‰k˜-Ó(ò GˆØ�G‰G�C˜dˆGÓ#ˆÙØØ�‰y�‰Ó ˆØ—
‘
 �
Ó&ˆØ�w‰w�v‹ˆØˆ	ÙÜ—	‘	Ð0°$·-±-³/ÓBˆAÙØŸG™G A›J�	Ø�‰˜vÔ&Ü˜d‘?ˆDØ�‰˜u¨T¸9ÑEÕFðGð €Ló    c                 óÆ   — t        | d«      }|j                  d«      }|sy|j                  dd«      }|j                  dd«      }	 t        |«      t        |«      fS #  Y yxY w)z8Get total count and page size from pagination attributesrH   zdiv.pagination)r   é   ÚcountÚ0ÚrowsÚ20)r   Ú
select_onerA   Úint)r9   r\   Ú
paginationÚ	count_strÚrows_strs        r"   Úget_total_inforn   J   se   € ä˜˜}Ó-€DØ—‘Ð!1Ó2€JÙØØ—‘˜w¨Ó,€IØ�~‰~˜f dÓ+€HðÜ�9‹~œs 8›}Ð,Ð,øðÙús   ÁA ÁA c           	      ó¢
  ‡— t        | d«      }d}|j                  r$|j                  j                  j                  «       }|s;|j	                  dddi¬«      }|r$|j                  d«      r|d   j                  «       }d}|j	                  dddi¬«      }|r=|j                  d«      r,t        j                  d	|d   «      }|r|j                  d
«      }|j                  d«      }|s|j                  d«      }|s%t        d|› �t        j                  ¬«       ||dg dœS g }	g }
|j                  g d¢d¬«      D �]¾  }|j                  dk(  r|j                  d«      rŒ%|j                  dk(  r|j                  d«      rŒF|j                  dk(  rì|j!                  dd¬«      }|j                  dd¬«      D ]¬  }|d   j                  «       Šd‰v s*d‰v s&t        j                  d‰t        j"                  «      sŒD|j!                  d¬«      xs |j                  dd«      }‰j%                  d«      s	t&        ‰z   Št)        ˆfd„|	D «       «      rŒ™|	j+                  |‰dœ«       Œ® |s�Œ.|
j+                  |«       �ŒA|j                  dk(  �r·g }|j                  d «      D �]-  }g }|j                  d!d"g«      D ]è  }|j!                  dd¬«      }|j                  dd¬«      D ]¬  }|d   j                  «       Šd‰v s*d‰v s&t        j                  d‰t        j"                  «      sŒD|j!                  d¬«      xs |j                  dd«      }‰j%                  d«      s	t&        ‰z   Št)        ˆfd#„|	D «       «      rŒ™|	j+                  |‰dœ«       Œ® |j+                  |«       Œê |s�Œ|j+                  d$d%j-                  |«      z   d&z   «       �Œ0 |s�Œ™t/        |d'   j1                  d(«      «      d)z
  }d$d%j-                  d*g|z  «      z   d&z   }|j3                  d
|«       |
j+                  d+j-                  |«      «       �Œ|j                  d,k(  s�Œ|j                  d-d«      }|j                  d.d«      }|s�ŒA|j%                  d/«      rd0|z   }nG|j%                  d1«      r
t&        |z   }n,|j%                  d«      s|j5                  d1d
«      d'   d1z   |z   }|
j+                  |r	d2|› d3|› d4�nd5|› d4�«       �ŒÁ t7        «       }g }|	D ]/  }|d6   |vsŒ|j9                  |d6   «       |j+                  |«       Œ1 d7j-                  |
«      }||||dœS )8zParse detail page contentrH   r   ÚmetaÚnameÚArticleTitle)ÚattrsÚcontentÚPubDaterO   r   zdiv.bt-content.zoomzdiv.bt-contentz[WARN] No content found: r   )rQ   rR   rt   Úattachments)ÚpÚtableÚimgT)Ú	recursiverw   rx   ú rL   rI   rJ   rK   ÚdownloadÚfileUrlz\.(pdf|docx?|xlsx?|zip|rar)$rP   c              3   ó.   •K  — | ]  }|d    ‰k(  –— Œ y­w©r   N© ©Ú.0ÚattrK   s     €r"   ú	<genexpr>zparse_detail.<locals>.<genexpr>†   s   øè ø€ ÒI°c˜s 5™z¨TÕ1ÑIùó   ƒ)rQ   r   ÚtrÚtdÚthc              3   ó.   •K  — | ]  }|d    ‰k(  –— Œ y­wr   r€   r�   s     €r"   r„   zparse_detail.<locals>.<genexpr>—   s   øè ø€ Ò&Q¸c s¨5¡z°TÕ'9Ñ&Qùr…   z| z | z |r   ú|é   z---ú
ry   ÚsrcÚaltz//zhttps:ú/z![z](ú)z![](r   z

)r   rQ   ÚstringrM   rT   rA   rV   rW   rX   ri   r   r   r   Úfind_allrq   Úfind_parentrU   ÚIrY   rZ   Úanyr[   ÚjoinÚlenÚsplitÚinsertÚrsplitÚsetÚadd)r9   r   r\   rQ   Ú
meta_titler_   Ú	meta_dater`   Úcontent_divrv   ÚpartsÚelÚtextrI   Úatitlerg   r†   ÚcolsÚcellÚ	cell_textÚ	col_countÚsepr�   rŽ   ÚseenÚunique_attachmentsrƒ   rt   rK   s                               @r"   Úparse_detailr«   W   sù  ø€ ä˜˜}Ó-€Dð €EØ‡z‚zØ—
‘
×!Ñ!×'Ñ'Ó)ˆÙØ—Y‘Y˜v¨f°nÐ-E�YÓFˆ
Ù˜*Ÿ.™.¨Ô3Ø˜yÑ)×/Ñ/Ó1ˆEð €IØ—	‘	˜&¨°Ð(;�	Ó<€IÙ�Y—]‘] 9Ô-Ü�I‰IÐ,¨i¸	Ñ.BÓCˆÙØŸ™ ›
ˆIð —/‘/Ð"7Ó8€KÙØ—o‘oÐ&6Ó7ˆÙÜÐ)¨#¨Ð/´c·j±jÕAØ¨	¸bÐQSÑTÐTà€KØ€Eà×"Ñ"Ò#8ÀDÐ"ÓIó 5KˆØ�7‰7�cŠ>˜bŸn™n¨WÔ5ØØ�7‰7�gÒ "§.¡.°Ô"9Øà�7‰7�cŠ>Ø—;‘;˜s¨$�;Ó/ˆDà—[‘[ ¨4�[Ó0ò K�Ø˜‘y—‘Ó(�Ø Ñ%¨°dÑ):¼b¿i¹iÐHgÐimÔoq×osÑosÕ>tØŸZ™Z¨d˜ZÓ3ÒL°q·u±u¸ZÈÓ7L�FØŸ?™?¨6Ô2Ü'¨$™˜ÜÓI¸[ÔIÕIØ#×*Ñ*°VÀDÑ+IÕJðKó Ø—‘˜TÖ"à�W‰W˜ÓØˆDØ—k‘k $Ó'ó @�Ø�ØŸK™K¨¨t¨Ó5ò 
+�DØ $§¡¨c¸ Ó >�IØ!Ÿ]™]¨3°T˜]Ó:ò S˜Ø  ™yŸ™Ó0˜Ø%¨Ñ-°¸dÑ1BÄbÇiÁiÐPoÐquÔwy×w{Ñw{ÕF|Ø%&§Z¡Z°d ZÓ%;Ò%T¸q¿u¹uÀZÐQSÓ?T˜FØ#'§?¡?°6Ô#:Ü'/°$¡ Ü#&Ó&QÀ[Ô&QÕ#QØ +× 2Ñ 2¸VÈDÑ3QÕ RðSð —K‘K 	Õ*ð
+ó Ø—K‘K  u§z¡z°$Ó'7Ñ 7¸$Ñ >Ö?ð@ó Ü  Q¡§¡¨cÓ 2Ó3°aÑ7�	Ø˜UŸZ™Z¨¨°)Ñ(;Ó<Ñ<¸tÑC�Ø—‘˜A˜sÔ#Ø—‘˜TŸY™Y t›_Ö-à�W‰W˜ÔØ—&‘&˜ Ó#ˆCØ—&‘&˜ Ó#ˆCÛØ—>‘> $Ô'Ø" S™.‘CØ—^‘^ CÔ(Ü" S™.‘CØŸ™¨Ô/ØŸ*™* S¨!Ó,¨QÑ/°#Ñ5¸Ñ;�CØ—‘±3˜r #  b¨¨¨QÑ/¸dÀ3À%Àq¸MÖJðk5Kôn ‹5€DØÐØò +ˆØˆu‰:˜TÒ!Ø�H‰H�S˜‘ZÔ Ø×%Ñ% cÕ*ð+ð
 �k‰k˜%Ó €GØ I¸'ÐRdÑeÐerb   c                  ó¼  — t        dd«      } | s0t        dt        j                  ¬«       t        j                  d«       t        | «      \  }}|dkD  r||z   dz
  |z  nd}t        d|› d|› d|› �t        j                  ¬«       t        r9|t        kD  r0t        d	t        › d
t        › d�t        j                  ¬«       t        }t        | «      }t        dt        |«      › d|› �t        j                  ¬«       t        d|dz   «      D ]–  }t        d|› d|› �t        j                  ¬«       t        ||«      }|st        d|› �t        j                  ¬«       ŒQt        |«      }t        dt        |«      › d|› �t        j                  ¬«       |j                  |«       Œ˜ t        dt        |«      › �t        j                  ¬«       t        j                  t        «      }|j                  d«       |j                  «       }	d}
d}d}|D �]Ú  }|	j                  d|d   f«       |	j!                  «       rŒ+t        d|d   d d › d�t        j                  ¬«       t#        |d   «      }|s"t        d|d   › �t        j                  ¬«       Œ‚t%        ||d   «      }|d   xs |d   }|d   xs |d   }|d   }|d   }t'        j(                  dd |«      }t'        j(                  d!d"|«      j+                  «       }|r|d d# nd }|s#|dz  }t        d$|› �t        j                  ¬«       d}|rVt'        j,                  d%|«      }|r>t/        |j1                  d«      |j1                  d«      z   |j1                  d&«      z   «      }|rt3        j4                  |d'¬(«      nd)}	 |	j                  d*|t6        t8        |d   |||||f	«       |	j:                  dkD  r|
dz  }
|t        |«      z  }�ŒÝ |j?                  «        |jA                  «        t        d.t6        › d/|
› d0|› d1|› d2�	«       y # t<        $ r/}t        d+|d d, › d-|› �t        j                  ¬«       Y d }~�ŒNd }~ww xY w)3Nr   rd   z'[ERROR] Cannot fetch first page via APIr   r   z[INFO] Total count: z, page size: z, total pages: z[INFO] Limiting to z pages (--pages=r�   z[INFO] Found z items on page 1/r‹   z[INFO] Fetching page r�   z[WARN] Empty response for page z items on page z[INFO] Total items from list: zPRAGMA busy_timeout = 30000z'SELECT id FROM gov_raw WHERE page_url=?r   z[INFO] Fetching detail: rQ   é2   z...z&[WARN] Cannot fetch detail, skipping: rR   rt   rv   z<[^>]+>r   z\s+r{   éÈ   z[WARN] Empty content: z(\d{4})-(\d{2})-(\d{2})é   Fr-   z[]z™INSERT OR IGNORE INTO gov_raw (title, site_name, group_name, page_url, publish_date, content, summary, attachments, date_rank) VALUES (?,?,?,?,?,?,?,?,?)z[ERROR] DB insert failed: r	   r   z

[RESULT] r:   z new, z empty content, z attachments)!rF   r   r   r   Úexitrn   Ú_MAX_PGra   r—   ÚrangeÚextendÚsqlite3ÚconnectÚDBÚexecuteÚcursorÚfetchoner#   r«   rV   ÚsubrM   rW   rj   rX   r;   r<   Ú	SITE_NAMEÚ
GROUP_NAMEÚrowcountr   ÚcommitÚclose)Ú
first_htmlÚtotal_countrC   Útotal_pagesÚ	all_itemsÚpgr9   r]   ÚconnÚcÚ	new_countÚempty_contentÚtotal_attachmentsÚitemÚdetailrQ   r_   rt   rv   ÚplainÚsummaryÚ	date_rankr`   Úatt_jsonr!   s                            r"   ÚmainrÐ   ¹   s  € Ü˜1˜bÓ!€JÙÜÐ7¼c¿j¹jÕIÜ�‰�Œä+¨JÓ7Ñ€K�Ø@KÈaÂ�; Ñ*¨QÑ.°9Ò<ÐUV€KÜ	Ð   ¨]¸9¸+À_ÐU`ÐTaÐ
bÔil×isÑisÕtå�;¤Ò(ÜÐ#¤G 9Ð,<¼W¸IÀQÐGÌcÏjÉjÕYÜˆä˜jÓ)€IÜ	ˆMœ#˜i›.Ð)Ð):¸;¸-Ð
HÌsÏzÉzÕZä�A�{ Q‘Ó'ò  ˆÜÐ% b T¨¨;¨-Ð8¼s¿z¹zÕJÜ˜˜YÓ'ˆÙÜÐ3°B°4Ð8¼s¿z¹zÕJØÜ˜dÓ#ˆÜ�œc %›j˜\¨¸¸Ð=ÄCÇJÁJÕOØ×Ñ˜Õð ô 
Ð*¬3¨y«>Ð*:Ð
;Ä#Ç*Á*ÕMä�?‰?œ2Ó€DØ‡L�LÐ.Ô/Ø�‰‹€Aà€IØ€MØÐàó +TˆØ	�	‰	Ð;¸dÀ5¹k¸^ÔLØ�:‰:Œ<ØäÐ(¨¨g©°s¸Ð);Ð(<¸CÐ@ÄsÇzÁzÕRÜ�T˜%‘[Ó!ˆÙÜÐ:¸4À¹;¸-ÐHÌsÏzÉzÕZØä˜d D¨¡KÓ0ˆà�w‘Ò0 4¨¡=ˆØ˜6‘NÒ2 d¨6¡lˆ	Ø˜Ñ#ˆØ˜]Ñ+ˆä—‘�z 2 wÓ/ˆÜ—‘�v˜s EÓ*×0Ñ0Ó2ˆÙ!&�%˜˜‘+¨BˆáØ˜QÑˆMÜÐ*¨5¨'Ð2¼¿¹ÕDàˆ	ÙÜ—	‘	Ð4°iÓ@ˆAÙÜ §¡¨£
¨Q¯W©W°Q«ZÑ 7¸!¿'¹'À!»*Ñ DÓE�	áBM”4—:‘:˜k¸Õ>ÐSWˆð		TØ�I‰Ið lØœ	¤:¨t°E©{¸IÀwÐPWÐYaÐclÐmôð �z‰z˜AŠ~Ø˜Q‘�	Ø!¤S¨Ó%5Ñ5Ð!ùðS+TðZ 	‡K�K„MØ‡J�J„Lä	ˆKœ	�{ " Y K¨v°m°_ÐDTÐUfÐTgÐgsÐ
tÕuøô ò 	TÜÐ.¨u°S°b¨z¨l¸#¸a¸SÐAÌÏ
É
×SÓSûð	Tús   ÎAP#Ð#	QÐ,$QÑQÚ__main__)rd   )$Ú__doc__rV   r   Úosr;   Úurllib.parser   Úurllib.requestÚurllib.errorÚbs4r   r´   rZ   ÚLIST_URLr=   r»   ÚSITE_DISPLAYr¼   ÚenvironrA   r¶   r   r±   Ú	enumerateÚargvÚirI   r—   rj   r#   rF   ra   rn   r«   rÐ   Ú__name__r€   rb   r"   ú<module>rß      sð   ðá 6ß &× &Ó &ß #Ý Û à(€ØÐHÑH€Ø
ÐNÑ
N€Ø0€	Ø&€Ø€
Ø‡Z�Z‡^�^�KÐ!2Ó3€ØÐWÐ
X€à
€Ù�c—h‘hÓò �D€A€qØˆIƒ~˜!˜a™%¡# c§h¡h£-Ó/Ù�c—h‘h˜q 1™u‘oÓ&ˆÙðò
óò,ò*ò_fòDUvðp ˆzÒÙ…Fð rb   