Ë
    lÊjt$  ã            
       ó¦  — 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ej                  j                  dd«      Z	ddddœZ
d	Zd
ZdZdZd„ Zd„ Zd„ Zd"d„Zdefd„Zedk(  rõdej*                  v r…dZ eej*                  «      D ]Y  \  ZZedk(  sŒedz    eej*                  «      k  sŒ%ej*                  edz      j7                  d«      sŒGej*                  edz      Z n er	 ee«       y ed¬«       ydej*                  v rI ee«      Z ee«      Z ed ee«      z  «       edd D ]  Z eded   dd ›ded   ›ded    ›�«       Œ! y ede¬!«       yy)#u‰   
æµ™æ±Ÿæ”¿åŠ¡æœ�åŠ¡ç½‘-èˆŸå±±å¸‚å²±å±±åŽ¿-å»ºè®¾é¡¹ç›®çŽ¯å¢ƒå½±å“�è¯„ä»·ä¿¡æ�¯å…¬ç¤º
http://zsds.zjzwfw.gov.cn/col/col1460404/index.html
é    NÚDB_PATHz/root/search.dbzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36zJtext/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8zzh-CN,zh;q=0.9,en;q=0.8)z
User-AgentÚAcceptzAccept-Languageu(   å²±å±±åŽ¿-å»ºè®¾é¡¹ç›®çŽ¯è¯„ä¿¡æ�¯å…¬ç¤ºu   å²±å±±é   z3http://zsds.zjzwfw.gov.cn/col/col1460404/index.htmlc                 ób   — t        j                  | t        dd¬«      }d|_        |j                  S )Né   T)ÚheadersÚtimeoutÚallow_redirectszutf-8)ÚrequestsÚgetÚHEADERSÚencodingÚtext)ÚurlÚrs     ú/root/gov_crawler/crawl_zsds.pyÚ
fetch_pager      s&   € Ü�‰�S¤'°2ÀtÔL€AØ€A„JØ�6‰6€Mó    c                 óJ  — g }i }t        j                  d| «      D ]8  }|j                  d«      j                  «       }|dddœ||j	                  «       <   Œ: t        |j                  «       «      D ]G  }| t        d|dz
  «      | }t        j                  d|«      }|sŒ.d|j                  d«      z   ||   d	<   ŒI |j                  «       D �cg c]
  }|d	   sŒ	|‘Œ }}d
}	t        j                  |	| «      }
t        |«      D ]  \  }}|t        |
«      k  sŒ|
|   |d<   Œ |S c c}w )zcParse list page: <a href='/art/...' class='bt_link' title='TITLE'>TITLE</a> with date in div below.z!class='bt_link'\s+title='([^']+)'é   Ú )Útitler   Údater   éÈ   z+href='(/art/\d+/\d+/\d+/art_\d+_\d+\.html)'úhttp://zsds.zjzwfw.gov.cnr   zW<div style="color: #B4B4B4;font-size: 12px;margin-right:2px;">(\d{4}-\d{2}-\d{2})</div>r   )ÚreÚfinditerÚgroupÚstripÚstartÚsortedÚkeysÚmaxÚsearchÚvaluesÚfindallÚ	enumerateÚlen)ÚhtmlÚitemsÚ	items_mapÚmr   ÚposÚbeforeÚhref_mÚvÚdate_patternÚdatesÚiÚitems                r   Úextract_list_itemsr5      s6  € à€Eð €IÜ�[‰[ÐAÀ4ÓHò GˆØ—‘˜“
× Ñ Ó"ˆØ).°rÀ2ÑFˆ	�!—'‘'“)ÒðGô
 �i—n‘nÓ&Ó'ò RˆØ”c˜!˜S ™W“o cÐ*ˆÜ—‘ÐIÈ6ÓRˆÚØ$?À&Ç,Á,ÈqÃ/Ñ$QˆI�c‰N˜5Ò!ð	Rð "×(Ñ(Ó*Ö7�1¨a°«hŠQÐ7€EÐ7ð r€LÜ�J‰J�| TÓ*€Eô ˜UÓ#ò $‰ˆˆ4ØŒs�5‹z‹>Ø  ™8ˆD�ŠLð$ð €Lùò 8s   Ã
