Ë
    V_Š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mZmZm	Z	 ddl
mZmZ dZedz   ZdZdd	iZ ej"                  «       Zej&                  j)                  e«       dd
„Zd„ Zd„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)u¼   crawl_nc_hjbha.py - å�—æ˜Œå¸‚ç”Ÿæ€�çŽ¯å¢ƒä¿¡æ�¯å…¬å¼€ (UCAP CMS)

List: /ncszf/hjbha/2021zfxxgk_list.shtml
Pagination: _N.shtml (page 1 = no suffix)
Detail: /ncszf/hjbha/YYYYMM/uuid.shtml
é    N)ÚBeautifulSoupÚTagÚNavigableString)ÚurljoinÚurlparsezhttps://www.nc.gov.cnz"/ncszf/hjbha/2021zfxxgk_list.shtmlé   z
User-Agentz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36c                 óÊ  — 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//zdata:)Úurllib.parser   ÚstrÚfind_allÚgetÚ
startswithÚparser   )ÚtableÚbase_urlÚurllibÚtblr   r   r   r   s           ú#/root/gov_crawler/crawl_nc_hjbha.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                 óN   — t        | «      }|j                  syd|j                  vS )z:Check if URL points to an external domain (not nc.gov.cn).Fz	nc.gov.cn)r   Únetloc)ÚurlÚparseds     r   Úis_external_urlr$   &   s$   € ä�c‹]€FØ�=Š=ØØ˜fŸm™mÐ+Ð+r   c                 ó  — | dk(  rt         }nt         j                  dd| › d�«      }	 t        j                  |d¬«      }d|_        |j
                  S # t        $ r+}t        d| › d|› �t        j                  ¬	«       Y d
}~y
d
}~ww xY w)z9Fetch list page. Page 1 = no suffix, pages 2+ = _N.shtml.é   z.shtmlÚ_r   ©Útimeoutúutf-8z  [ERROR] Fetch list page z: ©ÚfileN)
ÚLIST_URLÚreplaceÚsessionr   ÚencodingÚtextÚ	ExceptionÚprintÚsysÚstderr)Úpage_numr"   ÚrÚes       r   Úfetch_list_pager9   .   s   € à�1‚}Ü‰ä×Ñ˜x¨1¨X¨J°fÐ)=Ó>ˆðÜ�K‰K˜ RˆKÓ(ˆØˆŒ
Ø�v‰vˆøÜò ÜÐ*¨8¨*°B°q°cÐ:ÄÇÁÕLÜûðús   ¨)A Á	BÁ!BÂBc                 óÒ  — t        | d«      }|j                  dd¬«      }|sg S g }|j                  d«      D ]­  }|j                  d«      }|j                  dd¬«      }|sŒ*|sŒ-|j                  d	d
«      }|j                  dd
«      xs |j	                  d¬«      }|j	                  d¬«      }	|sŒz|sŒ}t        t        |«      }
t        |
«      rŒ™|j                  ||
|	dœ«       Œ¯ |S )zExtract items from list page.r
   ÚulÚpageList©Úclass_Úlir   ÚspanÚtimer   r   ÚtitleT©Ústrip)rB   r"   Údate)	r   Úfindr   r   Úget_textr   ÚBASE_URLr$   Úappend)ÚhtmlÚsoupr;   Úitemsr?   r   r@   r   rB   rE   Úfull_urls              r   Úextract_list_itemsrN   =   sæ   € ä˜˜}Ó-€DØ	�‰�4 
ˆÓ	+€BÙØˆ	Ø€EØ�k‰k˜$Óò ˆØ�G‰G�C‹LˆØ�w‰w�v fˆwÓ-ˆÚ’Ø—5‘5˜ Ó$ˆDØ—E‘E˜' 2Ó&Ò@¨!¯*©*¸4¨*Ó*@ˆEØ—=‘= t�=Ó,ˆDÚšÜ"¤8¨TÓ2�ä" 8Ô,ØØ—‘Ø"Ø#Ø ñõ ðð" €Lr   c           
      ód  — 	 t         j                  | d¬«      }d|_        t        |j                  d«      }|j                  d«      }|r|j                  d	¬
