Ë
    €Ûµju&  ã                   óÒ   — 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ddlZddlm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ddœZd„ Zd„ Zd„ Zdd„Zd„ Zd„ Zd„ Zedk(  r e«        yy)uË  
Crawler for å²‘å·©åŽ¿äººæ°‘æ”¿åºœ - é€šçŸ¥å…¬å‘Š (qdncg.gov.cn)
CMS: TRS/UEDITOR
List: ul.NewsList > li > span(date) + a[href]
Pagination: index.html (p1), index_1.html (p2), ... index_88.html (p89), 15/page ~1332 items
Detail: div.ArticleTitle (title), div.trs_editor_view (content)
         Date from JS: var pubdata='YYYY-MM-DD HH:MM:SS'
         Attachments: a[appendix=true] or a[href*=./P0...]

Usage:
    python3 /root/gov_crawler/crawl_qdncg_tzgg.py
é    N)Údatetime)ÚBeautifulSoup)Úurljoinz/root/search.dbu   å²‘å·©åŽ¿-é€šçŸ¥å…¬å‘Šu   é€šçŸ¥å…¬å‘Šu   è´µå·žzhttp://www.qdncg.gov.cnz
/xwzx/tzggéY   zoMozilla/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,en;q=0.8)z
User-AgentÚAcceptzAccept-Languagec                 óT   — | dk(  rt         › t        › d�S t         › t        › d| dz
  › d�S )zpage_num is 1-indexedé   ú/z/index_ú.html)ÚBASE_URLÚLIST_DIR)Úpage_nums    ú%/root/gov_crawler/crawl_qdncg_tzgg.pyÚget_list_urlr   &   s5   € à�1‚}Ü�œH˜: QÐ'Ð'ÜˆZœ�z ¨°!©¨°EÐ:Ð:ó    c                 ó®  — t        | «      }	 t        j                  |t        d¬«      }d|_        t        |j                  d«      }g }|j                  dd	¬
«      D ]¾  }|d   }d|v sŒ|j                  d«      sŒd|v sŒ$t        ||«      }|j                  dd«      j                  «       xs |j                  d	¬«      }	|	sŒgd}
|j                   }|r4|j"                  dk(  r%|j%                  d«      }|r|j                  d	¬«      }
|j'                  |	||
f«       ŒÀ |S # t        $ r-}t        d|› d|› �t        j                  ¬«       g cY d }~S d }~ww xY w)Né   ©ÚheadersÚtimeoutúutf-8úhtml.parserz  Error fetching ú: ©ÚfileÚaT©Úhrefr   Útzggr   z/t20ÚtitleÚ ©ÚstripÚliÚspan)r   ÚrequestsÚgetÚHEADERSÚencodingr   ÚtextÚ	ExceptionÚprintÚsysÚstderrÚfind_allÚendswithr   r#   Úget_textÚparentÚnameÚfindÚappend)r   ÚurlÚrÚsoupÚeÚitemsr   r   Úpage_urlr    Údate_strÚ	parent_lir%   s                r   Úextract_list_pager>   -   sC  € Ü
�xÓ
 €CðÜ�L‰L˜¤g°rÔ:ˆØˆŒ
Ü˜QŸV™V ]Ó3ˆð
 €Eà�]‰]˜3 Tˆ]Ó*ò 6ˆØ�‰yˆà�TŠ>˜dŸm™m¨GÕ4¸À4ºÜ˜s DÓ)ˆHØ—E‘E˜' 2Ó&×,Ñ,Ó.ÒH°!·*±*À4°*Ó2HˆEÙØàˆHØŸ™ˆIÙ˜YŸ^™^¨tÒ3Ø —~‘~ fÓ-�ÙØ#Ÿ}™}°4˜}Ó8�HØ�L‰L˜% ¨8Ð4Õ5ð6ð" €Løô/ ò ÜÐ! #  b¨¨Ð,´3·:±:Õ>Ø�	ûðús   �9D Ä	EÄ'"EÅ	EÅEc                 óz  — 	 t        j                  | t        d¬«      }d|_        t        |j                  d«      }d}|j                  d	d
