Ë
    }�j]  ã                   óÆ   — 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Z e j                  dd«      Z
dZddiZdd	„Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)é    N)Údatetimez+https://www.qg.gov.cn/zwgk/zdxxgk/hjbh/xmhpÚ	SEARCH_DBz/root/search.dbu   æ³‰å·žå¸‚æ³‰æ¸¯åŒº-é¡¹ç›®çŽ¯è¯„z
User-Agentz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36c                 óº  — t        |«      D ]u  }	 t        j                  j                  | t        ¬«      }t        j                  j                  |d¬«      5 }|j                  «       j                  dd¬«      cd d d «       c S  y # 1 sw Y   nxY wŒ†# t        $ r?}||dz
  k  rt        j                  d«       nt        d	| › d
|› �«       Y d }~ y Y d }~ŒÉd }~ww xY w)N©Úheadersé   ©Útimeoutzutf-8Úreplace)Úerrorsé   é   z  [WARN] Failed to fetch ú: )ÚrangeÚurllibÚrequestÚRequestÚHEADERSÚurlopenÚreadÚdecodeÚ	ExceptionÚtimeÚsleepÚprint)ÚurlÚretriesÚiÚreqÚrespÚes         ú/root/gov_crawler/crawl_qg.pyÚfetchr#      sÎ   € Ü�7‹^ò 
ˆð		Ü—.‘.×(Ñ(¨´gÐ(Ó>ˆCÜ—‘×'Ñ'¨°RÐ'Ó8ð E¸DØ—y‘y“{×)Ñ)¨'¸)Ð)ÓD÷Eó Eñ
÷Eð Eúð Eøäò 	Ø�7˜Q‘;ŠÜ—
‘
˜1•äÐ1°#°°b¸¸Ð<Ô=Ýô ûð	ús0   �ABÁ!BÁ7	BÂB	Â
BÂ	CÂ/CÃCc                 óî   — g }d}t        j                  || «      D ]W  }|j                  d«      |j                  d«      }}t        › d|› �}|dd dz   |dd z   dz   d	z   }|j	                  |||f«       ŒY |S )
zExtract list items from a pagez7<a href="\./(\d{6}/t\d+_?\d*\.htm)"[^>]*title="([^"]*)"r   r   ú/Né   ú-é   Ú01)ÚreÚfinditerÚgroupÚBASE_URLÚappend)ÚhtmlÚitemsÚpatternÚmÚhrefÚtitleÚpage_urlÚpub_dates           r"   Úextract_linksr7      s�   € à€EàH€GÜ�[‰[˜ $Ó'ò 2ˆØ—g‘g˜a“j !§'¡'¨!£*ˆeˆÜ�Z˜q  Ð'ˆØ˜˜�8˜c‘> D¨¨1 IÑ-°Ñ3°dÑ:ˆØ�‰�e˜X xÐ0Õ1ð	2ð
 €Ló    c                 óF  — d}t        j                  d| t         j                  «      }|r|j                  d«      j	                  «       }|sVdD ]Q  }t        j                  d|z   dz   | t         j                  «      }|sŒ1|j                  d«      j	                  «       } |S  |S )z Extract content from detail pageÚ z,<div[^>]*class="TRS_Editor"[^>]*>(.*?)</div>r   )zarticle-contentznews-contentÚcontentÚmaintextz<div[^>]*class="[^"]*z [^"]*"[^>]*>(.*?)</div>\s*</div>)r*   ÚsearchÚDOTALLr,   Ústrip)r/   r;   r2   Úclss       r"   Úextract_contentrA   )   s—   € à€GÜ
