Ë
    ~¿£jA'  ã                   óŽ  — 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m	Z	 ddl
Z
dZedz   ZdZdZdZej                   j#                  d	d
«      ZddiZdZ eej,                  «      D ]=  \  ZZedk(  sŒedz    eej,                  «      k  sŒ% eej,                  edz      «      Z n dd„Zd„ Zd„ Zd„ Zd„ Zd„ Z e!dk(  r e «        yy)u*   é«˜å”�åŽ¿äººæ°‘æ”¿åºœ - çŽ¯è¯„å®¡æ‰¹ä¿¡æ�¯é    N)ÚBeautifulSoupzhttp://www.gaotang.gov.cnz/channel_x_0.0_8941/u   é«˜å”�åŽ¿-çŽ¯è¯„å®¡æ‰¹ä¿¡æ�¯u   é«˜å”�åŽ¿äººæ°‘æ”¿åºœu   çŽ¯è¯„å¹³å�°Ú	SEARCH_DBz/root/search.dbz
User-Agentz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36z--pagesé   c                 óÊ  — ddl }t        t        | «      d«      }|j                  d«      D ]L  }|j	                  dd«      }|sŒ|j                  d«      rŒ*|r|j                  j                  ||«      n||d<   ŒN |j                  d«      D ]L  }|j	                  d	d«      }|sŒ|j                  d
«      rŒ*|r|j                  j                  ||«      n||d	<   ŒN t        |«      S )uA   ä¿�ç•™ HTML è¡¨æ ¼ç»“æž„ï¼Œä»…å°†ç›¸å¯¹é“¾æŽ¥/å›¾ç‰‡è½¬ç»�å¯¹ URLr   Núhtml.parserÚaÚhrefÚ )ÚhttpÚ
javascriptú#ÚimgÚsrc)r   ú//zdata:)Úurllib.parser   ÚstrÚfind_allÚgetÚ
startswithÚparseÚurljoin)ÚtableÚbase_urlÚurllibÚtblr   r	   r   r   s           úcrawl_gaotang.pyÚhtml_table_to_htmlr      sÐ   € ãÜ
œ˜E›
 MÓ
2€CØ�\‰\˜#Óò SˆØ�u‰u�V˜RÓ ˆÚ˜Ÿ™Ð(CÕDÙ@H˜Ÿ™×,Ñ,¨X°tÔ<ÈdˆAˆfŠIðSð �|‰|˜EÓ"ò RˆØ�g‰g�e˜RÓ ˆÚ�s—~‘~Ð&=Õ>Ù@H˜Ÿ™×-Ñ-¨h¸Ô<ÈcˆC�ŠJðRô ˆs‹8€Oó    c                 ó<  — t         j                  j                  | t        ¬«      }	 t         j                  j	                  |d¬«      j                  «       j                  dd¬«      S # t        $ r+}t        d| › d|› �t        j                  ¬	«       Y d }~y
d }~ww xY w)N)Úheadersé   ©Útimeoutzutf-8Úreplace)Úerrorsz[WARN] fetch failed: ú - ©Úfiler
   )r   ÚrequestÚRequestÚHEADERSÚurlopenÚreadÚdecodeÚ	ExceptionÚprintÚsysÚstderr)ÚurlÚreqÚes      r   Úfetchr6   #   sƒ   € Ü
�.‰.×
 Ñ
  ¬gÐ
 Ó
