Ë
    †É…j|$  ã                   óÄ  — 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„ 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      j;                  d«      sŒGej.                  edz      Z n er	 ee«       y ed¬«       ydej.                  v rR e ed«      «      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"   dd# ›�«       Œ$ y ede¬$«       yy)'ub   
è�¥å�£å¸‚è�¥å•†çŽ¯å¢ƒå»ºè®¾å±€-é€šçŸ¥å…¬å‘Š
https://yshjjsj.yingkou.gov.cn/002/002001/about.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   è�¥å�£é   é   z)https://yshjjsj.yingkou.gov.cn/002/002001c                 óX   — | dk(  r	t         dz   S | dk  rt         d| z  z   S t         d| z  z   S )z%Get list URL for a given page number.é   z/about.htmlr   z/%d.htmlz+/about.html?categoryNum=002001&pageIndex=%d)ÚBASE_URL)Úpages    ú/root/gov_crawler/crawl_yk.pyÚget_list_urlr      s<   € àˆq‚yÜ˜-Ñ'Ð'Ø	�ŠÜ˜* tÑ+Ñ+Ð+äÐGÈ$ÑNÑNÐNó    c                 ób   — t        j                  | t        dd¬«      }d|_        |j                  S )Né   T)ÚheadersÚtimeoutÚallow_redirectszutf-8)ÚrequestsÚgetÚHEADERSÚencodingÚtext)ÚurlÚrs     r   Ú
fetch_pager   !   s&   € Ü�‰�S¤'°2ÀtÔL€AØ€A„JØ�6‰6€Mr   r   c                 ó  — g }t        j                  d| t         j                  «      }|s|S |j                  d«      }d}t        j                  ||t         j                  «      D ]¥  }|j                  d«      }|j                  d«      j                  «       }|j                  d«      j                  «       }	|j                  d«      rd|z   }n|j                  d«      sd	|z   }|j                  d«      sŒ‘|j                  |||	d
œ«       Œ§ |S )zÓParse list page: 
    <ul class="ewb-list hidden" id="infolist">
      <li>...<a href="..." class="ewb-list-name ..." title="TITLE">TITLE</a>
          <span class="ewb-list-date">DATE</span></li>
    </ul>
    z%<ul[^>]*id="infolist"[^>]*>(.*?)</ul>r   zx<li[^>]*>.*?<a[^>]*href="([^"]*)"[^>]*title="([^"]*)"[^>]*>(.*?)</a>.*?<span[^>]*class="ewb-list-date"[^>]*>(.*?)</span>é   é   ú/úhttps://yshjjsj.yingkou.gov.cnÚhttpzhttps://yshjjsj.yingkou.gov.cn/)r   ÚtitleÚdate)ÚreÚsearchÚDOTALLÚgroupÚfinditerÚstripÚ
startswithÚappend)
Úhtmlr
   ÚitemsÚmÚul_htmlÚ
li_patternÚm2r   r!   Údate_strs
             r   Úextract_list_itemsr2   '   sò   € ð €Eä
�	‰	Ð:¸DÄ"Ç)Á)ÓL€AÙØˆà�g‰g�a‹j€Gð M€JÜ�k‰k˜* g¬r¯y©yÓ9ò EˆØ�h‰h�q‹kˆØ—‘˜“×!Ñ!Ó#ˆØ—8‘8˜A“;×$Ñ$Ó&ˆð �>‰>˜#ÔØ2°SÑ8‰CØ—‘ Ô'Ø3°cÑ9ˆCð �~‰~Ð>Ô?Øà�‰˜S¨5¸(ÑCÕDðEð" €Lr   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	                  «       }d}g }d}t        j                  d| t         j                  «      }|r|j                  d«      }|�r"t        j                  d|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                  |«       Œ7|j                  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.Ú z&<h3[^>]*id="ivs_title"[^>]*>(.*?)</h3>r   z<title>(.*?)</title>u   \s*[-â€”|]\s*.*$u&   å�‘å¸ƒæ—¶é—´ï¼š(\d{4}-\d{1,2}-\d{1,2})z<<div[^>]*class="ewb-article-content"[^>]*>(.*?)</div>\s*<!--zG<a[^>]*href="([^"]*\.(?:pdf|doc|docx|xls|xlsx|rar|zip))"[^>]*>(.*?)</a>z<[^>]+>r   r    r   r   éÿÿÿÿ)Únamer   z<img[^>]*src="([^"]+)"z+<p[^>]*>(.*?)</p>|<table[^>]*>(.*?)</table>r   z<tablez&[nN][bB][sS][pP];ú z

