Ë
    9JŠj2+  ã                   ó  — 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mZ ddlm	Z	 ddl
Z
dZedz   Zddd	d
œZ e
j                  «       Zej                   j#                  e«       dd„Zd„ Zd„ Zdd„Zd„ Zd„ Zedk(  r e«        yy)uM   ww.gov.cn - æ— ä¸ºå¸‚åŸºå±‚æ”¿åŠ¡å…¬å¼€ å»ºè®¾é¡¹ç›®çŽ¯è¯„æ–‡ä»¶å®¡æ‰¹ çˆ¬è™«é    N)Údatetime)Ú
HTMLParserzhttps://www.ww.gov.cnz(/grassroots/column/6603381?catId=1003011zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36z?text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8zzh-CN,zh;q=0.9)z
User-AgentÚAcceptzAccept-Languagec                 óà   — t         j                  | |¬«      }|j                  |_        |j                  dk7  r,t        d| › d|j                  › �t        j                  ¬«       y|j                  S )zFetch page and return HTML text)ÚtimeoutéÈ   zWARN: z
 returned ©ÚfileN)	ÚsessionÚgetÚapparent_encodingÚencodingÚstatus_codeÚprintÚsysÚstderrÚtext)Úurlr   Úresps      ú/root/gov_crawler/crawl_ww.pyÚget_page_soupr      s^   € ä�;‰;�s Gˆ;Ó,€DØ×*Ñ*€D„MØ×Ñ˜3ÒÜ��s�e˜: d×&6Ñ&6Ð%7Ð8¼s¿z¹zÕJØØ�9‰9Ðó    c                 óx  — g }t        j                  d| t         j                  «      D ]�  }|j                  d«      j	                  «       }t        j
                  dd|j                  d«      «      j	                  «       }|j                  d«      j	                  «       }|sŒx|sŒ{|j                  |||dœ«       Œ‘ |S )z.Extract article links and dates from list pagezÈ<li[^>]*class="[^"]*clearfix[^"]*"[^>]*>.*?<a[^>]*href="([^"]*?/openness/grassroots/6603381/\d+\.html?)"[^>]*class="[^"]*title[^"]*"[^>]*>(.*?)</a>.*?<span[^>]*class="[^"]*date[^"]*"[^>]*>(.*?)</span>é   ú<[^>]+>Ú é   é   )r   ÚtitleÚdate)ÚreÚfinditerÚDOTALLÚgroupÚstripÚsubÚappend)ÚhtmlÚitemsÚmr   r   r    s         r   Úparse_list_pager+      s£   € à€Eô
 �[‰[ð	>ð 	Œb�i‰ióò Eˆð �g‰g�a‹j×ÑÓ ˆÜ—‘�z 2 q§w¡w¨q£zÓ2×8Ñ8Ó:ˆØ�w‰w�q‹z×ÑÓ!ˆÚ’5Ø�L‰L ¨u¸dÑCÕDðEð €Lr   c                 ó”  ‡— |ddddg dœ}t        j                  d| «      }|rI|j                  d«      j                  «       }t        j                  dd|«      j                  «       }||d<   t        j                  d| «      }|r%|j                  d«      j                  «       dd	 |d
<   t        j                  d| «      }|r"|j                  d«      j                  «       |d<   |d
   s:t        j                  d| «      }|r"|j                  d«      j                  «       |d
<   |d   s:t        j                  d| «      }|r"|j                  d«      j                  «       |d<   d}| j                  d«      }|dk  r| j                  d«      }|dk\  ræ| j                  dd|«      }d}| j                  d|«      }	|dkD  r°|	t        | «      k  r¢|	dz  }	| |	|	dz    dk(  r| j                  d|	«      }
|
dk\  rg|
dz   }	na| |	|	dz    dk(  r|dz  }nP| |	|	dz    dk(  s| |	|	dz    dk(  r:| j                  d|	«      }
|
dk\  r#|
|	kD  r| |
dz
  |
dz    dk7  r| |
dz
     dk7  r|dz  }|dkD  r|	t        | «      k  rŒ¢| ||	dz    }�n	| j                  d«      dk\  rõ| j                  d«      }| j                  dd|«      }d}| j                  d|«      }	|dkD  r°|	t        | «      k  r¢|	dz  }	| |	|	dz    dk(  r| j                  d|	«      }
