Ë
    €Ûµ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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e› 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 ç§¦çš‡å²›å¸‚æ”¿åºœä¿¡æ�¯å…¬å¼€å¹³å�° - å¸‚æ•°æ�®å’Œæ”¿åŠ¡æœ�åŠ¡å±€ä¸“ç‰ˆ / å…¬å‘Šå…¬ç¤º
List: info/bmzb.jsp?pages=N&orgid=238&code=293, 20/page, 11 pages ~210 items
Detail: /article/293/XXXXXX.html (same as main qhd crawler)

Usage:
    python3 /root/gov_crawler/crawl_qhd_gggs_bureau.py
é    N)Údatetime)ÚBeautifulSoup)Úurljoinz/root/search.dbu"   ç§¦çš‡å²›å¸‚-æ•°æ�®å±€å…¬å‘Šå…¬ç¤ºu   å…¬å‘Šå…¬ç¤ºu   æ²³åŒ—zhttp://www.qhd.gov.cnz/info/bmzb.jspé   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| › d�S )Nz?pages=z&orgid=238&code=293)ÚLIST_URL)Úpage_nums    ú*/root/gov_crawler/crawl_qhd_gggs_bureau.pyÚget_list_urlr   "   s   € ÜˆZ�w˜x˜jÐ(;Ð<Ð<ó    c                 óÖ  — t        | «      }	 t        j                  |t        d¬«      }d|_        t        |j                  d«      }|j                  dd	¬
«      }|sg S g }|j                  d«      D ]½  }|j                  d«      }|r|j                  d«      sŒ(|d   j                  «       }	t        ||	«      }
|j                  dd«      j                  «       xs |j                  d¬«      }|j                  dd¬
«      }|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ÚhrefÚtitleÚ T©ÚstripÚspanÚtime)r   ÚrequestsÚgetÚHEADERSÚencodingÚ	ExceptionÚprintÚsysÚstderrr   ÚtextÚfindÚfind_allr!   r   Úget_textÚappend)r
   ÚurlÚrÚeÚsoupr   Úitemsr   r   r   Úpage_urlr   r"   Údate_strs                 r   Úextract_list_pager8   &   sN  € Ü
�xÓ
 €CðÜ�L‰L˜¤g°rÔ:ˆØˆŒ
ô
 ˜Ÿ™ Ó/€DØ	�‰�4Ð 0ˆÓ	1€BÙØˆ	à€EØ�k‰k˜$Óò 6ˆØ�G‰G�C‹LˆÙ˜Ÿ™˜fœØà�‰y�‰Ó ˆÜ˜3 Ó%ˆØ—‘�g˜rÓ"×(Ñ(Ó*ÒD¨a¯j©j¸t¨jÓ.Dˆà�w‰w�v fˆwÓ-ˆÙ04�4—=‘= t�=Ô,¸"ˆâ’XØ�L‰L˜% ¨8Ð4Õ5ð6ð €Løô3 ò ÜÐ! #  b¨¨Ð,´3·:±:Õ>Ø�	ûðús   �#D2 Ä2	E(Ä;"E#ÅE(Å#E(c                 ó¢  — 	 t        j                  | t        d¬«      }d|_        t        |j                  d«      }d}|j                  d	«      }|r|j                  d
¬«      }|sC|j                  d«      }|r0|j                  d
¬«      j                  dd«      j                  «       }d}|j                  dd¬«      }|r;|j                  d
¬«      }	t        j                   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|j-                  t/        |«      «       Œ;|j*                  dk(  rº|j                  g d¢d¬«      r}|j%                  ddgd
¬«      D ]d  }|j*                  dk(  r|j-                  t/        |«      «       Œ-|j1                  d«      rŒ?|j                  d
¬«      }|sŒT|j-                  |«       Œf ŒÜ|j                  d
¬«      }|sŒñ|j-                  |«       �Œ|j*                  dk(  s�Œ|j                  ddgd¬«      r~|j%                  ddgd
¬«      D ]d  }|j*                  dk(  r|j-                  t/        |«      «       Œ-|j1                  d«      rŒ?|j                  d
¬«      }|sŒT|j-                  |«       Œf �Œ¨|j                  d
¬«      }|s�Œ¾|j-                  |«       �ŒÑ dj3                  |«      }g }t5        «       }|j%                  dd
¬ «      D ]¬  }|d!   }t        j                   d"|t        j6                  «      sŒ.t9        | |«      }|j                  d
¬«      xs& |j;                  d#«      d$   j;                  d%«      d&   }||vsŒy|j=                  |«       |j-                  ||d'œ«       |sŒ¡|d(|› d)|› d*�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)+Nr   r   r   z  fetch_detail error r   r   r   r   zdiv.top-info h1Tr    r   u7   -ç§¦çš‡å²›å¸‚æ”¿åºœä¿¡æ�¯å…¬å¼€å¹³å�°å†…å®¹ç®¡ç�†ç³»ç»ŸÚpÚinfor   z(\d{4}-\d{2}-\d{2})é   Údivzdetail-2Úcontent)r   Úid)r?   ÚscriptÚstyleÚtable)r=   r:   rB   F)Ú	recursivez

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

