Ë
    V_Šjl)  ã                   óÎ   — 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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 è¿�å®‰å¸‚äººæ°‘æ”¿åºœ - é‡�ç‚¹å…¬å¼€ (qianan.gov.cn)
CMS: ç§¦çš‡å²›ç»Ÿä¸€å¹³å�° (same as qhd.gov.cn)
List: ul.info-list-xxgk.mt15 > li > a[href] + span.time (date)
Pagination: /channel/list/96.html (p1), /channel/list/96_2.html (p2-11), 20/page, 11 pages ~220 items
Detail: div.detail#zoom > p + table (direct children)
         Title: <h1> or <title>
         Date: "å�‘å¸ƒæ—¥æœŸï¼šYYYY-MM-DD" in text or meta
         Table support: extract <table> as HTML

Usage:
    python3 /root/gov_crawler/crawl_qianan_sthj.py [max_pages]
é    N)Údatetime)ÚBeautifulSoup)Úurljoinz/root/search.dbu"   è¿�å®‰å¸‚äººæ°‘æ”¿åºœ-é‡�ç‚¹å…¬å¼€u   é‡�ç‚¹å…¬å¼€u   æ²³åŒ—zhttp://www.qianan.gov.cné   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                 ó6   — | dk(  r	t         › d�S t         › d| › d�S )Né   z/channel/list/96.htmlz/channel/list/96_z.html)ÚBASE_URL)Úpage_nums    ú&/root/gov_crawler/crawl_qianan_zdgk.pyÚget_list_urlr   &   s+   € Ø�1‚}Ü�Ð0Ð1Ð1ÜˆZÐ(¨¨
°%Ð8Ð8ó    c                 ó’  — t        | «      }	 t        j                  |t        d¬«      }d|_        t        |j                  d«      }|j                  dd	¬
«      }|sg S g }|j                  d«      D ]›  }|j                  d«      }|j                  dd¬
«      }	|r|j                  d«      sŒ;|d   j                  «       }
|j                  d¬«      }t        ||
«      }|	r|	j                  d¬«      nd}|sŒ…|sŒˆ|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-8z  Error fetching ú: ©Úfileúhtml.parserÚulzinfo-list-xxgk)Úclass_ÚliÚaÚspanÚtimeÚhrefT©ÚstripÚ )r   ÚrequestsÚgetÚHEADERSÚencodingÚ	ExceptionÚprintÚsysÚstderrr   ÚtextÚfindÚfind_allr!   Úget_textr   Úappend)r   ÚurlÚrÚeÚsoupr   Úitemsr   r   r   r   ÚtitleÚpage_urlÚdate_strs                 r   Úextract_list_pager8   ,   s5  € Ü
�xÓ
 €CðÜ�L‰L˜¤g°rÔ:ˆØˆŒ
ô
 ˜Ÿ™ Ó/€DØ	�‰�4Ð 0ˆÓ	1€BÙØˆ	à€EØ�k‰k˜$Óò 6ˆØ�G‰G�C‹LˆØ�w‰w�v fˆwÓ-ˆÙ˜Ÿ™˜fœØà�‰y�‰Ó ˆØ—
‘
 �
Ó&ˆÜ˜3 Ó%ˆÙ04�4—=‘= t�=Ô,¸"ˆâ’XØ�L‰L˜% ¨8Ð4Õ5ð6ð €Løô1 ò ÜÐ! #  b¨¨Ð,´3·:±:Õ>Ø�	ûðús   �#D Ä	EÄ"EÄ;EÅEc                 ó
  — 	 t        j                  | t        d¬«      }d|_        t        |j                  d«      }d}|j                  d	«      }|r|j                  d