|
dk\  rg|
dz   }	na| |	|	dz    dk(  r|dz  }nP| |	|	dz    dk(  s| |	|	dz    dk(  r:| j                  d|	«      }
|
dk\  r#|
|	kD  r| |
dz
  |
dz    dk7  r| |
dz
     dk7  r|dz  }|dkD  r|	t        | «      k  rŒ¢| ||	dz    }|s t        d |› �t        j                  ¬!«       |S g }t        j                  d"|t         j                  «      D ]~  }|j                  d«      j                  «       }|j                  d«      r
t        |z   }n1|j                  d#«      s t        j                   j#                  ||«      }|j%                  |«       Œ€ |}d$„ }t        j                  d%||t         j                  ¬&«      }g Šˆfd'„}t        j                  d(||t         j                  ¬&«      }t        j                  d)d|t         j                  ¬&«      }t        j                  d*d+|«      }t        j                  d,d-|«      }t        j                  dd+|«      }t        j                  d.d+|«      }t        j                  d/d0|«      }t        j                  d1d0|«      }t        j                  d2d|«      }|j'                  d3d4«      j'                  d5d«      j'                  d6d«      j'                  d7d8«      }|j'                  d9d:«      j'                  d;d4«      }t        j                  d<d4|«      }t        j                  d=d-|«      }|j                  «       }t)        ‰«      D ]!  \  }}|j'                  d>|› d?�d+|z   d+z   «      }Œ# g }g d@¢}|j+                  d+«      D ]L  }|j                  «       }|sŒdA}|D ]  }t        j                  ||«      sŒdB} n |rŒ<|j%                  |«       ŒN d-j-                  |«      j                  «       |dC<   ||dD<   |S )Ez1Extract title, date, source, content, attachmentsr   )Úpage_urlr   Úpublish_dateÚsourceÚcontentÚattachmentsz<title>(.*?)</title>r   u*   [_\-â€”]\s*èŠœæ¹–å¸‚æ”¿åŠ¡å…¬å¼€å¹³å�°\s*$r   zPubDate.*?content="([^"]+)"Né
   r.   z!ContentSource.*?content="([^"]+)"r/   u.   å�‘å¸ƒæ—¶é—´[ï¼š:]\s*(\d{4}[-/]\d{2}[-/]\d{2})u<   ä¿¡æ�¯æ�¥æº�[ï¼š:]\s*([^<\s][^<]{2,60}?)(?:</|&nbsp;|\s{2,})z"class="j-fontContent gkwz_contnet"r   Úgkwz_contnetú<ú>é   z<!--z-->r   é   z</div>é   z<div z<divz/>ú/Úxxgkcontentz WARN: No content block found in r	   z6href="([^"]*\.(?:doc|pdf|docx|xls|xlsx|zip|rar)[^"]*)"Úhttpc                 ó@  — | j                  d«      }| j                  d«      }| j                  d«      }t        j                  dd|«      j                  «       }|s%|j	                  d«      j                  d«      d   }|}t        j                  dd	|«      }d
|› d|› d�S )Nr   r   r   r   r   r9   éÿÿÿÿz\s+ú z<p><a href="z">z</a></p>)r$   r!   r&   r%   ÚrstripÚsplit)r*   ÚfullÚa_urlÚa_textÚfns        r   Úreplace_attach_linkz)parse_detail.<locals>.replace_attach_link•   s‘   € Ø�w‰w�q‹zˆØ—‘˜“
ˆØ—‘˜“ˆÜ—‘˜
 B¨Ó/×5Ñ5Ó7ˆÙà—‘˜cÓ"×(Ñ(¨Ó-¨bÑ1ˆBØˆFä—‘˜  VÓ,ˆØ˜e˜W B v h¨hÐ7Ð7r   zN<a\s[^>]*href="([^"]*\.(?:doc|pdf|docx|xls|xlsx|zip|rar)[^"]*)"[^>]*>(.*?)</a>)Úflagsc                 óh   •— ‰j                  | j                  d«      «       dt        ‰«      dz
  › d�S )Nr   ú[[TABLE_r   ú]])r'   r$   Úlen)r*   Útabless    €r   Ú