6€CðÜ�~‰~×%Ñ% c°2Ð%Ó6×;Ñ;Ó=×DÑDÀWÐU^ÐDÓ_Ð_øÜò ÜÐ% c U¨#¨a¨SÐ1¼¿
¹
ÕCÜûðús   §?A' Á'	BÁ0!BÂBc                 óŠ  — t        | d«      }g }|j                  d«      D ]   }|j                  d«      }|sŒ|j                  d¬«      }|j                  d«      }|r|j                  d¬«      nd}|j	                  dd«      j                  «       }|r|j                  d	«      s	t        |z   }|j                  |||d
œ«       Œ¢ |S )zExtract items from a list pager   zdiv.gtxLbList a.box.clearfixÚpT©ÚstripÚemr
   r	   r   )Útitler3   Údate)	r   ÚselectÚfindÚget_textr   r:   r   ÚBASE_URLÚappend)	ÚhtmlÚsoupÚitemsr   Útitle_pr<   r;   Ú	date_textr	   s	            r   Úextract_itemsrH   +   s¿   € ä˜˜}Ó-€DØ€EØ�[‰[Ð7Ó8ò 
GˆØ—&‘&˜“+ˆÙØØ× Ñ  tÐ Ó,ˆØ�V‰V�D‹\ˆÙ/1�B—K‘K d�KÔ+°rˆ	Ø�u‰u�V˜RÓ ×&Ñ&Ó(ˆÙ˜Ÿ™¨Ô/Ü˜d‘?ˆDØ�‰˜u¨T¸9ÑEÕFð
Gð €Lr   c                 óæ   — t        j                  d| «      }t        j                  d| «      }|rC|rAt        |j                  d«      «      }t        |j                  d«      «      }||z   dz
  |z  }|S y)z#Get total pages from laypage configzcount:\s*(\d+)zlimit:\s*(\d+)r   N)ÚreÚsearchÚintÚgroup)rC   ÚmÚm2ÚcountÚlimitÚtotals         r   Úget_total_pagesrS   <   sg   € ä
�	‰	Ð# TÓ*€AÜ	�‰Ð$ dÓ	+€BÙ‰RÜ�A—G‘G˜A“J“ˆÜ�B—H‘H˜Q“KÓ ˆØ˜‘ Ñ" uÑ,ˆØˆØr   c                 ór
  ‡— t        | d«      }d}|j                  dddi¬«      }|r$|j                  d«      r|d   j                  «       }|sU|j                  rI|j                  j
                  j                  «       }t        j                  dd|«      j                  «       }d}|j                  ddd	i¬«      }|r=|j                  d«      r,t        j                  d