¬«      }|sr|j                  d«      }|r_|j                  d
¬«      j                  dd«      j                  dd«      j                  dd«      j                  «       j                  d«      }d}|j                  g d¢«      D ]H  }|j                  d
¬«      }	d|	v sd|	v sŒt!        j"                  d|	«      }
|
sŒ7|
j%                  d«      } n |sv|j                  ddt!        j&                  dt         j(                  «      i¬«      }|r=|j                  d«      r,t!        j"                  d|d   «      }
|
r|
j%                  d«      }|j                  ddd¬«      }|s|j                  dd¬«      }d}|�r|j                  d d!g«      D ]  }|j+                  «        Œ g }|j,                  D �]Ì  }|j.                  sŒ|j.                  d"k(  r|j1                  t3        |«      «       Œ;|j.                  d#k(  rº|j                  dd#gd$¬%«      r}|j                  d#d"gd
¬%«      D ]d  }|j.                  d"k(  r|j1                  t3        |«      «       Œ-|j5                  d"«      rŒ?|j                  d
¬«      }|sŒT|j1                  |«       Œf ŒÜ|j                  d
¬«      }|sŒñ|j1                  |«       �Œ|j.                  dk(  r“|j                  d#d"gd$¬%«      r~|j                  d#d"gd
¬%«      D ]d  }|j.                  d"k(  r|j1                  t3        |«      «       Œ-|j5                  d"«      rŒ?|j                  d
¬«      }|sŒT|j1                  |«       Œf �Œ¦|j                  d
¬«      }|s�Œ¼|j1                  |«       �ŒÏ d&j7                  |«      }g }t9        «       }|j                  d'd
¬(«      D ]¬  }|d)   }t!        j"                  d*|t         j(                  «      sŒ.t;        | |«      }|j                  d
¬«      xs& |j=                  d+«      d,   j=                  d-«      d.   }||vsŒy|j?                  |«       |j1                  ||d/œ«       |sŒ¡|d0|› d1|› d2�z  }Œ® ||||fS # t        $ r1}t        d| › d|› �t        j                  ¬«       d d d g fcY d }~S d }~ww xY w)3Nr   r   r   z  fetch_detail error r   r   r   r"   Úh1Tr    r5   u   è¿�å®‰å¸‚äººæ°‘æ”¿åºœu   - è¿�å®‰å¸‚äººæ°‘æ”¿åºœu    - è¿�å®‰å¸‚äººæ°‘æ”¿åºœz_- )r   ÚdivÚpu   å�‘å¸ƒæ—¥æœŸu   å�‘å¸ƒæ—¶é—´z(\d{4}-\d{2}-\d{2})r	   ÚmetaÚnamez(pubdate|PubDate|publishdate))ÚattrsÚcontentr;   ÚdetailÚzoom)r   Úid)rC   ÚscriptÚstyleÚtabler<   F)Ú	recursivez

r   )r   r   z&\.(pdf|doc|docx|xls|xlsx|rar|zip|txt)$ú/éÿÿÿÿú?r   )r>   r0   u   

é™„ä»¶ï¼š<p><a href="z">z</a></p>) r#   r$   r%   r&   r'   r(   r)   r*   r   r+   r,   r.   Úreplacer!   Úrstripr-   ÚreÚsearchÚgroupÚcompileÚIÚ	decomposeÚchildrenr>   r/   ÚstrÚfind_parentÚjoinÚsetr   ÚsplitÚadd)r0   r1   r2   r3   r5   r:   Útr7   ÚtagÚtxtÚmr=   rA   r@   ÚsÚpartsÚchildÚinnerÚattachmentsÚseenÚa_tagr   Úfull_urlr>   s                           r   Úfetch_detailrf   N   s¶  € ð$Ü�L‰L˜¤g°rÔ:ˆØˆŒ
ô
 ˜Ÿ™ Ó/€Dð €EØ	�‰�4‹€BÙ	Ø—‘ $�Ó'ˆÙØ�I‰I�gÓˆÙØ—J‘J T�JÓ*×2Ñ2Ð3JÈBÓO×WÑWÐXqÐsuÓv×~Ñ~ð  @Zð  \^ó  _÷  eñ  eó  g÷  nñ  nð  otó  uˆEð €HØ�}‰}Ò1Ó2ò ˆØ�l‰l ˆlÓ&ˆØ˜SÑ  N°cÒ$9Ü—	‘	Ð0°#Ó6ˆAÚØŸ7™7 1›:�Ùðñ Ø�y‰y˜¨´·