r   z\s+)r!   Úcontentr"   r   ÚattachmentsÚ	site_namer&   )r#   r$   r%   r&   r(   Úsubr'   ÚIr)   r*   ÚsplitÚfindallÚjoinÚlenÚ	SITE_NAMEÚGROUP)r+   Ú
source_urlr!   r-   ÚtÚpub_dater8   r9   Úcontent_htmlÚa_tagÚlink_urlÚ	link_textÚimg_urlÚpartsÚelemÚtagÚp_textr   s                     r   Úextract_contentrO   L   sZ  € ð €EÜ
�	‰	Ð;¸TÄ2Ç9Á9ÓM€AÙØ—‘˜“
× Ñ Ó"‰ä�I‰IÐ-¨t´R·Y±YÓ?ˆÙØ—‘˜“
× Ñ Ó"ˆAÜ—‘Ð*¨B°Ó2ˆAØ—G‘G“IˆEð €HÜ
�	‰	Ð;¸TÓB€AÙØ—7‘7˜1“:×#Ñ#Ó%ˆð €GØ€KØ€Lä
�	‰	ÐQÐSWÔY[×YbÑYbÓc€AÙØ—w‘w˜q“zˆâä—[‘[Ð!kÐmyÔ{}×{Ñ{ô  CE÷  CLñ  CLñ  |Ló  Mò 	`ˆEØ—{‘{ 1“~ˆHÜŸ™˜z¨2¨u¯{©{¸1«~Ó>×DÑDÓFˆIØ×&Ñ& vÔ.ØJR×J]ÑJ]Ð^aÔJbÐ;¸hÒFÐhp�Ø×Ñ¨	Ò(L°X·^±^ÀCÓ5HÈÑ5LÐU]Ñ^Õ_ð	`ô —z‘zÐ";¸\ÓJò 	QˆGØ×%Ñ% fÔ-ØHO×HZÑHZÐ[^ÔH_Ð:¸WÒDÐel�Ø×Ñ¨¯©°cÓ(:¸2Ñ(>ÀwÑOÕPð	Qð ˆÜ—K‘KÐ NÐP\Ô^`×^gÑ^gÔjl×jnÑjnÑ^nÓoò 	)ˆDØ—*‘*˜Q“-ˆCØ�~‰~˜hÔ'Ø—‘˜SÕ!ð Ÿ™ A›�ÜŸ™ 
¨B°Ó7�ÜŸ™Ð 5°s¸FÓC�ØŸ™›�ÚØ—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\https://yshjjsj.yingkou.gov.cn/002/002001/20260513/c1a712c6-8e02-404a-933b-febf292e2d0c.htmlz=== Testing: %s ===r9   z: r8   z%s (%d chars):Niô  z...)Úprintr   rO   r,   r@   )r   r+   ÚresultÚkÚvs        r   Ú
crawl_testrU   š   s    € áØlˆÜ	Ð
 #Ñ
%Ô&Ü�c‹?€DÜ˜T 3Ó'€FØ—‘“ò %‰ˆˆ1Ø�ÒÜša¡Ð#Õ$Ø�)Š^ÜÐ" a¬¨Q« [Ñ0Ô1Ü�!�D�S�'ŒNÜ�%�Läša¡Ð#Õ$ð%ð €Mr   Fc                 óÎ  — ddl }g }t        «       }t        d|dz   «      D ]–  }t        |«      }t	        d|||dd fz  «       t        |«      }t        ||«      }t	        dt        |«      z  «       |D ]/  }	|	d   |vsŒ|j                  |	d   «       |j                  |	«       Œ1 | sŒ‡t        |«      dk\  sŒ– n t	        d	t        |«      z  «       | 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}t        |«      }t        |«      D ]ô  \  }}	|j                  d|	d   f«       |j!                  «       r|dz  }Œ2t        |	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 ||fz  «       Œö |j)                  «        |j+                  «        t	        d!|||fz  «       y)"z"Crawl list pages and detail pages.r   Nr   z[Page %d/%d] %sé<   z  Found %d itemsr   é   z
Total unique items: %dz
=== Detail: %s ===r!   é(   z  Title: %sz
  Date: %sr"   z  Content (%d chars): %sr8   éÈ   z  Attachments: %dr9   )r   zPRAGMA busy_timeout=30000z)SELECT id FROM gov_raw WHERE page_url = ?F)Úensure_asciir4   z§INSERT INTO gov_raw (title, content, summary, publish_date, page_url, site_name, attachments, group_name, source_url)
               VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)r7   r:   r&   r   z  Progress: %d/%d inserted...z-
Done. Inserted: %d, Existing: %d (total: %d))Úsqlite3ÚsetÚranger   rQ   r   r2   r@   Úaddr*   rO   Úconnectr   ÚexecuteÚcursorÚ	enumerateÚfetchoneÚjsonÚdumpsrA   ÚcommitÚclose)Ú	test_modeÚ	max_pagesr\   Ú	all_itemsÚ	seen_urlsr
   r   r+   r,   ÚitemrR   ÚconnÚcÚinsertedÚexistingÚtotalÚidxÚattachments_jsons                     r   Úcrawlru   ­   s=  € ãà€IÜ“€Iô �a˜ Q™Ó'ò ˆÜ˜4Ó ˆÜÐ 4¨°C¸¸°HÐ"=Ñ=Ô>Ü˜#‹ˆÜ" 4¨Ó.ˆÜÐ ¤3 u£:Ñ-Ô.Øò 	'ˆDØ�E‰{ )Ò+Ø—‘˜d 5™kÔ*Ø× Ñ  Õ&ð	'ò œ˜Y›¨1Ó,Ùðô 
Ð
$¤s¨9£~Ñ
5Ô6áØ˜b˜q�Mò 	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Ü�	‹N€Eä˜yÓ)ò G‰	ˆˆTØ	�	‰	Ð=ÀÀ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‰ˆØ�b‰=˜AÓØ�K‰KŒMÜÐ1°X¸uÐ4EÑEÕFð9Gð< 	‡K�K„MØ‡J�J„LÜ	Ð
:¸hÈÐRWÐ=XÑ
XÕYr   Ú__main__z--testr    T)ri   z--listzPage 1: %d itemsz  r!   rY   z | r"   r   é2   )ri   rj   )r   )N)"Ú__doc__r#   ÚsysÚosre   Útimer   Úenvironr   r   r   rA   rB   ÚPER_PAGEÚ	MAX_PAGESr	   r   r   r2   rO   rU   ru   Ú__name__Úargvr   rc   ÚiÚargr@   r)   r+   r,   rQ   rm   © r   r   ú<module>r„      s   ðñ÷ )× (× (à
�*‰*�.‰.˜Ð$5Ó
6€ð DØZØ0ñ€ð
 :€	Ø€Ø€Ø€	à6€òOòó"òJKó\ð&  Yó KZð\ ˆ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Ñ	Ù™, q›/Ó*ˆÙ" 4Ó(ˆÙÐ ¡3 u£:Ñ-Ô.Ø˜"˜1�Iò 	[ˆDÚ d¨7¡m°C°RÒ&8¸$¸v»,ÈÈUÉÐTWÐUWÑHXÐYÕZñ	[ñ 	˜¨Ö3ð% r   