|d   «      }|r|j                  d«      }|sJ|j                  d«      }|r7t        j                  d
|j                  «       «      }|r|j                  d«      }|j                  d«      }	|	s|j                  d«      }	|	s|j                  d«      }	|	s%t        d|› �t        j                  ¬«       ||dg dœS g }
g }|j                  d«      }|r›|j                  dd¬«      D ]…  }|d   j                  «       }|j                  d¬«      }|j!                  d«      r
t"        |z   Šn/|j!                  d«      r|Šn|j%                  dd«      d   dz   |z   Š|
j'                  |‰dœ«       Œ‡ |	j                  g d¢d¬«      D �]R  }|j(                  dk(  r|j+                  d «      rŒ%|j(                  d k(  r|j+                  d «      rŒF|j(                  dk(  �r|j                  d!d¬«      }|j                  dd¬«      D ]Ô  }|d   j                  «       }t        j                  d"|t        j,                  «      sŒ<|j                  d¬«      xs |j                  d#d«      }|j!                  d«      r
t"        |z   Šn/|j!                  d«      r|Šn|j%                  dd«      d   dz   |z   Št/        ˆfd$„|
D «       «      rŒÁ|
j'                  |‰dœ«       ŒÖ |s�ŒW|j'                  |«       �Œj|j(                  d k(  r#t1        ||«      }|s�Œ‰|j'                  |«       �Œœ|j(                  d%k(  s�Œ­|j                  d&d«      }|j                  d'd«      }|s�ŒÕ|j!                  d(«      rd)|z   }nG|j!                  d«      r
t"        |z   }n,|j!                  d«      s|j%                  dd«      d   dz   |z   }|j'                  |r	d*|› d+|› d,�nd-|› d,�«       �ŒU t3        «       }g }|
D ]Q  }t5        |t6        «      s|j'                  |«       Œ%|d.   |vsŒ-|j9                  |d.   «       |j'                  |«       ŒS d/j;                  |«      }||||dœS )0zParse detail page contentr   r
   ÚmetaÚnameÚArticleTitle)ÚattrsÚcontentu!   \s*\|\s*é«˜å”�åŽ¿äººæ°‘æ”¿åºœ\s*$ÚPubDatez(\d{4}-\d{2}-\d{2})r   u*   div.gtxDetPart1 p:contains('å�‘å¸ƒæ—¥æœŸ')zdiv#sxNewsDetailContentzdiv.sxNewsDetailContentzdiv.content div.txt1z[WARN] No content found: r'   )r<   r=   rY   Úattachmentszdiv.txt2r   T)r	   r	   r9   ú/r   r   )r<   r3   )r8   r   r   )Ú	recursiver8   r   ú z\.(pdf|docx?|xlsx?|rar|zip)$Údownloadc              3   ó.   •K  — | ]  }|d    ‰k(  –— Œ y­w)r3   N© )Ú.0ÚattÚahrefs     €r   ú	<genexpr>zparse_detail.<locals>.<genexpr>‘   s   øè ø€ ÒJ°s˜s 5™z¨UÕ2ÑJùs   ƒr   r   Úaltr   zhttp:z![z](ú)z![](r3   z

)r   r?   r   r:   r<   ÚstringrJ   ÚsubrK   rM   Ú
select_oner@   r0   r1   r2   r   r   rA   ÚrsplitrB   rV   Úfind_parentÚIÚanyr   ÚsetÚ
isinstanceÚdictÚaddÚjoin)rC   r3   rD   r<   Ú
meta_titlerG   Ú	meta_daterN   Údate_pÚcontent_divr[   ÚpartsÚ
attach_divr   r	   ÚatitleÚelÚtextÚtbl_htmlr   rf   ÚseenÚunique_attachmentsrc   rY   rd   s                            @r   Úparse_detailr€   G   sÓ  ø€ ä˜˜}Ó-€Dð €EØ—‘˜6¨&°.Ð)A�ÓB€JÙ�j—n‘n YÔ/Ø˜9Ñ%×+Ñ+Ó-ˆÙ�T—Z’ZØ—
‘
×!Ñ!×'Ñ'Ó)ˆÜ—‘Ð;¸RÀÓG×MÑMÓOˆð €IØ—	‘	˜&¨°Ð(;�	Ó<€IÙ�Y—]‘] 9Ô-Ü�I‰IÐ,¨i¸	Ñ.BÓCˆÙØŸ™ ›
ˆIÙØ—‘Ð!MÓNˆÙÜ—	‘	Ð0°&·/±/Ó2CÓDˆAÙØŸG™G A›J�	ð —/‘/Ð";Ó<€KÙØ—o‘oÐ&?Ó@ˆÙØ—o‘oÐ&<Ó=ˆáÜÐ)¨#¨Ð/´c·j±jÕAØ¨	¸bÐQSÑTÐTà€KØ€Eð —‘ Ó,€JÙØ×$Ñ$ S¨tÐ$Ó4ò 		@ˆAØ�V‘9—?‘?Ó$ˆDØ—Z‘Z d�ZÓ+ˆFØ�‰˜sÔ#Ü  4™‘Ø—‘ Ô(Ø‘àŸ
™
 3¨Ó*¨1Ñ-°Ñ3°dÑ:�Ø×Ñ¨¸Ñ>Õ?ð		@ð ×"Ñ"Ò#8ÀDÐ"ÓIó &KˆØ�7‰7�cŠ>˜bŸn™n¨WÔ5ØØ�7‰7�gÒ "§.¡.°Ô"9Øà�7‰7�c‹>Ø—;‘;˜s¨$�;Ó/ˆDà—[‘[ ¨4�[Ó0ò L�Ø˜‘y—‘Ó(�Ü—9‘9Ð<¸dÄBÇDÁDÕIØŸZ™Z¨d˜ZÓ3ÒL°q·u±u¸ZÈÓ7L�FØ—‘ sÔ+Ü (¨4¡™ØŸ™¨Ô0Ø $™à #§
