Ë
    ¸¬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mZ ddl	m
Z
 ddlZdZedz   ZdZdZd	Zd
Zdddedz   ez   dœZd„ Zdd„Zd„ Zd„ Zd„ Zedk(  r e«        yy)u:  
åº·å®šå¸‚äººæ°‘æ”¿åºœ(www.kangding.gov.cn) - å…¬ç¤ºå…¬å‘Šæ �ç›® (column 1840)
URL: https://www.kangding.gov.cn/wzlb/c/1840 (æ—§å…¥å�£ /kdsrmzf/c100353/common_list.shtml 301 è‡³æ­¤)
CMS: è‡ªå»º Vue.js SPA + SSR
åˆ—è¡¨: POST /site-service/c/manuscript/getManuscriptListByColumnId
  å�‚æ•° {"columnId":"1840","current":N,"size":15,"type":false} -> data.total/data.records[]
  1667 æ�¡, 112 é¡µ, 15æ�¡/é¡µ
è¯¦æƒ…: https://www.kangding.gov.cn/gsgg/article/{id} (SSR HTML)
  æ ‡é¢˜ div.txt-title, æ—¥æœŸ span[title], æ­£æ–‡ div#contentBox
ç”Ÿäº§åº“ schema: gov_raw(id, site_name, source_url, page_url, title, publish_date, date_rank,
  summary, status, category, visits, content, tags, industry, attachments, group_name, has_table, script_name)