¬«      }|r|j                  d¬«      }|sE|j                  d«      }|r2|j                  d¬«      j                  d«      d   j                  «       }d}t        j                  d|j                  «      }|r|j!                  d«      d d }|j                  d	d¬«      }	|	sc|j                  dd¬«      }
|
rN|
j                  d	t        j"                  dt        j$                  «      ¬«      }	|	s|
j                  d	d¬«      }	|	s|
}	|	s|j                  d	d¬«      }	d}|	�rK|	j'                  ddg«      D ]  }|j)                  «        Œ g }t+        |	j,                  «      D ]ø  }|j.                  €$|j                  «       }|r|j1                  |«       Œ3|j.                  j3                  «       }|dk(  r,|j                  d¬«      }|sŒg|dvsŒl|j1                  |«       Œ~|dk(  r|j1                  t5        |«      «       Œž|d v sŒ£|j                  dd¬«      }|r|j1                  t5        |«      «       ŒÓ|j                  d¬«      }|sŒè|j1                  |«       Œú d!j7                  |«      }t        j8                  d"d|«      j                  «       }t        j8                  d#d!|«      j                  «       }g }t;        «       }|j'                  d$d¬%«      D ]Î  }|d&   }|j                  d'«      d(k(  xs> t        j                  d)|t        j$                  «      xs |j=                  d*«      xs d+|v }|sŒ_t?        | |«      }|j                  d¬«      xs& |j                  d,«      d-   j                  d.«      d   }||vsŒª|jA                  |«       |j1                  ||d/œ«       ŒÐ ||||fS # t        $ r1}t        d| › d|› �t        j                  ¬«       d d d g fcY d }~S d }~ww xY w)0Nr   r   r   z  fetch_detail error r   r   r   r!   ÚdivÚArticleTitle)Úclass_Tr"   r    ú-r   z'var\s+pubdata\s*=\s*['\"]([^'\"]+)['\"]r	   é
   Útrs_editor_viewÚfontÚZoom)ÚidF)Ú	recursiveÚArticle_ConÚscriptÚstyleÚp)ú õ   Â z&nbsp;Útable)r@   Úsectionz

u$   æ‰«ä¸€æ‰«åœ¨æ‰‹æœºæ‰“å¼€å½“å‰�é¡µé�¢z\n{3,}r   r   r   ÚappendixÚtruez&\.(pdf|doc|docx|xls|xlsx|rar|zip|txt)$z./P0z/P0r
   éÿÿÿÿú?)r3   r6   )!r&   r'   r(   r)   r+   r,   r-   r.   r   r*   r4   r1   Úsplitr#   ÚreÚsearchÚgroupÚcompileÚIr/   Ú	decomposeÚlistÚchildrenr3   r5   ÚlowerÚstrÚjoinÚsubÚsetÚ
startswithr   Úadd)r6   r7   r9   r8   r    Útit_divÚtr<   ÚmÚeditorÚzoomÚcontentÚsÚpartsÚelÚtxtÚtagÚtblÚattachmentsÚseenÚa_tagr   Úis_attachmentÚfull_urlr3   s                            r   Úfetch_detailrw   O   së  € ð$Ü�L‰L˜¤g°rÔ:ˆØˆŒ
ô
 ˜Ÿ™ Ó/€Dð €EØ�i‰i˜ nˆiÓ5€GÙØ× Ñ  tÐ Ó,ˆÙØ�I‰I�gÓˆÙØ—J‘J T�JÓ*×0Ñ0°Ó5°aÑ8×>Ñ>Ó@ˆEð €Hä
�	‰	Ð<¸a¿f¹fÓE€AÙØ—7‘7˜1“:˜c˜r�?ˆð �Y‰Y�uÐ%6ˆYÓ7€FÙØ�y‰y˜ FˆyÓ+ˆÙà—Y‘Y˜u¬R¯Z©ZÐ8JÌBÏDÉDÓ-Q�YÓRˆFÙØŸ™ 5°E˜Ó:�ÙØ�ÙØ—‘˜5¨�Ó7ˆØ€GÚØ—‘ (¨GÐ!4Ó5ò 	ˆAØ�K‰K�Mð	àˆä�v—‘Ó'ò 	*ˆBØ�w‰wˆØ—h‘h“j�ÙØ—L‘L Ô%ØØ—'‘'—-‘-“/ˆCØ�cŠzØ—K‘K d�KÓ+�Ú˜Ð"7Ò7Ø—L‘L •OØ˜’Ø—‘œS ›WÕ%ØÐ*Ò*à—g‘g˜g°�gÓ7�ÙØ—L‘L¤ S£Õ*ð Ÿ+™+¨D˜+Ó1�CÚØŸ™ SÕ)ð-	*ð. —+‘+˜eÓ$ˆä�f‰fÐ<¸bÀ'ÓJ×PÑPÓR€GÜ�f‰f�Y ¨Ó0×6Ñ6Ó8€Gð €KÜ‹5€DØ—‘˜s¨�Ó.ò DˆØ�V‰}ˆð �I‰I�jÓ! VÑ+ò Ü�I‰IÐ?ÀÄrÇtÁtÓLòà�O‰O˜FÓ#òð �TˆMð	 	ò Ü˜s DÓ)ˆHØ—>‘>¨�>Ó-ÒR°·±¸C³ÀÑ1D×1JÑ1JÈ3Ó1OÐPQÑ1RˆDØ˜tÒ#Ø—‘˜Ô"Ø×"Ñ"¨D¸Ñ#BÕCðDð  �(˜G [Ð0Ð0øôs ò $ÜÐ% c U¨"¨Q¨CÐ0´s·z±zÕBØ�T˜4 Ð#Õ#ûð$ús   ‚#P  Ð 	P:Ð	&P5Ð/P:Ð5P:c                 ól  — t        d|dz   «      D ]  }	  | «       c S  y
# t        j                  $ r�}dt        |«      v rC||k  r>t	        d|› d|› d|› d|› d�	t
        j                  ¬«       t        j                  |«       n't	        d|› d	|› �t
        j                  ¬«       Y d }~ y