é™„ä»¶ï¼š<p><a href="z">z</a></p>)r$   r%   r&   r'   r(   r)   r*   r+   r   r,   Ú
select_oner/   r-   Úreplacer!   ÚreÚsearchÚgroupr.   Ú	decomposeÚchildrenrG   r0   ÚstrÚfind_parentÚjoinÚsetÚIr   ÚsplitÚadd)r1   r2   r3   r4   r   Úh1Útr7   r;   ÚtxtÚmÚcontent_divr>   ÚsÚpartsÚchildÚinnerÚattachmentsÚseenÚa_tagr   Úfull_urlrG   s                          r   Úfetch_detailrc   I   sù  € ð$Ü�L‰L˜¤g°rÔ:ˆØˆŒ
ô
 ˜Ÿ™ Ó/€Dð €EØ	�‰Ð*Ó	+€BÙ	Ø—‘ $�Ó'ˆÙØ�I‰I�gÓˆÙØ—J‘J T�JÓ*×2Ñ2Ð3lÐnpÓq×wÑwÓyˆEð €HØ�9‰9�S ˆ9Ó(€DÙØ�m‰m $ˆmÓ'ˆÜ�I‰IÐ,¨cÓ2ˆÙØ—w‘w˜q“zˆHð —)‘)˜E¨*¸�)ÓC€KÙØ—i‘i ¨)�iÓ4ˆà€GÚØ×%Ñ% x°Ð&9Ó:ò 	ˆAØ�K‰K�Mð	àˆà ×)Ñ)ó 	(ˆEØ—:’:ØØ�z‰z˜WÒ$Ø—‘œS ›ZÕ(Ø—‘˜sÒ"à—:‘:Ò3¸u�:ÔEØ!&§¡°°g°È$ Ó!Oò 0˜Ø Ÿ:™:¨Ò0Ø!ŸL™L¬¨U«Õ4Ø!&×!2Ñ!2°7Õ!;Ø %§¡°T Ó :˜AÚ Ø %§¡¨Q¥ñ0ð Ÿ™¨T˜Ó2�AÚØŸ™ QžØ—‘˜uÔ$Ø—:‘:˜s G˜n¸�:Ô>Ø!&§¡°°g°È$ Ó!Oò 0˜Ø Ÿ:™:¨Ò0Ø!ŸL™L¬¨U«Õ4Ø!&×!2Ñ!2°7Õ!;Ø %§¡°T Ó :˜AÚ Ø %§¡¨Q¥ò0ð Ÿ™¨T˜Ó2�AÛØŸ™ Qžð?	(ð@ —+‘+˜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øôi ò $ÜÐ% c U¨"¨Q¨CÐ0´s·z±zÕBØ�T˜4 Ð#Õ#ûð$ús   ‚#P Ð	QÐ&Q	ÑQÑ	Q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 rD   z), retry in zs...r   z	 failed: F)	ÚrangeÚsqlite3ÚOperationalErrorrO   r)   r*   r+   r#   Úsleep)ÚfnÚdescÚmax_attemptsÚdelayÚattemptr3   s         r   Ú
with_retryro   ¦   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)rg   ÚconnectÚDB_PATHÚexecute©Úconns    r   Úinit_dbrw   ´   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+ú 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   )rJ   Úsubr!   ÚjsonÚdumpsrt   Ú	SITE_NAMEÚCATEGORYÚGROUPÚrowcountr(   r)   r*   r+   )
rv   r   r6   Úpublish_dater>   r_   ÚsummaryÚatt_jsonÚcurr3   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)Úcommitru   s   €r   Údo_cleanzmain.<locals>.do_cleanÝ   s   ø€ à�‰�r   z  Cleaning old data...zClean )rk   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Ó?é<   rD   z: +z new, z total, ú:Ú02dz elapsed, ETA Úminé   z
Done! Found: z, New: z, Time: rY   r[   )ÚTOTAL_PAGESÚlenr*   ÚargvÚintr)   r   r+   rw   r#   ro   rf   r8   rt   Úfetchonerc   r‡   ri   ÚmaxrŠ   Úclose)Ú	max_pagesÚ	total_newÚtotal_foundÚ
start_timer‹   ÚpnÚarticlesÚ	batch_newr   r6   Údater†   Ú	det_titleÚdet_dateÚdet_contentÚdet_attsÚfinal_titleÚ
final_dateÚfinal_contentÚ
final_attsÚelapsedÚ
pages_leftÚetarv   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ð
 �‰6�QŒ;Ø�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 opé
   r’   )Ú__doc__r$   rJ   r}   rg   r#   Úosr*   r   Úbs4r   Úurllib.parser   rs   r   r€   r�   ÚBASE_URLr	   r“   r&   r   r8   rc   ro   rw   r‡   r­   Ú__name__© r   r   ú<module>r·      s›   ðñ÷ 2× 1× 1Ó 1Ý Ý Ý  à
€Ø0€	Ø€Ø€Ø"€ØˆZ�~Ð&€Ø€ð DØOØ0ñ€ò=òòFX1ózòòò(AuðH ˆzÒÙ…Fð r   