save_tablez parse_detail.<locals>.save_table«   s.   ø€ Ø�‰�a—g‘g˜a“jÔ!Øœ#˜f›+ a™-˜¨Ð+Ð+r   z<table[^>]*>.*?</table>z<(script|style)[^>]*>.*?</\1>z	<br\s*/?>ú
z</p>z

z</tr>z</td>z | z</th>r   z&nbsp;r>   z&lt;z&gt;z&amp;ú&z&quot;ú"z&#160;z[ \t]+z\n{3,}rH   rI   )uˆ   ^(è´£ä»»ç¼–è¾‘|åˆ�å®¡|å¤�å®¡|ç»ˆå®¡|å®¡æ ¸|ç¼–è¾‘|å�‘å¸ƒ|å½•å…¥|æ ¡å¯¹|æ‰“å�°|å…³é—­|åˆ†äº«|çº é”™|å­—ä½“|å¤§\s*ä¸­\s*å°�)\s*[ï¼š:ã€�\[]z^\s*$u   ^\[.*?çº é”™.*?\]u   ^.*é˜…è¯»æ¬¡æ•°u   ^.*å­—å�·.*å¤§.*ä¸­.*å°�FTr0   r1   )r!   Úsearchr$   r%   r&   ÚfindÚrfindrJ   r   r   r   r"   r#   Ú
startswithÚBASE_URLÚurllibÚparseÚurljoinr'   ÚreplaceÚ	enumerater@   Újoin)r(   r-   Úresultr*   r   Úcontent_blockÚidxÚstartÚdepthÚjÚkr1   Úatt_urlÚ
text_blockrE   rL   ÚiÚtblÚfiltered_linesÚskip_patternsÚlineÚline_strippedÚskipÚpatrK   s                           @r   Úparse_detailrl   5   sß  ø€ à"¨RÀÈrÐ^`ÐqsÑt€Fô 	�	‰	Ð)¨4Ó0€AÙØ—‘˜“
× Ñ Ó"ˆä—‘ÐDÀbÈ%ÓP×VÑVÓXˆØˆˆw‰ô 	�	‰	Ð0°$Ó7€AÙØ!"§¡¨£×!1Ñ!1Ó!3°C°RÐ!8ˆˆ~Ñô 	�	‰	Ð6¸Ó=€AÙØŸ7™7 1›:×+Ñ+Ó-ˆˆxÑð �.Ò!Ü�I‰IÐGÈÓNˆÙØ%&§W¡W¨Q£Z×%5Ñ%5Ó%7ˆF�>Ñ"Ø�(ÒÜ�I‰IÐUÐW[Ó\ˆÙØ Ÿw™w q›z×/Ñ/Ó1ˆF�8Ñð €MØ
�)‰)Ð8Ó
9€CØ
ˆQ‚wØ�i‰i˜Ó'ˆØ
ˆa‚xà—
‘
˜3  3Ó'ˆàˆØ�I‰I�c˜3ÓˆØ�aŠi˜A¤ D£	šMØ�‰FˆAØ�A�a˜‘cˆ{˜fÒ$Ø—I‘I˜e QÓ'�Ø˜’6Ø˜A™‘AØ�a˜˜!™� Ò(Ø˜‘
‘Ø�a˜˜!™� Ò'¨4°°!°A±#¨;¸&Ò+@Ø—I‘I˜c 1Ó%�Ø˜’6˜a !še¨¨Q¨q©S°°1±¨¸Ò(=À$ÀqÈÁsÁ)ÈsÒBRØ˜Q‘J�Eð �aŠi˜A¤ D£	›Mð ˜U 1 Q¡3˜ŠØ	�‰�=Ó	! QÒ	&Ø�i‰i˜Ó&ˆØ—
‘
˜3  3Ó'ˆØˆØ�I‰I�c˜3ÓˆØ�aŠi˜A¤ D£	šMØ�‰FˆAØ�A�a˜‘cˆ{˜fÒ$Ø—I‘I˜e QÓ'�Ø˜’6Ø˜A™‘AØ�a˜˜!™� Ò(Ø˜‘
‘Ø�a˜˜!™� Ò'¨4°°!°A±#¨;¸&Ò+@Ø—I‘I˜c 1Ó%�Ø˜’6˜a !še¨¨Q¨q©S°°1±¨¸Ò(=À$ÀqÈÁsÁ)ÈsÒBRØ˜Q‘J�Eð �aŠi˜A¤ D£	›Mð ˜U 1 Q¡3˜ˆáÜÐ0°°
Ð;Ä#Ç*Á*ÕMØˆð €KÜ�[‰[ØAØ”r—y‘yóò 	$ˆð —'‘'˜!“*×"Ñ"Ó$ˆØ×Ñ˜cÔ"Ü Ñ(‰GØ×#Ñ# FÔ+Ü—l‘l×*Ñ*¨8°WÓ=ˆGØ×Ñ˜7Õ#ð	$ð €Jò8ô —‘ØYØ˜Z¬r¯y©yô€Jð €Fô,ô —‘Ð2°JÀ
ÔRT×R[ÑR[Ô\€Jô —‘Ð8¸"¸jÔPR×PYÑPYÔZ€Jä—‘˜ d¨JÓ7€JÜ—‘˜ ¨Ó4€JÜ—‘˜	 4¨Ó4€JÜ—‘˜ $¨
Ó3€JÜ—‘˜ %¨Ó4€JÜ—‘˜ %¨Ó4€Jä—‘˜
 B¨
Ó3€Jà×#Ñ# H¨cÓ2×:Ñ:¸6À3ÓG×OÑOÐPVÐX[Ó\×dÑdÐelÐnqÓr€JØ×#Ñ# H¨cÓ2×:Ñ:¸8ÀSÓI€Jä—‘˜	 3¨
Ó3€JÜ—‘˜	 6¨:Ó6€JØ×!Ñ!Ó#€Jô ˜FÓ#ò M‰ˆˆ3Ø×'Ñ'¨(°1°#°RÐ(8¸$À¹*ÀtÑ:KÓL‰
ðMð €Nò€Mð × Ñ  Ó&ò 
(ˆØŸ
™
›ˆÙØØˆØ ò 	ˆCÜ�y‰y˜˜mÕ,Ø�Ùð	ò Ø×!Ñ! $Õ'ð
(ð Ÿ™ NÓ3×9Ñ9Ó;€Fˆ9ÑØ'€Fˆ=Ñà€Mr   c                 ó®  — g }t        | | |z   «      D ]À  }|dk(  rt        }nt        d|› �z   }t        d|› d|› �t        j                  ¬«       t        |«      }|st        d|› �t        j                  ¬«       Œht        |«      }t        dt        |«      › d�t        j                  ¬«       |j                  |«       t        j                  d«       ŒÂ |S )	z%Crawl list pages and return all itemsr   z&pageIndex=z
List page z: r	   zFailed to fetch list page z  Found z items)ÚrangeÚLIST_URLr   r   r   r   r+   rJ   ÚextendÚtimeÚsleep)Ú
start_pageÚ	max_pagesÚ	all_itemsÚpager   r(   r)   s          r   Úcrawl_list_pagesrw   ä   sÆ   € à€Iä�j *¨yÑ"8Ó9ò ˆØ�1Š9Ü‰Cä˜{¨4¨&Ð1Ñ1ˆCä�
˜4˜&  3 %Ð(¬s¯z©zÕ:Ü˜SÓ!ˆÙÜÐ.¨t¨fÐ5¼C¿J¹JÕGØä Ó%ˆÜ�œ˜U›˜ FÐ+´#·*±*Õ=Ø×Ñ˜ÔÜ�
‰
�1�ðð" Ðr   c                 óÒ   — | d   }t        |«      }|st        d|› �t        j                  ¬«       yt	        ||«      }|d   xs | d   |d<   |d   s| j                  dd«      |d<   |S )	zCrawl a single detail pager   z
  FAILED: r	   Nr   r.   r    r   )r   r   r   r   rl   r   )Úitemr   r(   Údetails       r   Úcrawl_detailr{   ü   st   € à
ˆu‰+€CÜ˜Ó€DÙÜ�
˜3˜%Ð ¤s§z¡zÕ2Øä˜$ Ó$€FØ˜W‘oÒ6¨¨g©€Fˆ7�OØ�.Ò!Ø!%§¡¨&°"Ó!5ˆˆ~Ñà€Mr   c                  ó–  — dd l } | j                  «       }|j                  dddg d¢¬«       |j                  dt        d¬	«       |j                  d
t        d¬	«       |j	                  «       }|j
                  dk(  r@d}t        |«      }|r0t        ||«      }t        t        j                  |dd¬«      d d «       y |j                  }|j
                  dk(  rd}t        |j                  |«      }t        dt        |«      › �t        j                   ¬«       t#        |«      D ]§  \  }}	t        d|dz   › dt        |«      › d|	d   d d › d�t        j                   ¬«       t%        |	«      }|rI|d   |d   |d   |d   |j'                  dd«      |d    d!d"œ}
