Ë
    ¸¬ujW(  ã            
       ó&  — 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 ddlZddl	m
Z
 ddlmZ dZdZdZd	Zd
ZdZdZddiZ ej*                  «       Zej.                  j1                  e«       dZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z d„ Z!d/d„Z"d/d„Z#d„ Z$d„ Z%e&dk(  rù e'ejP                  «      dkD  rejP                  d   ndZ)e)dk(  r e$«        ye)d k(  rX e'ejP                  «      d!kD  rejP                  d!   nd"Z*e*d#k(  r e#«        ye*re*jW                  «       r e,e*«      ndZ- e"e-«       ye)d$k(  rJ ed«      Z. ee.«      Z/ ed% e'e/«      › d&�«       e/dd D ]  Z0 ed'e0d(   › d)e0d*   dd+ › d)e0d,   › �«       Œ! y ed-ejP                  d   › d.�«       yy)0u–  æ¹›æ±Ÿå¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€-å»ºè®¾é¡¹ç›®çŽ¯å¢ƒå½±å“�è¯„ä»· (www.zhanjiang.gov.cn)
åˆ—è¡¨: /zjsfw/bmdh/sthjj/zwgk/zdly/sthjxx/jsxmhjyx/index.html -> index_N.html
       æ³¨æ„�: index_1.html = 404, page 1 = index.html
è¯¦æƒ…: /zjsfw/bmdh/sthjj/zwgk/zdly/sthjxx/jsxmhjyx/content/post_XXXXXX.html
     -> div.cont div.article (è¡¨æ ¼+PDFé™„ä»¶)

ç­–ç•¥: full=å‰�5é¡µ, full all=å…¨é‡�, incremental=ç¬¬1é¡µ(æ—¥è·‘)
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoup)Úurljoinzhttps://www.zhanjiang.gov.cnz+/zjsfw/bmdh/sthjj/zwgk/zdly/sthjxx/jsxmhjyxu   æ¹›æ±Ÿå¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€u   å»ºè®¾é¡¹ç›®çŽ¯å¢ƒå½±å“�è¯„ä»·u   å¹¿ä¸œé1   é   z
User-Agentz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36ú P )z.docz.docxz.pdfz.xlsz.xlsxz.pptz.pptxz.zipz.rarz.7zz.tarz.gzz.txtzdownfile.jspzdownload.jspÚdownfileÚdownloadc                 ó„   — t         j                  j                  | dz   «       t         j                  j                  «        y )Nú
)ÚsysÚstderrÚwriteÚflush)Úmsgs    ú+/root/gov_crawler/crawl_zhanjiang_hjyxpj.pyÚlogr   "   s(   € Ü‡J�J×Ñ�S˜4‘ZÔ Ü‡J�J×ÑÕó    c                 óZ   ‡— | sy| j                  «       Št        ˆfd„t        D «       «      S )NFc              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­w)N© )Ú.0ÚextÚlows     €r   ú	<genexpr>z!_is_attachment.<locals>.<genexpr>+   s   øè ø€ Ò1˜cˆs�cŒzÑ1ùs   ƒ)ÚlowerÚanyÚATTACH_EXTS)Úhrefr   s    @r   Ú_is_attachmentr!   '   s%   ø€ ÙØØ
�*‰*‹,€CÜÓ1¤[Ô1Ó1Ð1r   c                 ó  — | dk(  rt         › t        › d�}n'| dk(  rt         › t        › d�}nt         › t        › d| › d�}	 t        j                  |d¬«      }d	|_        |j
                  S # t        $ r}t        d
| › d|› �«       Y d }~y d }~ww xY w)Né   z/index.htmlé   z/index_2.htmlz/index_z.htmlé   ©Útimeoutúutf-8z  [ERROR] list page z: )ÚBASE_URLÚ	LIST_PATHÚsessionÚgetÚencodingÚtextÚ	Exceptionr   )ÚpageÚurlÚrÚes       r   Ú
fetch_listr4   .   s–   € Øˆq‚yÜ�
œ9˜+ [Ð1‰Ø	�ŠÜ�
œ9˜+ ]Ð3‰ä�
œ9˜+ W¨T¨F°%Ð8ˆðÜ�K‰K˜ RˆKÓ(ˆØˆŒ
Ø�v‰vˆøÜò ÜÐ" 4 &¨¨1¨#Ð.Ô/Üûðús   ¾)A( Á(	BÁ1BÂBc                 ó  — t        | d«      }g }t        j                  d«      }|j                  d|¬«      D ]Ç  }|d   }|j	                  d¬«      }|s|j                  dd	«      }|sŒ1t        t        |«      }d	}|j                  }	|	rb|	j                  d
d¬«      }
|
r|
j	                  d¬«      }|s9t        j                  d|	j	                  d¬«      «      }|r|j                  d«      }|j                  |||dœ«       ŒÉ |S )zÝExtract articles from list page.
    Structure: <li><a title="..." href=".../content/post_XXXXXX.html">
                 <span class="point"></span>title</a>
                 <span class="time">YYYY-MM-DD</span></li>
    úhtml.parserz/content/post_\d+\.htmlÚa©r    r    T©ÚstripÚtitleÚ ÚspanÚtime)Úclass_z(\d{4}-\d{2}-\d{2})r#   )r;   r1   Údate)r   ÚreÚcompileÚfind_allÚget_textr,   r   r)   ÚparentÚfindÚsearchÚgroupÚappend)ÚhtmlÚsoupÚitemsÚart_reÚa_tagr    r;   Úfull_urlÚdate_strÚliÚ	time_spanÚdms               r   Ú