¡
¨3°Ó 2°1Ñ 5¸Ñ ;¸dÑ B˜ÜÓJ¸kÔJÕJØ#×*Ñ*°VÀEÑ+JÕKðLó Ø—‘˜TÖ"à�W‰W˜ÒÜ)¨"¨cÓ2ˆHÛØ—‘˜XÖ&Ø�W‰W˜ÔØ—&‘&˜ Ó#ˆCØ—&‘&˜ Ó#ˆCÛØ—>‘> $Ô'Ø! C™-‘CØ—^‘^ CÔ(Ü" S™.‘CØŸ™¨Ô/ØŸ*™* S¨!Ó,¨QÑ/°#Ñ5¸Ñ;�CØ—‘±3˜r #  b¨¨¨QÑ/¸dÀ3À%Àq¸MÖJðM&KôR ‹5€DØÐØò +ˆÜ˜#œtÔ$Ø×%Ñ% cÔ*ØØˆu‰:˜TÒ!Ø�H‰H�S˜‘ZÔ Ø×%Ñ% cÕ*ð+ð �k‰k˜%Ó €GØ I¸'ÐRdÑeÐer   c                  óx  — t        t        «      } | s0t        dt        j                  ¬«       t        j
                  d«       t        | «      }|€d}t        dt        j                  ¬«       t        d|› �t        j                  ¬«       t        r9|t        kD  r0t        dt        › dt        › d�t        j                  ¬«       t        }g }t        d|dz   «      D ]¯  }|dk(  rt        }nt        › d	|› �}t        d
|› d|› d|› �t        j                  ¬«       t        |«      } | st        d|› �t        j                  ¬«       Œjt        | «      }t        dt        |«      › d|› �t        j                  ¬«       |j                  |«       Œ± t        dt        |«      › �t        j                  ¬«       t        j                  t        d¬«      }|j                  «       }d}d}	d}
|D �]Ú  }|j!                  d|d   f«       |j#                  «       rŒ+t        d|d   d d › d�t        j                  ¬«       t        |d   «      } | s"t        d|d   › �t        j                  ¬«       Œ‚t%        | |d   «      }|d   xs |d   }|d   xs |d   }|d   }|d   }t'        j(                  dd|«      }t'        j(                  d d!|«      j+                  «       }|r|d d" nd}|s#|	dz  }	t        d#|› �t        j                  ¬«       d}|rVt'        j,                  d$|«      }|r>t/        |j1                  d«      |j1                  d%«      z   |j1                  d&«      z   «      }|rt3        j4                  |d'¬(«      nd)}	 |j!                  d*|t6        t8        |d   |||||f	«       |j:                  dkD  r|dz  }|
t        |«      z  }
�ŒÝ |j?                  «        |jA                  «        t        d.t6        › d|› d/|	› d0|
› d1�	«       y # t<        $ r/}t        d+|d d, › d-|› �t        j                  ¬«       Y d }~�ŒNd }~ww xY w)2Nz[ERROR] Cannot fetch list pager'   r   z2[WARN] Could not determine total pages, assuming 1z[INFO] Total pages: z[INFO] Limiting to z pages (--pages=rg   z?page=z[INFO] Fetching page r\   z: z[WARN] Empty response for page z[INFO] Found z items on page z[INFO] Total items from list: é<   r"   r   z'SELECT id FROM gov_raw WHERE page_url=?r3   z[INFO] Fetching detail: r<   é2   z...z&[WARN] Cannot fetch detail, skipping: r=   rY   r[   z<[^>]+>r
   z\s+r^   éÈ   z[WARN] Empty content: z(\d{4})-(\d{2})-(\d{2})é   é   F)Úensure_asciiz[]z™INSERT OR IGNORE INTO gov_raw (title, site_name, group_name, page_url, publish_date, content, summary, attachments, date_rank) VALUES (?,?,?,?,?,?,?,?,?)z[ERROR] DB insert failed: r!   r&   z