«      nd}|s;|j                  dddi¬«      }|r$|j                  d«      r|d   j                  «       }d}|j                  dddi¬«      }|r=|j                  d«      r,t        j                  d|d   «      }|r|j                  d«      }|j                  dd¬«      }	|	s,|j                  dd¬«      }
|
r|
j                  dd¬«      }	|	s|
}	|	s!t	        dt
        j                  ¬«       |||dœS |	j                  d«      }|r|}	g }|	j                  D �]>  }t!        |t"        «      r$|j                  «       }|r|j%                  |«       Œ8t!        |t&        «      sŒI|j(                  dk(  r'|j                  d	¬
«      }|sŒm|j%                  |«       Œ|j(                  dk(  r!t+        || «      }|sŒ�|j%                  |«       Œ¯|j(                  dk(  r'|j                  d	¬
«      }|sŒÓ|j%                  |«       Œå|j(                  dk(  sŒõ|j                  dd«      }|j                  dd«      }|s�Œ|j%                  d |› d!t-        | |«      › d"�«       �ŒA d#j/                  |«      }t        j0                  d$|j                  «       «      r|}|j3                  d%d	¬&«      D ]r  }|d'   }t        j                  d(|t        j4                  «      sŒ.|j                  d	¬
«      xs |j7                  d)«      d*   }t-        | |«      }||vsŒg|d+|› d,|› d-�z  }Œt |||dœS # t        $ r(}t	        d|› �t
        j                  ¬«       Y d}~yd}~ww xY w).z.Extract title, date, content from detail page.r   r(   r*   z  [ERROR] Fetch detail: r+   Nr
   Úh1TrC   r   ÚmetaÚnameÚArticleTitle)ÚattrsÚcontentÚPubDatez(\d{4}-\d{2}-\d{2})r&   Údivzarticle-content-bodyr=   zxxgk-detailz%  [WARN] No content area, using title)rB   rE   rU   ÚucapcontentÚpr   r   r   Úaltz![z](ú)z

z^https?://[^\s]+$r   )r   r   z\.(pdf|docx?|xlsx?)$ú/éÿÿÿÿz

<p><a href="z">z</a></p>)r/   r   r0   r2   r3   r4   r5   r   r1   rF   rG   rD   ÚreÚsearchÚgroupÚchildrenÚ
isinstancer   rI   r   rR   r   r   ÚjoinÚmatchr   ÚIÚsplit)Ú
detail_urlr7   r8   rK   rP   rB   rQ   rE   ÚmÚcontent_areaÚ
detail_divÚucapÚ
paragraphsÚchildÚtÚtxtÚtbl_htmlr   rZ   rU   r   r   r1   rM   s                           r   Úextract_detailrq   X   s‡  € ðÜ�K‰K˜
¨BˆKÓ/ˆØˆŒ
ô
 ˜Ÿ™ Ó/€Dð 