parse_listrT   >   s  € ô ˜˜}Ó-€DØ€EÜ�Z‰ZÐ2Ó3€FØ—‘˜s¨�Ó0ò JˆØ�V‰}ˆØ—‘ T�Ó*ˆÙà—I‘I˜g rÓ*ˆEÙØÜœ8 TÓ*ˆð ˆØ�\‰\ˆÙØŸ™ ¨v˜Ó6ˆIÙØ$×-Ñ-°DÐ-Ó9�Ùä—Y‘YÐ5°r·{±{È°{Ó7NÓO�ÙØ!Ÿx™x¨›{�Hà�‰˜u¨X¸xÑHÕIð/Jð0 €Lr   c                 ób  — 	 t         j                  | d¬«      }d|_        t	        |j
                  d«      }|j                  d	«      }|j                  d
«      }|r$|j                  d«      r|d   j                  «       }d}|r'|j                  d«      r|d   j                  «       d d }|j                  d«      }|s|j                  d«      }|sd|› d| › d�||g fS g }	g }
|j                  dd¬«      D ]M  }|d   }|j                  d¬«      }t        |«      sŒ&t        t        |«      }|
j                  |xs d|dœ«       ŒO g }|j                  d«      D ]-  }	 |j                  t        |«      «       |j                  «        Œ/ |j                  dd¬«      D ]ý  }|d   }|j                  d¬«      }|r"|j!                  d«      s|j!                  d«      rŒ?t        t        |«      }t        |«      sŒ[|r"|j!                  d«      s|j!                  d«      rŒ€t        t        |«      }t        |«      r#|r	d|› d|› d�nd|› d�}|j#                  |«       Œ¾|sŒÁ|j!                  d«      s|j!                  d«      sŒäd|› d|› d�}|j#                  |«       Œÿ |j                  g d¢«      D ]-  }|j%                  dt&        «       |j                  t&        «       Œ/ |j                  d «      D ]  }|j#                  t&        «       Œ |j                  g d!¢«      D ]  }|j)                  «        Œ |j                  dd¬«      }t+        j,                  d"d#|«      }|j/                  d#d$«      }t+        j,                  d%d$|«      }|j                  «       }|D ]
  }|d$|› �z  }Œ |j                  «       rt1        |j                  «       «      dk  r	d|› d| › d�}||||
fS # t        $ r}d|› d| › d�|dg fcY d }~S d }~ww xY w# t        $ r& |j                  |j                  dd¬«      «       Y �Œ¹w xY w)&Nr%   r&   r(   ú[z](ú)r<   r6   zmeta[name=ArticleTitle]zmeta[name=pubdate]Úcontenté
   zdiv.cont div.articlezdiv.articler7   Tr8   r    r9   u   é™„ä»¶)Únamer1   Útableú )Ú	separatorr:   ú#Ú