gov_search: fts5(title, site_name, summary, tokenize=trigram) rowid å¯¹é½� gov_raw.id
é    N)Úunescape)Úurljoinzhttps://www.kangding.gov.cnz6/site-service/c/manuscript/getManuscriptListByColumnIdÚ1840u   åº·å®šå¸‚-å…¬ç¤ºå…¬å‘Šzcrawl_kangding.pyu   å››å·�zkMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36z!application/json, text/plain, */*zapplication/jsonú/gsgg/c/)z
User-AgentÚAcceptúContent-TypeÚRefererc                 óÊ   — t        | xs d«      } t        j                  dd| «      } t        j                  dd| «      } t        j                  dd| «      j                  «       } | S )uD   æ¸…æ´—æ ‡é¢˜: strip &middot;&nbsp;&#32; å®žä½“å‰�ç¼€ å’Œç«™ç‚¹å�Žç¼€Ú u   ^[\s\xa0Â·\u00b7]+z\s*\.{3,}\s*$z\s+ú )r   ÚreÚsubÚstrip)Úts    ú#/root/gov_crawler/crawl_kangding.pyÚclean_titler   *   sV   € ä�’�bÓ€AÜ
�‰Ð$ b¨!Ó,€AÜ
�‰Ð  QÓ'€AÜ
�‰ˆv�s˜AÓ×$Ñ$Ó&€AØ€Hó    c                 ó6  — t         ||ddœ}| j                  t        |t        dd¬«      }|j                  dk7  ry|j                  «       }|j                  d«      dk7  ry|j                  d	«      xs i }|j                  d
«      xs g |j                  dd«      fS )u&   POST åˆ—è¡¨ API, è¿”å›ž records åˆ—è¡¨F)ÚcolumnIdÚcurrentÚsizeÚtypeé   )ÚjsonÚheadersÚtimeoutÚverifyéÈ   )Nr   Úcoder   ÚdataÚrecordsÚtotal)Ú	COLUMN_IDÚpostÚLIST_APIÚHEADERSÚstatus_coder   Úget)Úsessionr   r   ÚpayloadÚrr    Úds          r   Ú
fetch_listr-   3   s�   € ä$°À$ÐPUÑV€GØ�‰”X G´WÀbÐQVˆÓW€AØ‡}�}˜ÒØØ�6‰6‹8€DØ‡x�x�Ó˜1ÒØØ�‰�ÓÒ˜B€AØ�5‰5�ÓÒ!˜r 1§5¡5¨°!Ó#4Ð4Ð4r   c           	      ó”  — d}t        j                  d| t         j                  «      }|r/t        t        j                  dd|j                  d«      «      «      }d}t        j                  d| «      }|r|j                  d«      }t        j                  d| t         j                  «      }|s%t        j                  d| t         j                  «      }|s||dg fS |j                  d«      }g }t        j                  d|t         j                  «      D ]±  }	|	j                  d«      t        j                  dd|	j                  d	«      «      j                  «       }}
t        j                  d
|
t         j                  «      s|j                  d«      sŒ|j                  t        ||
«      |xs |
j                  d«      d   f«       Œ³ ||||fS )u@   è§£æž�è¯¦æƒ…é¡µ, è¿”å›ž (title, date, content_html, attachments)r   z'<div class="txt-title"[^>]*>(.*?)</div>z<[^>]+>é   z$<span[^>]*title="(\d{4}-\d{2}-\d{2})z.<div id="contentBox"[^>]*>(.*?)</div>\s*</div>z<div id="contentBox"[^>]*>(.*)z$<a[^>]+href="([^"]+)"[^>]*>(.*?)</a>é   z0\.(?:pdf|docx?|xlsx?|zip|rar|wps|et|dps)(?:\?|$)u   é™„ä»¶ú/éÿÿÿÿ)r   ÚsearchÚSr   r   ÚgroupÚfinditerr   ÚIÚ
startswithÚappendr   Úsplit)Ú	html_textÚurlÚtitleÚmÚdateÚdmÚcmÚbodyÚattsÚaÚhrefÚtxts               r   Úparse_detailrG   @   st  € ð €EÜ
�	‰	Ð<¸iÌÏÉÓN€AÙÜœBŸF™F :¨r°1·7±7¸1³:Ó>Ó?ˆà€DÜ	�‰Ð:¸IÓ	F€BÙ	Ø�x‰x˜‹{ˆä	�‰ÐDÀiÔQS×QUÑQUÓ	V€BÙÜ�Y‰YÐ8¸)ÄRÇTÁTÓJˆÙØ�d˜B Ð"Ð"Ø�8‰8�A‹;€Dà€DÜ�[‰[Ð@À$ÌÏÉÓMò JˆØ—G‘G˜A“J¤§¡ z°2°q·w±w¸q³zÓ B× HÑ HÓ JˆcˆÜ�9‰9ÐHÈ$ÔPR×PTÑPTÔUÐY\×YgÑYgÐhpÕYqØ�K‰Kœ  dÓ+¨SÒ-G°D·J±J¸s³OÀBÑ4GÐHÕIðJð �$˜˜dÐ"Ð"r   c                 ó–  ‡— g Šˆfd„}t        j                  d|| «      } t        j                  dd| «      } t        j                  dd| «      } | j                  dd«      j                  d	d«      } t        j                  d
d| «      } | j                  d«      D �cg c]  }|j	                  «       ‘Œ }}|D �cg c]  }|sŒ|‘Œ	 }}dj                  |«      }t        ‰«      D ]  \  }}|j                  d|› d�|«      }Œ t        j                  d
d|«      }|D ]  \  }	}
|	|vsŒ|d|	› d|
› d�z  }Œ |j	                  «       S c c}w c c}w )u9   HTML -> æ–‡æœ¬, ä¿�ç•™è¡¨æ ¼ã€�\n\n åˆ†æ®µã€�é™„ä»¶åµŒå…¥c                 óh   •— ‰j                  | j                  d«      «       dt        ‰«      dz
  › d�S )Nr   ú@@TABLEr/   ú@@)r9   r5   Úlen)r>   Útabless    €r   Ú	_save_tblzhtml_to_text.<locals>._save_tbl`   s/   ø€ Ø�‰�a—g‘g˜a“jÔ!Øœ˜V› q™Ð)¨Ð,Ð,r   z<table[\s\S]*?</table>z"</?(?:p|div|tr|br|h[1-6]|li)[^>]*>ú
z.</?(?:span|font|b|strong|i|em|u|o:p|o|a)[^>]*>r   z&nbsp;r   õ   Â z\n{3,}ú

rJ   rK   z

<p><a href="z" target="_blank">z</a></p>)r   r   Úreplacer:   r   ÚjoinÚ	enumerate)r;   ÚattachmentsrN   ÚlnÚlinesÚoutÚtextÚir   rE   rF   rM   s              @r   Úhtml_to_textr[   \   sN  ø€ à€Fô-ô —‘Ð0°)¸YÓG€IÜ—‘Ð<¸dÀIÓN€IÜ—‘ÐHÈ"ÈiÓX€IØ×!Ñ! (¨CÓ0×8Ñ8¸ÀÓE€IÜ—‘�y &¨)Ó4€IØ"+§/¡/°$Ó"7Ö8˜BˆR�X‰X�ZÐ8€EÐ8ØÖ
$�"¢Š2Ð
$€CÐ
$Ø�;‰;�sÓ€DÜ˜&Ó!ò 0‰ˆˆ1Ø�|‰|˜g a S¨˜O¨QÓ/‰ð0ä�6‰6�)˜V TÓ*€Dà ò M‰	ˆˆcØ�tÒØÐ& t fÐ,>¸s¸eÀ8ÐLÑL‰DðMð �:‰:‹<Ðùò 9ùÚ
$s   ÂEÂ7EÂ?Ec                  ó^  — t        j                  «       } | j                  dt        dd¬«       | j                  ddd¬«       | j                  d	t        ¬
«       | j                  «       }|j                  }|j                  }|j                  d«      st        j                  j                  |«      }t        j                  |«      }|j                  «       }d}d}d}t        j                   «       }		 |	j#                  t$        dz   t&        z   t(        dd¬«       t-        |	dd¬«      \  }
}|r|dz   dz  nd}t/        |j0                  |«      }t3        d|› d|› d|› d�«       t5        d|dz   «      D �]W  }t-        |	|d¬«      \  }}
|€t3        d|› d�«       |dz  }Œ,t3        d|› dt7        |«      › d�«       |sŒJ|D �]ó  }	 |j#                  d«      }t9        |j#                  dd«      «      }|j#                  d«      xs |j#                  d «      xs dd d! }|r|sŒat$        › d"|› �}|j;                  d#||f«       |j=                  «       d   dkD  r|dz  }Œœ|	j#                  |i t(        ¥d$d%i¥dd¬«      }d&|_        tA        |jB                  |«      \  }}}}|jE                  «       st3        d'|d d › �«       |dz  }�Œ|r|}|r|}tG        ||«      }|rd(jI                  d)„ |D «       «      nd}tK        jL                  ||d d* z   jO                  d&«      «      jQ                  «       }|r|d d* nd}|j;                  d+tR        ||||d|ddd|dd,|tT        d-|v rdnd|f«       |j;                  d.|jV                  |tR        |f«       |jY                  «        |dz  }t3        d/|› d0|d d1 › �«       �Œö t[        j\                  d4«       �ŒZ |j_                  «        t3        d5|› d6|› d7|› �«       y # t*        $ r Y �Œãw xY w# t*        $ r$}|dz  }t3        d2d d › d3|› �«       Y d }~�Œld }~ww xY w)8Nz--pagesr/   u   æŠ“å�–é¡µæ•°)r   ÚdefaultÚhelpz--dbz/mnt/data/search.dbu   SQLite æ•°æ�®åº“è·¯å¾„)r]   r^   z--script-name)r]   z/mnt/r   r   r   F)r   r   r   é   )r   r   é   u   å…± u    æ�¡ / u    é¡µ, æœ¬æ¬¡çˆ¬ u    é¡µú[u   ] åˆ—è¡¨è¯·æ±‚å¤±è´¥u	   ] åˆ—è¡¨ u    æ�¡Úidr=   r   ÚreleaseTimeÚtimeé
   z/gsgg/article/z?SELECT COUNT(*) FROM gov_raw WHERE page_url=? AND script_name=?r   z	text/htmlzutf-8u     è·³è¿‡ç©ºæ­£æ–‡: rQ   c              3   ó&   K  — | ]	  \  }}|–— Œ y ­w)N© )Ú.0ÚhÚ_s      r   ú	<genexpr>zmain.<locals>.<genexpr>¶   s   è ø€ Ò%9©D¨A¨q¤aÑ%9ùs   ‚iô  zíINSERT INTO gov_raw (site_name, source_url, page_url, title, publish_date, date_rank, summary, status, category, visits, content, tags, industry, attachments, group_name, has_table, script_name) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)Úotherz<tablezJINSERT INTO gov_search (rowid, title, site_name, summary) VALUES (?,?,?,?)z  + r   é(   z  ERR z: g333333Ó?u   å®Œæˆ�: æ–°å¢ž u
    / é‡�å¤� u
    / é”™è¯¯ )0ÚargparseÚArgumentParserÚadd_argumentÚintÚSCRIPT_NAMEÚ
parse_argsÚdbÚscript_namer8   ÚosÚpathÚ
expanduserÚsqlite3ÚconnectÚcursorÚrequestsÚSessionr(   ÚBASE_URLr#   r&   Ú	Exceptionr-   ÚminÚpagesÚprintÚrangerL   r   ÚexecuteÚfetchoneÚencodingrG   rY   r   r[   rS   ÚhashlibÚmd5ÚencodeÚ	hexdigestÚ	SITE_NAMEÚ
GROUP_NAMEÚ	lastrowidÚcommitrd   ÚsleepÚclose)ÚapÚargsÚdb_pathru   ÚconnÚcurÚ	new_countÚ	dup_countÚ	err_countr)   rj   r"   Útotal_pagesÚpages_to_crawlÚpager!   ÚrecÚ
article_idr=   Úpub_dateÚart_urlÚdrÚd_titleÚd_dateÚcontent_htmlrC   ÚcontentÚatt_txtrˆ   ÚsummaryÚes                                  r   Úmainr¨   v   sW  € Ü	×	 Ñ	 Ó	"€BØ‡O�O�I¤C°¸€OÔHØ‡O�O�FÐ$9Ð@X€OÔYØ‡O�O�O¬[€OÔ9Ø�=‰=‹?€Dà�g‰g€GØ×"Ñ"€KØ×Ñ˜gÔ&Ü—'‘'×$Ñ$ WÓ-ˆä�?‰?˜7Ó#€DØ
�+‰+‹-€CØ€IØ€IØ€Iä×ÑÓ €GðØ�‰”H˜zÑ)¬IÑ5¼wÐPRÐ[`ˆÔaô
 ˜'¨1°2Ô6�H€A€uÙ(-�5˜2‘: "Ò$°1€KÜ˜Ÿ™ [Ó1€NÜ	ˆD���w˜{˜mÐ+;¸NÐ;KÈ4Ð