t        t        j                  |
d¬#«      «       t)        j*                  d$«       Œ© y )%Nr   Úmodeú?rA   )rA   ÚincrementalÚtest)ÚnargsÚdefaultÚchoicesz--start-pager   )Útyper‚   z--max-pagesr8   r€   z?https://www.ww.gov.cn/openness/grassroots/6603381/41186323.htmlFr   )Úensure_asciiÚindenti¸  r   zTotal items to crawl: r	   ú[r9   z] r   é2   z...r-   r0   r.   r/   r   r1   u   æ— ä¸ºå¸‚äººæ°‘æ”¿åºœ)r   r-   r0   r.   r/   r1   Ú	site_name)r…   g      à?)ÚargparseÚArgumentParserÚadd_argumentÚintÚ
parse_argsr}   r   rl   r   ÚjsonÚdumpsrt   rw   rs   rJ   r   r   rY   r{   r   rq   rr   )rŠ   ÚparserÚargsÚtest_urlr(   rz   rt   r)   rd   ry   Úoutputs              r   Úmainr•     s«  € ÛØ×$Ñ$Ó&€FØ
×Ñ˜ c°6ÒCbÐÔcØ
×Ñ˜¬S¸!ÐÔ<Ø
×Ñ˜¬C¸ÐÔ;Ø×ÑÓ€Dà‡y�y�FÒàTˆÜ˜XÓ&ˆÙÜ! $¨Ó1ˆFÜ”$—*‘*˜V°%ÀÔBÀ5ÀDÐIÔJØà—‘€IØ‡y�y�MÒ!Øˆ	ä˜TŸ_™_¨iÓ8€EÜ	Ð"¤3 u£: ,Ð
/´c·j±jÕAä˜UÓ#ò ‰ˆˆ4Ü��!�A‘#��aœ˜E›
�| 2 d¨7¡m°C°RÐ&8Ð%9¸Ð=ÄCÇJÁJÕOÜ˜dÓ#ˆÙà ™Ø" :Ñ.Ø! )Ñ,Ø & ~Ñ 6Ø Ÿ*™* X¨rÓ2Ø% mÑ4Ø4ñˆFô ”$—*‘*˜V°%Ô8Ô9Ü�
‰
�3�ñr   Ú__main__)é   )r   r8   )Ú__doc__r!   r�   r   rq   Úurllib.parserU   r   Úhtml.parserr   ÚrequestsrT   ro   ÚHEADERSÚSessionr   ÚheadersÚupdater   r+   rl   rw   r{   r•   Ú__name__© r   r   ú<module>r¢      s–   ðá Sß (× (Ó (Ý Ý "ã à"€ØÐ@Ñ@€ð DØOØ'ñ€ð ˆ(×
Ñ
Ó
€Ø ‡�× Ñ �wÔ óòò,ló^ò0ò &ðR ˆzÒÙ…Fð r   