javascriptu	   [é™„ä»¶](Úhttpú/)ÚpÚh1Úh2Úh3Úh4Úh5Úh6r   Úbr)r=   ÚbÚstrongÚfontÚemÚiÚuÚsz\x00P\x00(\s*\x00P\x00)+r	   z

z\n{3,})r+   r,   r-   r/   r   r.   Ú
select_oner:   rC   rD   r!   r   r)   rI   ÚstrÚ	decomposeÚ
startswithÚreplace_withÚinsertÚMARKERÚunwraprA   ÚsubÚreplaceÚlen)Ú
detail_urlr;   r2   r3   rK   Ú
meta_titleÚ	meta_dateÚpub_dateÚ
content_elÚattachmentsÚall_attachmentsrN   r    r.   rO   Útables_htmlr[   Úmd_linkÚtagri   Útbl_htmls                        r   Úextract_contentr‡   b   s8  € ð9Ü�K‰K˜
¨BˆKÓ/ˆØˆŒ
ô ˜Ÿ™ Ó/€Dà—‘Ð!:Ó;€JØ—‘Ð 4Ó5€IÙ�j—n‘n YÔ/Ø˜9Ñ%×+Ñ+Ó-ˆØ€HÙ�Y—]‘] 9Ô-Ø˜YÑ'×-Ñ-Ó/°°Ð4ˆð —‘Ð!7Ó8€JÙØ—_‘_ ]Ó3ˆ
ÙØ�5�'˜˜J˜< qÐ)¨5°(¸BÐ>Ð>à€Kð €OØ×$Ñ$ S¨tÐ$Ó4ò PˆØ�V‰}ˆØ�~‰~ Dˆ~Ó)ˆÜ˜$ÕÜœx¨Ó.ˆHØ×"Ñ"¨DÒ,<°HÀXÑ#NÕOðPð €KØ×$Ñ$ WÓ-ò ˆð	JØ×Ñœs 5›zÔ*ð 	�‰Õðð ×$Ñ$ S¨tÐ$Ó4ò ,ˆØ�V‰}ˆØ�~‰~ Dˆ~Ó)ˆÙ�t—‘ sÔ+¨t¯©¸|Ô/LØÜœ8 TÓ*ˆÜ˜$ÕÙ˜4Ÿ?™?¨3Ô/°4·?±?À<Ô3PØÜœx¨Ó.ˆHÜ˜dÔ#Ù59˜A˜d˜V 2 h Z¨qÑ1ÀÈ8È*ÐTUÐ?V�Ø×"Ñ" 7Õ+Ú˜4Ÿ?™?¨6Ô2°d·o±oÀcÕ6JØ˜d˜V 2 h Z¨qÐ1�Ø×"Ñ" 7Õ+ð,ð$ ×"Ñ"Ò#LÓMò ˆØ�
‰
�1”fÔØ�
‰
”6Õðð ×!Ñ! $Ó'ò  ˆØ
�‰œÕð ð ×"Ñ"Ò#WÓXò ˆØ�
‰
�ðð ×Ñ¨°4ÐÓ8€DÜ�6‰6Ð-¨{¸DÓA€DØ�<‰<˜ VÓ,€DÜ�6‰6�)˜V TÓ*€DØ�:‰:‹<€Dàò "ˆØ�$�x�jÐ!Ñ!‰ð"ð �:‰:Œ<œ3˜tŸz™z›|Ó,¨rÒ1Ø�5�'˜˜J˜< qÐ)ˆà�˜ /Ð1Ð1øôe ò 9Ø�5�'˜˜J˜< qÐ)¨5°"°bÐ8Õ8ûð9ûôH ò 	JØ×Ñ˜uŸ~™~¸À4˜~ÓH×Ið	Jús/   ‚O ÅO?Ï	O<Ï%O7Ï1O<Ï7O<Ï?+P.Ð-P.c                 ó0  — g }t        «       }t        | |dz   «      D ]è  }t        |«      }|s |S t        |«      }|st	        d|› d|› d�«        |S d}	|D ]\  }
|
d   |vsŒ|r&|
d   r!	 t        j                  |
d   d«      }||k  rŒ2	 |j                  |
d   «       |j                  |
«       |	dz  }	Œ^ t	        d|› d|› d	|› d
t        |«      › d|	› d�«       |	dk(  r|dkD  rt	        d«        |S t        j                  d«       Œê |S # t        $ r Y ŒŒw xY w)Nr#   z  [z PAGE z] no items, stoppingr   r1   r@   z%Y-%m-%dra   z] z	 items, +z newz  [STOP] no new items)ÚsetÚranger4   rT   r   r   ÚstrptimeÚ
ValueErrorÚaddrI   r{   r>   Úsleep)Ú
start_pageÚend_pageÚcutoffÚlabelÚ	all_itemsÚ	seen_urlsr0   rJ   rL   Ú	new_countÚitemÚds               r   Úcrawl_pagesr˜   »   sh  € Ø€IÜ“€IÜ�j (¨Q¡,Ó/ò ˆÜ˜$ÓˆÙØð. Ðô- ˜4Ó ˆÙÜ�#�e�W˜F 4 &Ð(<Ð=Ô>Øð& Ðð% ˆ	Øò 	ˆDØ�E‰{ )Ò+Ù˜d 6šlðÜ$×-Ñ-¨d°6©l¸JÓG˜Ø˜vš:Ø$ð &ð —‘˜d 5™kÔ*Ø× Ñ  Ô&Ø˜Q‘‘	ð	ô 	ˆc�%�˜˜t˜f A h Z¨r´#°e³*°¸YÀyÀkÐQUÐVÔWØ˜Š>˜d QšhÜÐ'Ô(ØàÐô 	�
‰
�1�ð3ð4 Ðøô &ò Ùðús   Á(D	Ä		DÄDc           	      óH  — t        dt        | «      › d�«       t        | d«      D ]c  \  }}t        |d   |d   «      \  }}}}|r||d<   |r||d<   ||d<   ||d<   t	        ||«       |d	z  d
k(  sŒJt        d|› dt        | «      › �«       Œe t        dt        | «      › d�«       y )Nu   
å…± u    æ�¡å¾…çˆ¬è¯¦æƒ…r#   r1   r;   r@   rX   r�   rY   r   z  [PROGRESS] ra   u   
[DONE] å…±çˆ¬å�– õ    æ�¡)r   r{   Ú	enumerater‡   Úoutput_item)r“   Úidxr–   rX   r;   r   r�   s          r   Ú_process_detailsrž   Û   sÄ   € Üˆ&”�Y“Ð Ð 0Ð1Ô2Ü˜y¨!Ó,ò 
8‰	ˆˆTÜ0?ÀÀUÁÈTÐRYÉ]Ó0[Ñ-ˆ�˜ +ÙØ#ˆD�‰LÙØ!ˆD�‰MØ!ˆˆY‰Ø)ˆˆ]ÑÜ�D˜#ÔØ�‰8�q‹=Ü�- ˜u A¤c¨)£nÐ%5Ð6Õ7ð
8ô Ð
œc )›nÐ-¨TÐ2Õ3r   é$   c                 ó¶   — t         }| r$t        j                  «       t        | dz  ¬«      z
  nd }t	        d|› d�«       t        d||d|› �«      }t        |«       y )Né   ©Údaysu   ç­–ç•¥: å‰�u)   é¡µåˆ�å§‹å…¥åº“ (å…¨é‡�è¯·ç”¨ 'full all')r#   zFULL 1/)ÚDEFAULT_FULL_PAGESr   Únowr   r   r˜   rž   )Úmonths_backÚ