D ÃD c                 óÖ  — d}t        j                  d| t         j                  «      }|r |j                  d«      j	                  «       }nmt        j                  d| t         j                  «      }|rF|j                  d«      j	                  «       }t        j
                  dd|«      }|j	                  «       }d}t        j                  d| «      }|r|j                  d«      j	                  «       }|s7t        j                  d| «      }|r|j                  d«      j	                  «       }d}g }d}t        j                  d| t         j                  «      }|r|j                  d«      }n8t        j                  d	| t         j                  «      }|r|j                  d«      }|�rJd
}	t        j                  |	|t         j                  t         j                  z  «      D ]š  }
|
j                  d«      }t        j
                  dd|
j                  d«      «      j	                  «       }|j                  d«      s|j                  d«      rd|z   n|}|j                  |xs |j                  d«      d   |dœ«       Œœ t        j                  d|«      D ]Q  }|j                  d«      s|j                  d«      rd|z   n|}|j                  |j                  d«      d   |dœ«       ŒS g }t        j                  d|t         j                  t         j                  z  «      D ]¿  }|j                  d«      }|j                  d«      r!|j                  |j                  d«      «       ŒF|j                  d«      }t        j
                  dd|«      }t        j
                  dd|«      }t        j
                  dd|«      }|j	                  «       }|sŒ¯|j                  |«       ŒÁ dj                  |«      }|rt        |j	                  «       «      dk  rNt        j
                  dd|«      }t        j
                  dd|«      j	                  «       }|rt        |«      dkD  r|}|||||t        t        dœS )z.Extract title, content, date from detail page.r   z8style='color:#fff;font-size:30px;height:40px'>(.*?)</td>r   z<title>(.*?)</title>u   \s*[-â€”|]\s*.*$z5style='font-size:12px; color:#999;'[^>]*>([^<]+)</td>z4font-size:12px; color:#999;[^>]*>(\d{4}-\d{2}-\d{2})z><td class="bt_content"><div id="zoom"[^>]*>(.*?)</div>\s*</td>zclass="bt_content">(.*?)</td>zN<a[^>]*href=["']([^"']*\.(?:pdf|doc|docx|xls|xlsx|rar|zip))["'][^>]*>(.*?)</a>z<[^>]+>é   Úhttpú/r   éÿÿÿÿ)Únamer   z<img[^>]*src="([^"]+)"[^>]*>z+<p[^>]*>(.*?)</p>|<table[^>]*>(.*?)</table>r   z<tablez&[nN][bB][sS][pP];ú z&nbsp;z