Y d }~Œžd }~ww xY w)Nr	   Úlockedz  z: locked (attempt r
   z), retry in zs...r   z	 failed: F)	ÚrangeÚsqlite3ÚOperationalErrorr`   r,   r-   r.   ÚtimeÚsleep)ÚfnÚdescÚmax_attemptsÚdelayÚattemptr9   s         r   Ú
with_retryr„   ±   s¸   € Ü˜˜L¨1Ñ,Ó-ò 	ˆð	Ù“4ŠKð	ð øô ×'Ñ'ò 	Øœ3˜q›6Ñ! g°Ò&<Ü˜˜4˜&Ð 2°7°)¸1¸\¸NÈ,ÐW\ÐV]Ð]aÐbÔil×isÑisÕtÜ—
‘
˜5Õ!ä˜˜4˜& 	¨!¨Ð-´C·J±JÕ?Ýô "ûð	ús   ”ŸB3²A1B.Â.B3c                  ó€   — t        j                  t        d¬«      } | j                  d«       | j                  d«       | S )Né   )r   zPRAGMA journal_mode=WALzPRAGMA busy_timeout=30000)r{   ÚconnectÚDB_PATHÚexecute©Úconns    r   Úinit_dbrŒ   ¿   s1   € Ü�?‰?œ7¨BÔ/€DØ‡L�LÐ*Ô+Ø‡L�LÐ,Ô-Ø€Kr   c                 óˆ  — |r|d d n|}t        j                  dd|«      j                  «       }|rt        j                  |d¬«      nd}	 | j                  dt        |||j                  «       |||t        |t        f
«      }|j                  dkD  S # t        $ r(}	t        d	|	› �t        j                  ¬
«       Y d }	~	yd }	~	ww xY w)NéÈ   z\s+rN   F)Úensure_asciiz[]zÍINSERT OR IGNORE INTO gov_raw
               (site_name, source_url, page_url, title, publish_date, summary, content, category, attachments, group_name)
               VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)r   z  DB error: r   )rW   rb   r#   ÚjsonÚdumpsr‰   Ú	SITE_NAMEÚCATEGORYÚGROUPÚrowcountr+   r,   r-   r.   )
r‹   r    r;   Úpublish_daterk   rr   ÚsummaryÚatt_jsonÚcurr9   s
             r   Úsave_articlerš   Æ   s´   € Ù&ˆg�d�s‰m¨E€GÜ�f‰f�V˜S 'Ó*×0Ñ0Ó2€GÙ>IŒt�z‰z˜+°EÕ:Èt€HðØ�l‰lð8ô ˜ (¨E¯K©K«M¸<Ø�gœx¨´5ð:ó	
ˆð �|‰|˜aÑÐøÜò Ü�˜Q˜CÐ ¤s§z¡zÕ2Üûðús   ÁAB Â	CÂB<Â<Cc                  óÜ  ‡— t         } t        t        j                  «      dkD  r	 t	        t        j                  d   «      } t        dt        › d| › �t        j                  ¬«       t        «       Šd}d}t        j                  «       }ˆfd„}t        dt        j                  ¬«       t        |dt        › �¬	«       t        d
t        › �t        j                  ¬«       t        d| dz   «      D �]…  }t        |«      }|s"t        d|› d�t        j                  ¬«        �nV|t        |«      z  }d}|D ]�  \  }}	}
|
r|
dk  rŒ‰j                  d|	f«      }|j                  «       rŒ3t        |	«      \  }}}}|xs |}|xs |
}|xs	 d|› d|	› d�}|xs g }t!        ‰||	|||«      r
|dz  }|dz  }t        j"                  d«       Œ’ t	        t        j                  «       |z
  «      }| |z
  }|dkD  r-|dkD  r(t	        |t%        d|t%        d|«      z  «      z  dz  «      nd}t        d|› d| › d|› d|› d|› d|dz  › d|dz  d›d|› d�t        j                  ¬«       |dz  dk(  s�Œv‰j'                  «        �Œˆ ‰j'                  «        t	        t        j                  «       |z
  «      }‰j)                  «        t        d|› d|› d|dz  › d |dz  d›d!�	t        j                  ¬«       y #  Y �ŒªxY w)"Nr	   z	Scraping z, max pages: r   r   c                  ó&   •— ‰ j                  «        y )N)ÚcommitrŠ   s   €r   Údo_cleanzmain.<locals>.do_cleanè   s   ø€ à�‰�r   z  Cleaning old data...zClean )r€   z  Cleaned old data for z  Page z: 0 items (end)z
2005-01-01z)SELECT id FROM gov_raw WHERE page_url = ?ú[z](ú)g333333Ó?é<   r
   z: +z new, z total, ú:Ú02dz elapsed, ETA ÚminrD   z
Done! Found: z, New: z, Time: rh   rl   )ÚTOTAL_PAGESÚlenr-   ÚargvÚintr,   r’   r.   rŒ   r}   r„   rz   r>   r‰   Úfetchonerw   rš   r~   Úmaxr�   Úclose)Ú	max_pagesÚ	total_newÚtotal_foundÚ
start_timerž   ÚpnÚarticlesÚ	batch_newr    r;   Údater™   Ú	det_titleÚdet_dateÚdet_contentÚdet_attsÚfinal_titleÚ
final_dateÚfinal_contentÚ
final_attsÚelapsedÚ
pages_leftÚetar‹   s                          @r   Úmainr¿   Ú   sí  ø€ Ü€IÜ
Œ3�8‰8ƒ}�qÒð	ÜœCŸH™H Q™KÓ(ˆIô 
ˆI”i�[ ¨i¨[Ð
9ÄÇ
Á
ÕKÜ‹9€DØ€IØ€KÜ—‘“€Jôô 
Ð
"¬¯©Õ4Üˆx ¤y kÐ2Õ3Ü	Ð#¤I ;Ð
/´c·j±jÕAä�A�y 1‘}Ó%ó 'ˆÜ$ RÓ(ˆÙÜ�G˜B˜4˜Ð/´c·j±jÕAÚà”s˜8“}Ñ$ˆØˆ	à%-ò 	Ñ!ˆE�8˜TÙ˜˜|Ò+Øà—,‘,ÐJÈXÈKÓXˆCØ�|‰|Œ~Øä9EÀhÓ9OÑ6ˆI�x ¨hØ#Ò, uˆKØ!Ò) TˆJØ'ÒI¨Q¨{¨m¸2¸h¸ZÀqÐ+IˆMØ!š RˆJä˜D +¨x¸À]ÐT^Ô_Ø˜Q‘�	Ø˜Q‘�	ä�J‰J�s�Oð%	ô( ”d—i‘i“k JÑ.Ó/ˆØ ‘^ˆ
ØELÈqÂ[ÐUWÐZ[ÒU[Œc�*œs 1 b¬3¨q°'«?Ñ&:Ó;Ñ;¸bÑ@ÔAÐabˆä�˜�t˜1˜Y˜K s¨9¨+°VØ�˜1˜[˜M¨Ø˜"‘�˜Q˜w r™z¨#Ð.ð /Ø�E˜ðô %(§J¡Jõ	0ð
 �‰7�aŒ<Ø�K‰KŽMðO'ðR 	‡K�K„MÜ”$—)‘)“+ 
Ñ*Ó+€GØ‡J�J„LÜ	ˆO˜K˜=¨°	¨{¸(À7ÈBÁ;À-ÈqÐQXÐY[ÑQ[Ð\_ÐP`Ð`aÐ
bÔil×isÑisÖtøðy	Úús   ¥K& Ë&K+Ú__main__)zDB oprD   é   )Ú__doc__r&   rW   r�   r{   r}   Úosr-   r   Úbs4r   Úurllib.parser   rˆ   r’   r“   r”   r   r   r¥   r(   r   r>   rw   r„   rŒ   rš   r¿   Ú__name__© r   r   ú<module>rÈ      s”   ðñ÷ 2× 1× 1Ó 1Ý Ý Ý  à
€Ø$€	Ø€Ø€Ø$€Ø€Ø€ð DØOØ0ñ€ò;òòD]1óDòòò(AuðH ˆzÒÙ…Fð r   