page_countr‘   r“   s       r   Ú	crawl_allr¨   ë   sW   € Ü#€JÙBMŒX�\‰\‹^œi¨[¸2Ñ-=Ô>Ò>ÐSW€FÜˆ+�j�\Ð!JÐKÔLÜ˜A˜z¨6°W¸Z¸LÐ3IÓJ€IÜ�YÕr   c                 ó¤   — | r$t        j                  «       t        | dz  ¬«      z
  nd }t        d«       t	        dt
        |d«      }t        |«       y )Nr¡   r¢   u#   å…¨é‡�æ¨¡å¼�: çˆ¬å�–æ‰€æœ‰é¡µé�¢...r#   zFULL ALL)r   r¥   r   r   r˜   ÚTOTAL_PAGESrž   )r¦   r‘   r“   s      r   Úcrawl_all_pagesr«   ó   sB   € ÙBMŒX�\‰\‹^œi¨[¸2Ñ-=Ô>Ò>ÐSW€FÜÐ-Ô.Ü˜Aœ{¨F°JÓ?€IÜ�YÕr   c                  ó4  — t        d«      } | sy t        | «      }t        dt        |«      › d�«       t	        |d«      D ]@  \  }}t        |d   |d   «      \  }}}}|r||d<   |r||d<   ||d<   ||d<   t        ||«       ŒB t        d	t        |«      › d�«       y )