�‰�4‹€BÙ')ˆB�K‰K˜dˆKÔ#¨r€EÙØ�y‰y˜¨°Ð'?ˆyÓ@ˆÙ�D—H‘H˜YÔ'Ø˜‘O×)Ñ)Ó+ˆEð €DØ�9‰9�V F¨IÐ#6ˆ9Ó7€DÙ�—‘˜Ô#Ü�I‰IÐ,¨d°9©oÓ>ˆÙØ—7‘7˜1“:ˆDð —9‘9˜UÐ+A�9ÓB€LÙØ—Y‘Y˜u¨]�YÓ;ˆ
ÙØ%Ÿ?™?¨5Ð9O˜?ÓPˆLÙØ%ˆLáÜÐ5¼S¿Z¹ZÕHØ¨¸Ñ?Ð?ð ×Ñ˜]Ó+€DÙØˆð €JØ×&Ñ&ó KˆÜ�eœ_Ô-Ø—‘“ˆAÙØ×!Ñ! !Ô$ØÜ˜%¤Ô%Øà�:‰:˜ÒØ—.‘. t�.Ó,ˆCÚØ×!Ñ! #Õ&Ø�Z‰Z˜7Ò"Ü)¨%°Ó<ˆHÚØ×!Ñ! (Õ+Ø�Z‰Z˜5Ò Ø—.‘. t�.Ó,ˆCÚØ×!Ñ! #Õ&Ø�Z‰Z˜5Ó Ø—)‘)˜E 2Ó&ˆCØ—)‘)˜E 2Ó&ˆCÛØ×!Ñ! B s e¨2¬g°jÀ#Ó.FÐ-GÀqÐ"IÖJð3Kð6 �k‰k˜*Ó%€Gô 
‡x�xÐ$ g§m¡m£oÔ6Øˆð �]‰]˜3 Tˆ]Ó*ò IˆØ�‰yˆÜ�9‰9Ð,¨d´B·D±DÕ9Ø—:‘: D�:Ó)Ò@¨T¯Z©Z¸«_¸RÑ-@ˆDÜ˜z¨4Ó0ˆHà˜wÒ&ØÐ-¨h¨Z°r¸$¸¸xÐHÑH‘ðIð ØØñð øôk ò ÜÐ(¨¨Ð,´3·:±:Õ>Üûðús   ‚M> Í>	N/ÎN*Î*N/c                  ó  — d} t        t        j                  «      dkD  rt        t        j                  d   «      } g }t	        d| dz   «      D ]²  }t        d|› d�t        j                  ¬«       t        |«      }|s n„t        |«      }|s!t        d|› d�t        j                  ¬«        nVt        dt        |«      › d	�t        j                  ¬«       |j                  |«       || k  sŒžt        j                  d«       Œ´ | t        z  }|d | }t        d
t        |«      › �t        j                  ¬«       g }t        |«      D ]¤  \  }}t        d|dz   › dt        |«      › d|d   d d › �t        j                  ¬«       t        |d   «      }	|	r8|j                  |	d   |d   |	d   xs |d   d|	d   |	d   r|	d   d d nddœ«       |dz   dz  dk(  sŒ�t        j                  d«       Œ¦ t        t!        j"                  |d¬«      «       y )Né   r&   zFetching list page z...r+   z  No items found on page z
, stoppingz  Found z itemszTotal items: z  [r\   z] rB   é(   r"   rE   u   å�—æ˜Œå¸‚ç”Ÿæ€�çŽ¯å¢ƒrU   éÈ   r   )rB   Úpage_urlrE   Ú	site_namerU   Úsummaryr   F)Úensure_ascii)Úlenr4   ÚargvÚintÚranger3   r5   r9   rN   ÚextendrA   ÚsleepÚPER_PAGEÚ	enumeraterq   rI   ÚjsonÚdumps)
ÚpagesÚ	all_itemsrY   rJ   rL   Útotal_neededÚresultsÚiÚitemÚdetails
             r   Úmainr‹   ¹   sñ  € Ø€EÜ
Œ3�8‰8ƒ}�qÒÜ”C—H‘H˜Q‘KÓ ˆð €IÜ�1�e˜a‘iÓ ò ˆÜÐ# A 3 cÐ*´·±Õ<Ü˜qÓ!ˆÙÙÜ" 4Ó(ˆÙÜÐ-¨a¨S°
Ð;Ä#Ç*Á*ÕMÙÜ�œ˜U›˜ FÐ+´#·*±*Õ=Ø×Ñ˜ÔØˆu‹9Ü�J‰J�q�Mðð œ8Ñ#€LØ˜-˜<Ð(€IÜ	ˆMœ#˜i›.Ð)Ð
*´·±Õ<ð €GÜ˜YÓ'ò ‰ˆˆ4Ü��A�a‘C�5˜œ#˜i›.Ð)¨¨D°©M¸#¸2Ð,>Ð+?Ð@ÄsÇzÁzÕRÜ  U¡Ó,ˆÙØ�N‰NØ ™Ø  ™KØ˜v™Ò6¨$¨v©,Ø4Ø! )Ñ,Ø6<¸YÒ6G˜6 )Ñ,¨T¨cÑ2ÈRñô ð �‰E�Q‰;˜!ÓÜ�J‰J�q�Mðô 
Œ$�*‰*�W¨5Ô
1Õ2r   Ú__main__)r   )Ú__doc__Úrequestsr4   r^   rA   r‚   Úbs4r   r   r   r   r   r   rH   r-   r€   ÚHEADERSÚSessionr/   ÚheadersÚupdater   r$   r9   rN   rq   r‹   Ú__name__© r   r   ú<module>r–      s›   ðñ÷ %× $Ó $ß 3Ñ 3ß *à"€ØÐ:Ñ:€Ø€ð ÐPð€ð ˆ(×
Ñ
Ó
€Ø ‡�× Ñ �wÔ óò,òòò6^òB*3ðZ ˆzÒÙ…Fð r   