PÔQä�a˜¨!Ñ+Ó,ó 4ˆÜ °¸BÔ?‰
ˆ�Øˆ?Ü�A�d�VÐ/Ð0Ô1Ø˜‰NˆIØÜ��$��y¤ W£ ¨dÐ3Ô4ÙØØó *	2ˆCð)2Ø ŸW™W T›]�
Ü# C§G¡G¨G°RÓ$8Ó9�ØŸG™G MÓ2ÒK°c·g±g¸f³oÒKÈÈSÈbÐQ�Ù¡JØÜ%˜J n°Z°LÐA�Ø—‘Ð]Ð`gÐitÐ_uÔvØ—<‘<“> !Ñ$ qÒ(Ø ‘N�IØØ—[‘[ Ð2Z´WÐ2Z¸nÈkÑ2ZÐdfÐot�[Óu�Ø%�”Ü6BÀ2Ç7Á7ÈGÓ6TÑ3�˜ ¨tØ#×)Ñ)Ô+ÜÐ/°°c°r°
¨|Ð<Ô=Ø ‘N�IÙÙØ#�EÙØ%�HÜ& |°TÓ:�Ù=A˜&Ÿ+™+Ñ%9°DÔ%9Ô9Àr�Ü—k‘k 5¨7°4°C¨=Ñ#8×"@Ñ"@ÀÓ"IÓJ×TÑTÓV�Ù+2˜' $ 3™-¸�Ø—‘ðAä ¨°%¸À1ÀgÈrÐSUÐWXÐZaÐceØ˜g¤z¸ÀGÑ8K±1ÐQRÐT_ðaôð —‘Ø`Ø—]‘] E¬9°gÐ>ôð —‘”Ø˜Q‘�	Ü˜˜X˜J a¨¨c¨r¨
 |Ð4Ö5ðO*	2ôV 	�
‰
�3Žði4ðl 	‡J�J„LÜ	ˆO˜I˜; j°°¸:ÀiÀ[Ð
QÕRøôA ò Úðûôt ò 2Ø˜Q‘�	Ü˜˜u S b˜z˜l¨"¨Q¨CÐ0×1Ò1ûð2ús?   Ã1'O/ Ç AO?È:O?ÉA'O?Ë C/O?Ï/	O<Ï;O<Ï?	P,ÐP'Ð'P,Ú__main__)r/   r_   )Ú__doc__rn   r‡   rv   r   ry   rd   Úhtmlr   Úurllib.parser   r|   r~   r%   r#   r‹   rr   rŒ   r&   r   r-   rG   r[   r¨   Ú__name__rg   r   r   ú<module>r®      s›   ðñó Û Û 	Û 	Û Û Ý Ý  ã à(€ØÐNÑN€Ø€	Ø$€	Ø!€Ø€
ð @Ø1Ø&Ø˜*Ñ$ yÑ0ñ	€òó
5ò#ò8ò4VSðr ˆzÒÙ…Fð r   