Nr#   z[INCREMENTAL] page 1 -> rš   r1   r;   r@   rX   r�   u   [DONE] å¢žé‡�çˆ¬å�– )r4   rT   r   r{   r›   r‡   rœ   )rJ   rL   r�   r–   rX   r;   r   r�   s           r   Úcrawl_incrementalr­   ú   s¶   € Ü�a‹=€DÙØÜ�tÓ€EÜÐ
"¤3 u£: ,¨dÐ3Ô4Ü˜u aÓ(ò ‰	ˆˆTÜ0?ÀÀUÁÈTÐRYÉ]Ó0[Ñ-ˆ�˜ +ÙØ#ˆD�‰LÙØ!ˆD�‰MØ!ˆˆY‰Ø)ˆˆ]ÑÜ�D˜#Õðô Ð
œs 5›z˜l¨$Ð/Õ0r   c           	      ó$  — | j                  dd«      | j                  dd«      | j                  dd«      | j                  dd«      | j                  dg «      t        › dt        › �t        t        dœ}t	        t        j                  |d	¬
«      «       y )Nr;   r<   r1   r@   rX   r�   ú-)r;   Úpage_urlÚpublish_daterX   r�   Ú	site_nameÚcolumnÚprovinceF)Úensure_ascii)r,   ÚSITEÚCOLUMNÚPROVINCEÚprintÚjsonÚdumps)r–   r�   Úrecords      r   rœ   rœ     sx   € à—‘˜' 2Ó&Ø—H‘H˜U BÓ'ØŸ™ ¨Ó,Ø—8‘8˜I rÓ*Ø—x‘x ¨rÓ2Ü�v˜Qœv˜hÐ'ÜÜñ	€Fô 
Œ$�*‰*�V¨%Ô
0Õ1r   Ú__main__r#   ÚincrementalÚfullr$   r<   ÚallÚlistu   å…± rš   z  r@   z | r;   é2   r1   zUsage: z% [incremental|full [months|all]|list])rŸ   )1Ú__doc__r   ÚosrA   rº   r>   r   r   ÚrequestsÚbs4r   Úurllib.parser   r)   r*   r¶   r·   r¸   rª   r¤   ÚHEADERSÚSessionr+   ÚheadersÚupdaterw   r   r   r!   r4   rT   r‡   r˜   rž   r¨   r«   r­   rœ   Ú__name__r{   ÚargvÚmodeÚarg2ÚisdigitÚintÚmonthsrJ   rL   Úitr   r   r   ú<module>rÔ      sÕ  ðñ÷ × Ó ß (Û Ý Ý  à)€Ø9€	Ø!€Ø	)€Ø€Ø€ØÐ àÐWÐ
X€Ø
ˆ(×
Ñ
Ó
€Ø ‡�× Ñ �wÔ Ø	€ðG€ò
ò
2òò !òHV2òrò@4ó  ó ò1ò$2ð ˆzÒÙ˜cŸh™h›-¨!Ò+ˆ3�8‰8�AŠ;°€DØˆ}ÒÙÕØ	�ŠÙ! #§(¡(›m¨aÒ/ˆs�x‰x˜Š{°RˆØ�5Š=ÙÕá"&¨4¯<©<¬>‘S˜”Y¸rˆFÙ�fÕØ	�ŠÙ˜!‹}ˆÙ˜4Ó ˆÙˆd‘3�u“:�,˜dÐ#Ô$Ø˜˜�)ò 	FˆBÙ�"�R˜‘Z�L  B w¡K°°Ð$4Ð#5°S¸¸E¹¸ÐDÕEñ	Fñ 	ˆg�c—h‘h˜q‘k�]Ð"GÐHÕIð% r   