�	‰	ÐAÀ4ÌÏÉÓS€AÙØ—'‘'˜!“*×"Ñ"Ó$ˆÙàMò 	ˆCÜ—	‘	Ð2°SÑ8Ð;^Ñ^Ð`dÔfh×foÑfoÓpˆAÚØŸ'™' !›*×*Ñ*Ó,�ØØ€Nð	ð
 €Nr8   c                 óX   — t        j                  d| «      }|r|j                  d«      S |S )z%Extract publish date from detail pagez(\d{4}-\d{2}-\d{2})r   )r*   r=   r,   )r/   Údefault_dater2   s      r"   Úextract_daterD   8   s,   € ô 	�	‰	Ð(¨$Ó/€AÙØ�w‰w�q‹zÐØÐr8   c                 óÞ   — t        j                  d| «      }|rT|j                  d«      }dD ].  }|j                  |«      }|dkD  sŒ|d| } |j	                  «       S  |j	                  «       S |S )z$Extract clean title from detail pagez<title>(.*?)</title>r   )u   -é¡¹ç›®çŽ¯è¯„u   -ç”Ÿæ€�çŽ¯å¢ƒu   -é‡�ç‚¹ä¿¡æ�¯å…¬å¼€u   -æ”¿åŠ¡å…¬å¼€u   -æ³‰å·žå¸‚æ³‰æ¸¯åŒºäººæ°‘æ”¿åºœr   N)r*   r=   r,   Úrfindr?   )r/   Úfallback_titler2   r4   ÚsuffixÚidxs         r"   Úextract_titlerJ   @   sx   € ä
�	‰	Ð)¨4Ó0€AÙØ—‘˜“
ˆð Dò 	ˆFØ—+‘+˜fÓ%ˆCØ�Q‹wØ˜d˜s˜�ØØ�{‰{‹}Ðð	ð
 �{‰{‹}ÐØÐr8   c                  ó  — t        ddd«      D ]h  } t        › d| › d�}t        j                  j	                  |t
        ¬«      }	 t        j                  j                  |d¬«      }|j                  d	k(  r| c S Œj y
#  Y ŒpxY w)z Determine total pages by probingr   r   éÿÿÿÿú/index_ú.htmr   é
   r	   éÈ   r   )r   r-   r   r   r   r   r   Ústatus)Únr   r   r    s       r"   Úget_total_pagesrS   N   sŠ   € ô �2�q˜"Óò ˆÜ�
˜' !  DÐ)ˆÜ�n‰n×$Ñ$ S´'Ð$Ó:ˆð	Ü—>‘>×)Ñ)¨#°rÐ)Ó:ˆDØ�{‰{˜cÒ!Ø’ð "ðð øð	Ùús   Á1A:Á:A>c                  ó€  — d} t        t        j                  «      D ]»  \  }}|j                  «       rt	        |«      } Œ"|j                  d«      r	 t	        |j                  d«      d   «      } ŒR|dk(  sŒX|dz   t        t        j                  «      k  sŒxt        j                  |dz      j                  «       sŒ�t	        t        j                  |dz      «      } Œ½ t        dt        j                  «       j                  «       › dt        › d| › d	�«       g }t        d
«       t        t        dz   «      }|r4t!        |«      }t        dt        |«      › d�«       |j#                  |«       d}	 | dkD  r|| kD  rn{t        › d|› d�}t        d|› d�«       t        |«      }|snRt!        |«      }|snDt        dt        |«      › d�«       |j#                  |«       |dz  }t%        j&                  d«       Œ†t        dt        |«      › �«       dd l}|j+                  t,        d¬«      }	|	j/                  d«       |	j/                  d«       |	j1                  «       }
d}d}|D ]Æ  \  }}}|
j/                  d|f«       |
j3                  «       r|dz  }Œ0t        |«      }|s|dz  }ŒCt5        |«      }|st        d|d d › �«       |dz  }Œgt7        ||«      }t9        ||«      }	 |
j/                  dt        t        |||||d d j;                  dd«      j=                  «       f«       |dz  }ŒÈ |	jA                  «        |	jC                  «        t        d!«       t        d"|› �«       t        d#|› �«       t        d$t        |«      › �«       y # t        $ r Y �Œsw xY w# t>        $ r!}t        d|› d |› �«       |dz  }Y d }~�Œ]d }~ww xY w)%Nr   z--pages=ú=r   z--pagesú[z] Starting crawl: z (max_pages=ú)zFetching page 1...r%   z  Found z itemsr   rM   rN   zFetching page z...g      à?z
Total items to process: r   r	   zPRAGMA journal_mode=WALzPRAGMA busy_timeout=30000z'SELECT id FROM gov_raw WHERE page_url=?z  [SKIP] No content: zºINSERT OR REPLACE INTO gov_raw 
                (site_name, source_url, page_url, title, publish_date, content, status, summary)
                VALUES (?, ?, ?, ?, ?, ?, 'published', ?)rP   ú
ú z  [ERR] DB error for r   z
=== Completed ===z
Inserted: z	Skipped: zTotal: )"Ú	enumerateÚsysÚargvÚisdigitÚintÚ
startswithÚsplitÚ
ValueErrorÚlenr   r   ÚnowÚ	isoformatÚ	SITE_NAMEr#   r-   r7   Úextendr   r   Úsqlite3ÚconnectÚDB_PATHÚexecuteÚcursorÚfetchonerA   rJ   rD   r   r?   r   ÚcommitÚclose)Ú	max_pagesr   ÚaÚ	all_itemsr/   r0   Úpager   rg   ÚconnÚcÚinsertedÚskippedr4   r5   rC   Údetail_htmlr;   Úclean_titler6   r!   s                        r"   Úmainry   ]   s©  € à€IÜœ#Ÿ(™(Ó#ò 	+‰ˆˆ1Ø�9‰9Œ;Ü˜A›‰IØ�\‰\˜*Ô%ðÜ §¡¨£¨Q¡Ó0‘	ð �)‹^  A¡¬¬C¯H©H«Ó 5¼#¿(¹(À1ÀQÁ3¹-×:OÑ:OÕ:QÜœCŸH™H Q q¡S™MÓ*‰Ið	+ô 
ˆAŒh�l‰l‹n×&Ñ&Ó(Ð)Ð);¼I¸;ÀlÐS\ÐR]Ð]^Ð
_Ô`ð €Iô 
Ð
ÔÜ”˜C‘Ó €DÙÜ˜dÓ#ˆÜ�œ˜U›˜ FÐ+Ô,Ø×Ñ˜Ôð €DØ
Ø�qŠ=˜T IÒ-ØÜ�
˜' $  tÐ,ˆÜ�˜t˜f CÐ(Ô)Ü�S‹zˆÙØÜ˜dÓ#ˆÙØÜ�œ˜U›˜ FÐ+Ô,Ø×Ñ˜ÔØ�‰	ˆÜ�
‰
�3Œð ô  
Ð&¤s¨9£~Ð&6Ð
7Ô8ó à�?‰?œ7¨Bˆ?Ó/€DØ‡L�LÐ*Ô+Ø‡L�LÐ,Ô-Ø�‰‹€Aà€HØ€Gà)2ò !Ñ%ˆˆx˜à	�	‰	Ð;¸h¸[ÔIØ�:‰:Œ<Ø�q‰LˆGØô ˜H“oˆÙØ�q‰LˆGØô " +Ó.ˆÙÜÐ)¨%°°¨*¨Ð6Ô7Ø�q‰LˆGØô $ K°Ó7ˆÜ ¨\Ó:ˆð		Ø�I‰Ið =ô œH h°¸XÀwØ˜˜#�×&Ñ& t¨SÓ1×7Ñ7Ó9ð;ô<ð
 ˜‰M‰Hð=!ðF 	‡K�K„MØ‡J�J„Lä	ÐÔ!Ü	ˆJ�x�jÐ
!Ô"Ü	ˆI�g�YÐ
Ô Ü	ˆG”C˜	“NÐ#Ð
$Õ%øôs ò Úðûô^ ò 	ÜÐ)¨(¨°2°a°SÐ9Ô:Ø�q‰LŽGûð	ús+   ÁNËANÎ	NÎNÎ	N=ÎN8Î8N=Ú__main__)é   )Úosr*   r   r[   Úurllib.requestr   Úurllib.errorr   r-   Úgetenvri   re   r   r#   r7   rA   rD   rJ   rS   ry   Ú__name__© r8   r"   ú<module>r‚      s|   ðã 	Ø ?ß × ß #Ý à8€Ø
ˆ"�)‰)�KÐ!2Ó
3€Ø-€	ð ÐPð€óò
òòòòòb&ðH ˆzÒÙ…Fð r8   