Ë
    ~¿£js)  ã                   ó¨  — 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d„Zd„ Zdd„Zd„ Z d„ Z!d„ Z"d„ Z#e$dk(  r e#«        yy)u'   æ‰¬å·žå¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€ - çŽ¯è¯„å®¡æ‰¹é    N)ÚBeautifulSoupzhttps://sthj.yangzhou.gov.cnz#/zfxxgk/fdzdgk/ywgz/hpsp/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                 óÊ  — ddl }t        t        | «      d«      }|j                  d«      D ]L  }|j	                  dd«      }|sŒ|j                  d«      rŒ*|r|j                  j                  ||«      n||d<   ŒN |j                  d«      D ]L  }|j	                  d	d«      }|sŒ|j                  d
«      rŒ*|r|j                  j                  ||«      n||d	<   ŒN t        |«      S )uA   ä¿�ç•™ HTML è¡¨æ ¼ç»“æž„ï¼Œä»…å°†ç›¸å¯¹é“¾æŽ¥/å›¾ç‰‡è½¬ç»�å¯¹ URLr   Núhtml.parserÚaÚhrefÚ )ÚhttpÚ
javascriptú#ÚimgÚsrc)r   ú//zdata:)Úurllib.parser   ÚstrÚfind_allÚgetÚ
startswithÚparseÚurljoin)ÚtableÚbase_urlÚurllibÚtblr   r	   r   r   s           úcrawl_yangzhou.pyÚhtml_table_to_htmlr      sÐ   € ãÜ
œ˜E›
 MÓ
2€CØ�\‰\˜#Óò SˆØ�u‰u�V˜RÓ ˆÚ˜Ÿ™Ð(CÕDÙ@H˜Ÿ™×,Ñ,¨X°tÔ<ÈdˆAˆfŠIðSð �|‰|˜EÓ"ò RˆØ�g‰g�e˜RÓ ˆÚ�s—~‘~Ð&=Õ>Ù@H˜Ÿ™×-Ñ-¨h¸Ô<ÈcˆC�ŠJðRô ˆs‹8€Oó    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: ú - ©Úfiler
   )r   ÚrequestÚRequestÚHEADERSÚurlopenÚreadÚdecodeÚ	ExceptionÚprintÚsysÚstderr)ÚurlÚreqÚes      r   Úfetchr9   $   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Ú5biGb8ANMvmWd52WUVRQuÚY3ymqFLmqouIDOIdPh2n8Úcolumnu
   ajaxåˆ†é¡µÚnullÚEpQ6v8pVFSqK88eqbxaXA)Ú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   r   Ú	urlencoder,   r-   r.   r/   r0   r1   Úloadsr   r2   r3   r4   r5   )Úpage_noÚ	page_sizeÚparamsr6   r7   ÚresprN   r8   s           r   Ú	fetch_apirZ   ,   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«      j                  «       }|j                  dd«      xs d}|j	                  d«      }d}t        |«      dk\  r,|s|d   j                  d	¬
«      }|d   j                  d	¬
«      }|j                  d«      s	t        |z   }|j                  |j                  «       ||dœ«       ŒÄ |S )zExtract items from API HTMLr   zul.ul-list > li > a[href]r	   r
   ÚtitleÚpé   r   T©Ústripr   r   )r\   r6   Údate)