[RESULT] z new, z empty content, z attachments)!r6   ÚLIST_URLr0   r1   r2   ÚexitrS   Ú_MAX_PGÚrangerH   ÚlenÚextendÚsqlite3ÚconnectÚDBÚcursorÚexecuteÚfetchoner€   rJ   ri   r:   rK   rL   rM   ÚjsonÚdumpsÚ	SITE_NAMEÚ
GROUP_NAMEÚrowcountr/   ÚcommitÚclose)rC   Útotal_pagesÚ	all_itemsÚpgr3   rE   ÚconnÚcÚ	new_countÚempty_contentÚtotal_attachmentsÚitemÚdetailr<   rG   rY   r[   ÚplainÚsummaryÚ	date_rankrN   Úatt_jsonr5   s                          r   Úmainr©   µ   së  € Ü”‹?€DÙÜÐ.´S·Z±ZÕ@Ü�‰�Œä! $Ó'€KØÐØˆÜÐBÌÏÉÕTä	Ð   Ð
.´S·Z±ZÕ@å�;¤Ò(ÜÐ#¤G 9Ð,<¼W¸IÀQÐGÌcÏjÉjÕYÜˆà€IÜ�A�{ Q‘Ó'ò  ˆØ�Š7Ü‰Cä�J˜f R DÐ)ˆCÜÐ% b T¨¨;¨-°r¸#¸Ð?ÄcÇjÁjÕQÜ�S‹zˆÙÜÐ3°B°4Ð8¼s¿z¹zÕJØÜ˜dÓ#ˆÜ�œc %›j˜\¨¸¸Ð=ÄCÇJÁJÕOØ×Ñ˜Õð ô 
Ð*¬3¨y«>Ð*:Ð
;Ä#Ç*Á*ÕMä�?‰?œ2 rÔ*€DØ�‰‹€Aà€IØ€MØÐàó +TˆØ	�	‰	Ð;¸dÀ5¹k¸^ÔLØ�:‰:Œ<ØäÐ(¨¨g©°s¸Ð);Ð(<¸CÐ@ÄsÇzÁzÕRÜ�T˜%‘[Ó!ˆÙÜÐ:¸4À¹;¸-ÐHÌsÏzÉzÕZØä˜d D¨¡KÓ0ˆà�w‘Ò0 4¨¡=ˆØ˜6‘NÒ2 d¨6¡lˆ	Ø˜Ñ#ˆØ˜]Ñ+ˆä—‘�z 2 wÓ/ˆÜ—‘�v˜s EÓ*×0Ñ0Ó2ˆÙ!&�%˜˜‘+¨BˆáØ˜QÑˆMÜÐ*¨5¨'Ð2¼¿¹ÕDàˆ	ÙÜ—	‘	Ð4°iÓ@ˆAÙÜ §¡¨£
¨Q¯W©W°Q«ZÑ 7¸!¿'¹'À!»*Ñ DÓE�	áBM”4—:‘:˜k¸Õ>ÐSWˆð		TØ�I‰Ið lØœ	¤:¨t°E©{¸IÀwÐPWÐYaÐclÐmôð �z‰z˜AŠ~Ø˜Q‘�	Ø!¤S¨Ó%5Ñ5Ð!ùðS+TðZ 	‡K�K„MØ‡J�J„Lä	ˆKœ	�{ " Y K¨v°m°_ÐDTÐUfÐTgÐgsÐ
tÕuøô ò 	TÜÐ.¨u°S°b¨z¨l¸#¸a¸SÐAÌÏ
É
×SÓSûð	Tús   Í9APÐ	P9Ð
$P4Ð4P9Ú__main__)r
   )"Ú__doc__rJ   r1   Úosr”   Úurllib.requestr   Úurllib.errorÚbs4r   rŽ   rA   rˆ   r–   ÚSITE_DISPLAYr—   Úenvironr   r�   r+   rŠ   Ú	enumerateÚargvÚir   rŒ   rL   r   r6   rH   rS   r€   r©   Ú__name__ra   r   r   ú<module>r¶      sâ   ðá 0ß × ß #Ý Û à&€ØÐ,Ñ,€Ø*€	Ø&€Ø€
Ø‡Z�Z‡^�^�KÐ!2Ó3€ØÐWÐ
X€à
€Ù�c—h‘hÓò �D€A€qØˆIƒ~˜!˜a™%¡# c§h¡h£-Ó/Ù�c—h‘h˜q 1™u‘oÓ&ˆÙðó
òòò"	òkfò\Yvðx ˆzÒÙ…Fð r   