±
Ð;[Ô]_×]aÑ]aÓ0bÐ'cˆyÓdˆÙ�D—H‘H˜YÔ'Ü—	‘	Ð0°$°y±/ÓBˆAÙØŸ7™7 1›:�ð �Y‰Y�u X°&ˆYÓ9€FÙØ—‘˜5 V�Ó,ˆà€GÚØ—‘ (¨GÐ!4Ó5ò 	ˆAØ�K‰K�Mð	àˆà—_‘_ó 	$ˆEØ—:’:ØØ�z‰z˜WÒ$Ø—‘œS ›ZÕ(Ø—‘˜sÒ"Ø—:‘:˜u c˜l°e�:Ô<à!&§¡°°g°È$ Ó!Oò 0˜Ø Ÿ:™:¨Ò0Ø!ŸL™L¬¨U«Õ4Ø!&×!2Ñ!2°7Õ!;Ø %§¡°T Ó :˜AÚ Ø %§¡¨Q¥ñ0ð Ÿ™¨T˜Ó2�AÚØŸ™ QžØ—‘˜uÒ$¨¯©°S¸'°NÈe¨Ô)TØ"Ÿ^™^¨S°'¨NÀd˜^ÓKò ,�EØ—z‘z WÒ,ØŸ™¤S¨£ZÕ0Ø"×.Ñ.¨wÕ7Ø!ŸN™N°˜NÓ6˜ÚØ!ŸL™L¨�Oò,ð —N‘N¨�NÓ.�ÛØ—L‘L –Oð=	$ð> —+‘+˜eÓ$ˆð €KÜ‹5€DØ—‘˜s¨�Ó.ò 	VˆØ�V‰}ˆÜ�9‰9Ð>ÀÄbÇdÁdÕKÜ˜s DÓ)ˆHØ—>‘>¨�>Ó-ÒR°·±¸C³ÀÑ1D×1JÑ1JÈ3Ó1OÐPQÑ1RˆDØ˜tÒ#Ø—‘˜Ô"Ø×"Ñ"¨D¸Ñ#BÔCÚØÐ!:¸8¸*ÀBÀtÀfÈHÐUÑU‘Gð	Vð �(˜G [Ð0Ð0øôu ò $ÜÐ% c U¨"¨Q¨CÐ0´s·z±zÕBØ�T˜4 Ð#Õ#ûð$ús   ‚#S Ó	TÓ&S<Ó6TÓ<T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 rH   z), retry in zs...r   z	 failed: F)	ÚrangeÚsqlite3ÚOperationalErrorrT   r(   r)   r*   r   Úsleep)ÚfnÚdescÚmax_attemptsÚdelayÚattemptr2   s         r   Ú
with_retryrr   ±   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)rj   ÚconnectÚDB_PATHÚexecute)Úconns    r   Úinit_dbry   ¿   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  rO| j                  d	|f«      j                  «       }	|	r+| j                  d
|	d   |j                  «       t        |f«       yy# t        $ r(}
t        d|
› �t        j                  ¬«       Y d }
~
yd }
~
ww xY w)NéÈ   z\s+ú 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   ú)SELECT id FROM gov_raw WHERE page_url = ?zTINSERT OR IGNORE INTO gov_search (rowid, title, site_name, summary) VALUES (?,?,?,?)Tz  DB error: r   )rM   Úsubr!   ÚjsonÚdumpsrw   Ú	SITE_NAMEÚCATEGORYÚGROUPÚrowcountÚfetchoner'   r(   r)   r*   )rx   r5   r6   Úpublish_dater@   rb   ÚsummaryÚatt_jsonÚcurÚridr2   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ð:ó	
ˆð �<‰<˜!Òà—,‘,ÐJÈXÈKÓX×aÑaÓcˆCÙØ—‘ØjØ˜‘V˜UŸ[™[›]¬I°wÐ?ôð ØøÜò Ü�˜Q˜CÐ ¤s§z¡zÕ2Üûðús   ÁBC  Ã 	DÃ)DÄDc                  ó¸  — d} t        t        j                  «      dkD  rØt        t        j                  «      D ]|  \  }}|j	                  d«      r 	 t        |j                  dd«      d   «      } Œ7|dk(  sŒ=|dz   t        t        j                  «      k  sŒ]	 t        t        j                  |dz      «      } Œ~ t        d„ t        j                  dd  D «       «      s	 t        t        j                  d   «      } t        dt        › d| › �t        j                  ¬	«       t        «       }d
}d
}t        j                  «       }t        d| dz   «      D �]H  }t        |«      }|s"t        d|› d�t        j                  ¬	«        �n|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
  «      }t        d|› d| › d|	› d|› d|› d|dz  › d|dz  d›�t        j                  ¬	«       |dz  d