r   Úselectr   r`   r   ÚlenÚget_textr   ÚBASE_URLÚappend)rO   ÚsoupÚitemsr   r	   r\   ÚpsÚ	date_texts           r   Úextract_itemsrk   B   sÙ   € ä˜˜}Ó-€DØ€EØ�[‰[Ð4Ó5ò OˆØ�u‰u�V˜RÓ ×&Ñ&Ó(ˆØ—‘�g˜rÓ"Ò( bˆØ�Z‰Z˜‹_ˆØˆ	Üˆr‹7�aŠ<ÙØ˜1™Ÿ™¨T˜Ó2�Ø˜1™Ÿ™¨T˜Ó2ˆIØ�‰˜vÔ&Ü˜d‘?ˆDØ�‰˜uŸ{™{›}°TÀ9ÑMÕNðOð €Lr   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 attributesr   zdiv.pagination)r   é   ÚcountÚ0ÚrowsÚ14)r   Ú
select_oner   Úint)rO   rg   Ú
paginationÚ	count_strÚrows_strs        r   Úget_total_inforw   T   se   € ä˜˜}Ó-€DØ—‘Ð!1Ó2€JÙØØ—‘˜w¨Ó,€IØ�~‰~˜f dÓ+€HðÜ�9‹~œs 8›}Ð,Ð,øðÙús   ÁA ÁA c                 óÆ  ‡— t        | d«      }d}|j                  d«      }|r|j                  d¬«      }|s;|j                  dddi¬	«      }|r$|j	                  d
«      r|d
   j                  «       }d}|j                  d«      D ]z  }|j                  dd¬«      }|j                  dd¬«      }	|sŒ,|	sŒ/d|j                  «       v sŒBt        j                  d|	j                  «       «      }
|
sŒi|
j                  d«      } n |sT|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#t+        ||«      }|s�Œ`|j)                  |«       �Œs|j                  d'k(  s�Œ„|j	                  d(d«      }|j	                  d)d«      }|s�Œ¬|j#                  d*«      rd+|z   }nG|j#                  d,«      r
t$        |z   }n,|j#                  d$«      s|j-                  d,d«      d-   d,z   |z   }|j)                  |r	d.|› d/|› d0�nd1|› d0�«       �Œ, t/        «       }g }|D ]Q  }t1        |t2        «      s|j)                  |«       Œ%|d2   |vsŒ-|j5                  |d2   «       |j)                  |«       ŒS d3j7                  |«      }||||dœS )4zParse detail page contentr   r
   zdiv.artTitleTr_   ÚmetaÚnameÚArticleTitle)ÚattrsÚcontentzul.xxgk_head liÚspanÚxxgkBt)Úclass_ÚxxgkConu   ç”Ÿæˆ�æ—¥æœŸz(\d{4}-\d{2}-\d{2})r   ÚPubDatez