é   z\s+)r   Úcontentr   r   ÚattachmentsÚ	site_namer   )r   r$   ÚDOTALLr   r   Úsubr   ÚIÚ
startswithÚappendÚsplitr&   Újoinr(   Ú	SITE_NAMEÚGROUP)r)   Ú
source_urlr   r,   ÚtÚpub_dater>   r?   Úcontent_htmlÚatt_patternÚa_tagÚlink_urlÚ	link_textÚimg_urlÚpartsÚelemÚtagÚp_textr   s                      r   Úextract_contentrW   <   s·  € ð €EÜ
�	‰	ÐMÈtÔUW×U^ÑU^Ó_€AÙØ—‘˜“
× Ñ Ó"‰ä�I‰IÐ-¨t´R·Y±YÓ?ˆÙØ—‘˜“
× Ñ Ó"ˆAÜ—‘Ð*¨B°Ó2ˆAØ—G‘G“IˆEð €HÜ
�	‰	ÐJÈDÓQ€AÙØ—7‘7˜1“:×#Ñ#Ó%ˆáÜ�I‰IÐMÈtÓTˆÙØ—w‘w˜q“z×'Ñ'Ó)ˆHð €GØ€KØ€Lä
�	‰	ÐWÐY]Ô_a×_hÑ_hÓi€AÙØ—w‘w˜q“z‰ô �I‰IÐ:¸DÄ"Ç)Á)ÓLˆÙØŸ7™7 1›:ˆLâàkˆÜ—[‘[ ¨l¼B¿D¹DÄ2Ç9Á9Ñ<LÓMò 	`ˆEØ—{‘{ 1“~ˆHÜŸ™˜z¨2¨u¯{©{¸1«~Ó>×DÑDÓFˆIØ×&Ñ& vÔ.ØEM×EXÑEXÐY\ÔE]Ð6¸ÒAÐck�Ø×Ñ¨	Ò(L°X·^±^ÀCÓ5HÈÑ5LÐU]Ñ^Õ_ð	`ô —z‘zÐ"AÀ<ÓPò 	QˆGØ×%Ñ% fÔ-ØCJ×CUÑCUÐVYÔCZÐ5¸Ò?Ð`g�Ø×Ñ¨¯©°cÓ(:¸2Ñ(>ÀwÑOÕPð	Qð ˆä—K‘KÐ NÐP\Ô^`×^gÑ^gÔjl×jnÑjnÑ^nÓoò 	)ˆDØ—*‘*˜Q“-ˆCØ�~‰~˜hÔ'Ø—‘˜SŸY™Y q›\Õ*ð Ÿ™ A›�ÜŸ™ 
¨B°Ó7�ÜŸ™Ð 5°s¸FÓC�ÜŸ™ 	¨3°Ó7�ØŸ™›�ÚØ—L‘L Õ(ð	)ð —+‘+˜eÓ$ˆñ ”c˜'Ÿ-™-›/Ó*¨RÒ/Ü�v‰v�j # |Ó4ˆÜ�v‰v�f˜c 4Ó(×.Ñ.Ó0ˆÙ”C˜“I ’NØˆGð ØØØØ"ÜÜñð r   c                 óD  — | sd} t        d| z  «       t        | «      }t        || «      }|j                  «       D ]c  \  }}|dk(  rt        |›d|›�«       Œ|dk(  r3t        d|t	        |«      fz  «       t        |dd «       t        d	«       ŒTt        |›d|›�«       Œe |S )
zTest a single article.z?http://zsds.zjzwfw.gov.cn/art/2023/11/30/art_1460404_22707.htmlz=== Testing: %s ===r?   z: r>   z%s (%d chars):Ni   z...)Úprintr   rW   r*   r(   )r   r)   ÚresultÚkr0   s        r   Ú
crawl_testr\   —   s    € áØOˆÜ	Ð
 #Ñ
%Ô&Ü�c‹?€DÜ˜T 3Ó'€FØ—‘“ò %‰ˆˆ1Ø�ÒÜša¡Ð#Õ$Ø�)Š^ÜÐ" a¬¨Q« [Ñ0Ô1Ü�!�D�S�'ŒNÜ�%�Läša¡Ð#Õ$ð%ð €Mr   Fc                 óî  — ddl }t        dt        z  «       t        t        «      }t        |«      }t        dt        |«      z  «       |dk  st        |«      dk  rn|t        |«      z  }|d| }| rš|dd D ]‘  }t        d|d	   dd
 z  «       t        |d   «      }t        ||d   «      }t        d|d	   z  «       t        d|d   z  «       t        dt        |d   «      |d   dd fz  «       t        dt        |d   «      z  «       Œ“ y|j                  t        d¬«      }|j                  d«       |j                  «       }	d}
d}|D ]ú  }|	j                  d|d   f«       |	j                  «       r|dz  }Œ/t        |d   «      }t        ||d   «      }|d   rt        j                  |d   d¬«      nd}|	j                  d|d	   |d   |d	   dz   t        z   dz   |d   r|d   dd ndz   |d   xs |d   |d   |d   ||d   |d   f	«       |
dz  }
|
dz  dk(  sŒÒ|j                  «        t        d |
t        |«      fz  «       Œü |j                  «        |j!                  «        t        d!|
|fz  «       y)"z"Crawl list pages and detail pages.r   Nz[%s] Fetching list...z  Found %d itemsr   é	   é   z
=== Detail: %s ===r   é(   r   z  Title: %sz
  Date: %sr   z  Content (%d chars): %sr>   r   z  Attachments: %dr?   é<   )r	   zPRAGMA busy_timeout=30000z)SELECT id FROM gov_raw WHERE page_url = ?F)Úensure_asciir   z§INSERT INTO gov_raw (title, content, summary, publish_date, page_url, site_name, attachments, group_name, source_url)
               VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)r<   r@   r   r   z  Inserted %d/%d...z!