k(  s�Œ9|j+                  «        �ŒK |j+                  «        t        t        j                  «       |z
  «      }|j-                  «        t        d|› �d¬«       t        d||z
  › �d¬«       t        d|› d|› d |dz  › d!|dz  d›d"�	t        j                  ¬	«       y # t        $ r Y �Œ w xY w# t        $ r Y �Œw xY w# t        $ r Y �Œaw xY w)#Nr   r	   z--pages=ú=z--pagesc              3   ó>   K  — | ]  }|j                  d «      –— Œ y­w)z--N)Ú
startswith)Ú.0r   s     r   ú	<genexpr>zmain.<locals>.<genexpr>ó   s   è ø€ Ò<¨!�1—<‘< ×%Ñ<ùs   ‚z	Scraping z, max pages: r   r   z  Page z: 0 items (end)z
2015-01-01r~   ú[z](ú)g333333Ó?rH   z: +z new, z total, é<   ú:Ú02du   æ–°å¢ž: T)Úflushu   è·³è¿‡: zDone! Found: z, New: z, Time: r]   r^   )Úlenr)   ÚargvÚ	enumerater�   ÚintrX   Ú
ValueErrorÚanyr(   r‚   r*   ry   r   ri   r8   rw   r†   rf   rŒ   rl   ÚcommitÚclose)Ú	max_pagesÚir   rx   Ú	total_newÚtotal_foundÚ
start_timeÚpnÚarticlesÚ	batch_newr5   r6   ÚdaterŠ   Ú	det_titleÚdet_dateÚdet_contentÚdet_attsÚfinal_titleÚ
final_dateÚfinal_contentÚ
final_attsÚelapseds                          r   Úmainr³   ã   s`  € à€IÜ
Œ3�8‰8ƒ}�qÒÜœcŸh™hÓ'ò 
	‰DˆAˆqØ�|‰|˜JÔ'ðÜ # A§G¡G¨C°£O°AÑ$6Ó 7‘Ið �i“ A¨¡E¬C´·±«MÓ$9ðÜ #¤C§H¡H¨Q°©U¡OÓ 4‘Ið
	ô Ñ<¬s¯x©x¸¸¨|Ô<Ô<ðÜ¤§¡¨¡Ó,�	ô 
ˆI”i�[ ¨i¨[Ð
9ÄÇ
Á
ÕKÜ‹9€DØ€IØ€KÜ—‘“€Jä�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Ñ.Ó/ˆÜ�˜�t˜1˜Y˜K s¨9¨+°V¸I¸;ÀaÈÀ}ÐT\Ð]dÐfhÑ]hÐ\iÐijÐkrÐsuÑkuÐvyÐjzÐ{ô  CF÷  CMñ  CMõ  	Nà�‰6�QŒ;Ø�K‰KŽMðC!ðF 	‡K�K„MÜ”$—)‘)“+ 
Ñ*Ó+€GØ‡J�J„Lä	ˆH�Y�KÐ
 ¨Õ-Ü	ˆH�[ 9Ñ,Ð-Ð
.°dÕ;Ü	ˆM˜+˜ g¨i¨[¸ÀÈ"ÁÀÈQÈwÐWYÉzÐZ]ÐN^Ð^_Ð
`Ôgj×gqÑgqÖrøô{ "ò Úðûô
 "ò Úðûô ò Úðús6   ÁL,ÂL<ÃM Ì,	L9Ì8L9Ì<	M	ÍM	Í	MÍMÚ__main__)zDB opé
   r   )Ú__doc__r#   rM   r€   rj   r   Úosr)   r   Úbs4r   Úurllib.parser   rv   r‚   rƒ   r„   r
   ÚTOTAL_PAGESr%   r   r8   rf   rr   ry   rŒ   r³   Ú__name__© r   r   ú<module>r½      s�   ðñ÷ 2× 1× 1Ó 1Ý Ý Ý  à
€Ø0€	Ø€Ø€Ø%€Ø€ð DØOØ0ñ€ò9òòD^1óFòòò:EsðP ˆzÒÙ…Fð r   