div.artTxtzdiv.bt-contentz[WARN] No content found: r*   )r\   ra   r}   Úattachments)r]   r   r   )Ú	recursiver]   r   ú r   )r	   r	   ÚdownloadÚfileUrlz\.(zip|pdf|docx?|xlsx?|rar)$r   c              3   ó.   •K  — | ]  }|d    ‰k(  –— Œ y­w)r6   N© )Ú.0Úattr	   s     €r   ú	<genexpr>zparse_detail.<locals>.<genexpr>›   s   øè ø€ ÒI°c˜s 5™z¨TÕ1ÑIùs   ƒ)r\   r6   r   r   Úaltr   zhttps:ú/r   z![z](ú)z![](r6   z

)r   rr   rd   Úfindr   r`   rb   ÚreÚsearchÚgroupr3   r4   r5   r   rz   Úfind_parentÚIr   re   Úanyrf   r   ÚrsplitÚsetÚ
isinstanceÚdictÚaddÚjoin)rO   r6   rg   r\   Ú	title_divÚ
meta_titlerj   ÚliÚbtÚconÚmÚ	meta_dateÚcontent_divrƒ   ÚpartsÚelÚtextr   ÚatitleÚtbl_htmlr   r�   ÚseenÚunique_attachmentsr‹   r}   r	   s                             @r   Úparse_detailr¬   a   s  ø€ ä˜˜}Ó-€Dð €EØ—‘ Ó/€IÙØ×"Ñ"¨Ð"Ó.ˆÙØ—Y‘Y˜v¨f°nÐ-E�YÓFˆ
Ù˜*Ÿ.™.¨Ô3Ø˜yÑ)×/Ñ/Ó1ˆEð €IØ�k‰kÐ+Ó,ò ˆØ�W‰W�V HˆWÓ-ˆØ�g‰g�f YˆgÓ/ˆÚ’#˜.¨B¯K©K«MÒ9Ü—	‘	Ð0°#·,±,³.ÓAˆAÚØŸG™G A›J�	Ùðñ Ø—I‘I˜f¨V°YÐ,?�IÓ@ˆ	Ù˜Ÿ™ yÔ1Ü—	‘	Ð0°)¸IÑ2FÓGˆAÙØŸG™G A›J�	ð —/‘/ ,Ó/€KÙØ—o‘oÐ&6Ó7ˆáÜÐ)¨#¨Ð/´c·j±jÕAØ¨	¸bÐQSÑTÐTà€KØ€Eà×"Ñ"Ò#8ÀDÐ"ÓIó "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˜ÒÜ)¨"¨cÓ2ˆHÛØ—‘˜XÖ&Ø�W‰W˜ÔØ—&‘&˜ Ó#ˆCØ—&‘&˜ Ó#ˆCÛØ—>‘> $Ô'Ø" S™.‘CØ—^‘^ CÔ(Ü" S™.‘CØŸ™¨Ô/ØŸ*™* S¨!Ó,¨QÑ/°#Ñ5¸Ñ;�CØ—‘±3˜r #  b¨¨¨QÑ/¸dÀ3À%Àq¸MÖJðE"KôJ ‹5€DØÐØò +ˆÜ˜#œtÔ$Ø×%Ñ% cÔ*ØØˆu‰:˜TÒ!Ø�H‰H�S˜‘ZÔ Ø×%Ñ% cÕ*ð+ð �k‰k˜%Ó €GØ I¸'ÐRdÑeÐer   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        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        › d0|
› d1|› d2|› d3�	«       y # t<        $ r/}t        d,|d d- › d.|› �t        j                  ¬«       Y d }~�ŒNd }~ww xY w)4Nr   rm   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: é<   r#   z'SELECT id FROM gov_raw WHERE page_url=?r6   z[INFO] Fetching detail: r\   é2   z...z&[WARN] Cannot fetch detail, skipping: ra   r}   rƒ   z<[^>]+>r
   z\s+r…   éÈ   z[WARN] Empty content: z(\d{4})-(\d{2})-(\d{2})é   FrC   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] rP   z new, z empty content, z attachments)!rZ   r3   r4   r5   Úexitrw   Ú_MAX_PGrk   rc   ÚrangeÚextendÚsqlite3ÚconnectÚDBÚcursorÚexecuteÚfetchoner9   r¬   r‘   Úsubr`   r’   rs   r“   rQ   rR   Ú	SITE_NAMEÚ
GROUP_NAMEÚrowcountr2   ÚcommitÚclose)Ú
first_htmlÚtotal_countrW   Útotal_pagesÚ	all_itemsÚpgrO   rh   ÚconnÚcÚ	new_countÚempty_contentÚtotal_attachmentsÚitemÚdetailr\   rj   r}   rƒ   ÚplainÚsummaryÚ	date_rankr¢   Úatt_jsonr8   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 rÔ*€DØ�‰‹€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__)r
   )rm   )%Ú__doc__r‘   r4   ÚosrQ   r   r   Úurllib.requestÚurllib.errorÚbs4r   r¶   re   ÚLIST_URLrS   r½   ÚSITE_DISPLAYr¾   Úenvironr   r¸   r.   r³   Ú	enumerateÚargvÚir   rc   rs   r   r9   rZ   rk   rw   r¬   rÒ   Ú__name__r‰   r   r   ú<module>rà      sõ   ðá -ß &× &Ó &ß #Ý Û à)€ØÐ;Ñ;€Ø
ÐNÑ
N€Ø$€	Ø)€Ø€
Ø‡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ò|Uvðp ˆzÒÙ…Fð r   