Done. Inserted: %d, Existing: %d)Úsqlite3rY   rH   r   ÚLIST_URLr5   r(   rW   Úconnectr   ÚexecuteÚcursorÚfetchoneÚjsonÚdumpsÚcommitÚclose)Ú	test_modeÚ	max_pagesrc   r)   r*   Ú	max_itemsr4   rZ   ÚconnÚcÚinsertedÚexistingÚattachments_jsons                r   Úcrawlru   ª   s¾  € ãô 
Ð
!¤IÑ
-Ô.Ü”hÓ€DÜ˜tÓ$€EÜ	Ð
œs 5›zÑ
)Ô*ð �A‚~œ˜U› qšØà¤ E£
Ñ*ˆ	Ø�j�yÐ!ˆáØ˜"˜1�Iò 	DˆDÜÐ(¨4°©=¸¸"Ð+=Ñ=Ô>Ü˜d 5™kÓ*ˆDÜ$ T¨4°©;Ó7ˆFÜ�- &¨¡/Ñ1Ô2Ü�, ¨¡Ñ/Ô0ÜÐ,´°F¸9Ñ4EÓ0FÈÈyÑHYÐZ^Ð[^ÐH_Ð/`Ñ`ÔaÜÐ%¬¨F°=Ñ,AÓ(BÑBÕCð	Dð 	ð �?‰?œ7¨Bˆ?Ó/€DØ‡L�LÐ,Ô-Ø�‰‹€Aà€HØ€HØò BˆØ	�	‰	Ð=ÀÀUÁ¸~ÔNØ�:‰:Œ<Ø˜‰MˆHØä˜$˜u™+Ó&ˆÜ   t¨E¡{Ó3ˆØTZÐ[hÒTiœ4Ÿ:™: f¨]Ñ&;È%ÕPÐoqÐà	�	‰	ð5ð �w‘Ø�yÑ!Ø˜‘ 3Ñ&¬Ñ2°SÑ8ÐW]Ð^gÒWh¸FÀ9Ñ<MÈdÈsÑ<SÐnpÑqØ�v‘Ò. $ v¡,Ø�u‘Ø�{Ñ#Ø Ø�w‘Ø�u‘ð
ô	
ð 	�A‰ˆØ�a‰<˜1ÓØ�K‰KŒMÜÐ'¨8´S¸³ZÐ*@Ñ@ÕAð9Bð< 	‡K�K„MØ‡J�J„LÜ	Ð
.°(¸HÐ1EÑ
EÕFr   Ú__main__z--testr   r8   T)rm   z--listzPage 1: %d itemsz  r   r`   z | r   r   )rm   rn   )N) Ú__doc__r   ÚsysÚosri   Útimer   Úenvironr   r   r   rH   rI   Ú	MAX_PAGESrd   r   r5   rW   r\   ru   Ú__name__Úargvr   r'   r3   Úargr(   rD   r)   r*   rY   r4   © r   r   ú<module>r�      sˆ  ðñ÷ )× (× (à
�*‰*�.‰.˜Ð$5Ó
6€ð DØZØ0ñ€ð
 7€	Ø€Ø€	à@€òòò@Xóvð&  Yó CGðL ˆzÒØ�3—8‘8ÑØˆÙ §¡Ó)ò 	‰FˆAˆsØ�h‹ 1 q¡5©3¨s¯x©x«=Ó#8¸S¿X¹XÀaÈÁc¹]×=UÑ=UÐV\Õ=]Ø—h‘h˜q ™s‘m�Ùð	ñ Ù�s�Oá˜DÖ!Ø	�S—X‘XÑ	Ù˜(Ó#ˆÙ" 4Ó(ˆÙÐ ¡3 u£:Ñ-Ô.Ø˜"˜1�Iò 	VˆDÚ d¨7¡m°C°RÒ&8¸$¸v»,ÈÈUÊÐTÕUñ	Vñ 	˜¨Ö3ð% r   