Ë
    	}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m	Z	 ddl
mZ ddlZdZedz   ZdZdZej"                  j%                  d	d
«      ZdZddiZ ej,                  dej.                  «      ZdZ eej6                  «      D ]=  \  ZZedk(  sŒedz    eej6                  «      k  sŒ% eej6                  edz      «      Z n d„ Z d„ Z!d„ Z"d„ Z#d„ Z$d„ Z%d„ Z&e'dk(  r e&«        yy)uB   å�Žå®¹åŽ¿äººæ°‘æ”¿åºœ - ä¸šåŠ¡ç®¡ç�† (ç”Ÿæ€�çŽ¯å¢ƒå±€å�Žå®¹åˆ†å±€)é    N)Úurljoin)ÚBeautifulSoupzhttps://www.huarong.gov.cnz(/33159/37006/37008/37035/37247/index.htmu   å�Žå®¹åŽ¿-ä¸šåŠ¡ç®¡ç�†u   å�Žå®¹åŽ¿äººæ°‘æ”¿åºœÚ	SEARCH_DBz/root/search.dbu   çŽ¯è¯„å¹³å�°z
User-Agentz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36z%\.(docx?|pdf|xlsx?|rar|zip)(?:[?#]|$)z--pagesé   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é   )ÚtimeoutÚgb2312Úreplace)Úerrorsz[WARN] fetch failed: ú - ©ÚfileÚ )ÚurllibÚrequestÚRequestÚHEADERSÚurlopenÚreadÚdecodeÚ	ExceptionÚprintÚsysÚstderr)ÚurlÚreqÚes      ú"/root/gov_crawler/crawl_huarong.pyÚfetchr!      sƒ   € Ü
�.‰.×
 Ñ
  ¬gÐ
 Ó
6€CðÜ�~‰~×%Ñ% c°2Ð%Ó6×;Ñ;Ó=×DÑDÀXÐV_ÐDÓ`Ð`øÜò ÜÐ% c U¨#¨a¨SÐ1¼¿
¹
ÕCÜûðús   §?A' Á'	BÁ0!BÂBc                 óš   — | xs dj                  «       } | sy| j                  d«      rd| z   S | j                  d«      r| S t        || «      S )u8   ç›¸å¯¹è·¯å¾„ -> ç»�å¯¹ URLï¼ˆurljoin æ­£ç¡®å¤„ç�† ../ï¼‰r   z//zhttps:)zhttp://zhttps://)ÚstripÚ
startswithr   )ÚuÚbases     r    Úto_absr'   !   sM   € à	
Šˆb�‰Ó€AÙØØ‡|�|�DÔØ˜!‰|ÐØ‡|�|Ð+Ô,ØˆÜ�4˜ÓÐó    c                 óz   — | dk(  rt         S d| cxk  rdk  rn nt        › d| dz
  › d�S | dz
  dz  }t        › d|› d�S )	z4Get the list URL for a given page number (1-indexed)r   é   é   z%/33159/37006/37008/37035/37247/index_z.htmé   z:/hrx/33159/37006/37008/37035/37247/index.jsp?pager.offset=z&pager.desc=false)ÚLIST_URLÚBASE_URL)ÚpageÚoffsets     r    Úget_list_urlr1   ,   sU   € àˆq‚yÜˆØ	
ˆdŒ�a�Ü�Ð@ÀÀaÁÀÈÐMÐMà˜‘(˜b‘ˆÜ�ÐUÐV\ÐU]Ð]nÐoÐor(   c                 ó¤  — t        | d«      }g }|j                  d«      D ]­  }|j                  dd¬«      }|sŒ|d   j                  «       }|j	                  dd«      xs |j                  d¬	«      }|j                  d
d¬«      }|r|j                  d¬	«      nd}t        |t        «      }|j                  |j                  «       ||dœ«       Œ¯ |S )zExtract items from a list pageúhtml.parserzdiv.news-list-entryÚaT©Úhrefr6   Útitler   ©r#   Úspanznews-list-date)Úclass_)r7   r   Údate)	r   ÚselectÚfindr#   ÚgetÚget_textr'   r-   Úappend)	ÚhtmlÚsoupÚitemsÚentryr4   r6   r7   Ú	date_spanÚ	date_texts	            r    Úextract_itemsrG   6   sÌ   € ä˜˜}Ó-€DØ€EØ—‘Ð2Ó3ò 
OˆØ�J‰J�s ˆJÓ&ˆÙØØ�‰y�‰Ó ˆØ—‘�g˜rÓ"Ò< a§j¡j°t jÓ&<ˆØ—J‘J˜vÐ.>�JÓ?ˆ	Ù6?�I×&Ñ&¨TÐ&Ô2ÀRˆ	ä�dœHÓ%ˆØ�‰˜uŸ{™{›}°TÀ9ÑMÕNð
Oð €Lr(   c                 ót  — t        | d«      }|j                  ddg«      D ]  }|j                  «        Œ |j                  d«      D ]  }|j                  «        Œ |j                  g d¢«      D ];  }|j                  d«      r|d= |j                  d«      sŒ)|j                  dk(  sŒ9|d= Œ= |j                  d	d
¬«      D ]  }t        |d   |«      |d<   Œ |j                  dd
¬«      D ]C  }|j                  dd«      }d|v sd|v sd|v r|j                  «        Œ2t        |d   |«      |d<   ŒE t        |«      S )us   æ¸…æ´— HTML ç‰‡æ®µï¼šunwrap æ ·å¼�åŒ…è£…(span/font)ï¼Œæ¸… p/td/tr å†…è�” styleï¼Œä¿�ç•™ a/img å¹¶ç»�å¯¹åŒ– href/srcr3   r9   ÚfontÚdiv)ÚpÚtdÚtrÚthÚtbodyÚtableÚbÚstrongr%   ÚiÚemÚh1Úh2Úh3ÚstyleÚclassrK   r4   Tr5   r6   Úimg)Úsrcr[   r   Úicon_ú
/sysimage/ú/filetypeimages/)	r   Úfind_allÚunwrapÚhas_attrÚnamer'   r>   Ú	decomposeÚstr)Úfragmentr&   ÚfsoupÚtagr4   rZ   r[   s          r    Ú_clean_fragmentrh   G   s>  € ä˜( MÓ2€EØ�~‰~˜v vÐ.Ó/ò ˆØ�
‰
�ðà�~‰~˜eÓ$ò ˆØ�
‰
�ðà�~‰~ÒxÓyò ˆØ�<‰<˜Ô Ø�G�Ø�<‰<˜Õ  S§X¡X°£_Ø�G‘ð	ð
 �^‰^˜C dˆ^Ó+ò ,ˆÜ˜1˜V™9 dÓ+ˆˆ&Š	ð,à�~‰~˜e¨ˆ~Ó.ò .ˆØ�g‰g�e˜RÓ ˆØ�c‰>˜\¨SÑ0Ð4FÈ#Ñ4MØ�M‰MŒOØÜ˜C ™J¨Ó-ˆˆEŠ
ð.ô ˆu‹:Ðr(   c           
      óD	  ‡‡‡— t        | d«      }d}|j                  d«      }|r|j                  d¬«      }|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%t        d‰› �t        j                  ¬«       ||dg dœS g Št        «       Šˆˆˆfd„}g }|
j!                  d¬«      D �]=  }|j"                  dk(  r||j!                  dd¬«      D ]
  } ||«       Œ t%        |j'                  «       ‰«      }t        j                  dd|«      j                  «       }|sd|v sŒy|j)                  d|› d�«       Œ�|j"                  dk(  rP|j!                  dd¬«      D ]
  } ||«       Œ t%        |j'                  «       ‰«      }|j)                  d|› d�«       Œî|j"                  d k(  r²|j                  d«      }|rQ|j!                  dd¬«      D ]
  } ||«       Œ t%        |j'                  «       ‰«      }|j)                  d|› d�«       �Œa|j!                  dd¬«      D ]
  } ||«       Œ |j                  d!d¬«      }|s�Œ˜|j)                  d|› d�«       �Œ¯|j"                  d"k(  rT|j                  d#d«      }d$|v sd%|v sd&|v r�ŒÞ|j)                  d't+        |‰«      › d(|j                  d)d«      › d*�«       �Œ|j                  d!d¬«      }|s�Œ)|j)                  d|› d�«       �Œ@ |j                  d+«      }|r§|j!                  dd¬«      D ]‘  } ||«       t+        |j                  d,d«      ‰«      }t,        j                  |«      sŒ=|j                  d¬«      xs) |j                  d-d«      xs |j/                  d.d«      d/   }|j)                  d0|› d*|› d1�«       Œ“ d2j1                  |«      }|||‰dœS )3zParse detail page contentr3   r   z	div.titleTr8   u   -\s*å�Žå®¹åŽ¿äººæ°‘æ”¿åºœ\s*Úmetarb   ÚPubDate)ÚattrsÚcontentz(\d{4}-\d{2}-\d{2})r   u    li span:contains('å�‘å¸ƒæ—¥æœŸ')zdiv.content-wrapperz[WARN] No content found: r   )r7   r;   rm   Úattachmentsc                 ó8  •— t        | j                  dd«      ‰«      }t        j                  |«      sy | j	                  d¬«      xs) | j                  dd«      xs |j                  dd«      d   }|‰vr&‰j                  |«       ‰j                  ||d	œ«       y y )
Nr6   r   Tr8   Údownloadú/r   éÿÿÿÿ)r7   r   )r'   r>   Ú	ATTACH_REÚsearchr?   ÚrsplitÚaddr@   )r4   r6   Úatitlern   Úseen_attr   s      €€€r    Úadd_attzparse_detail.<locals>.add_att�   s�   ø€ Ü�a—e‘e˜F BÓ'¨Ó-ˆÜ×Ñ Ô%ØØ—‘ $�Ó'Ò[¨1¯5©5°¸RÓ+@Ò[ÀDÇKÁKÐPSÐUVÓDWÐXZÑD[ˆØ�xÑØ�L‰L˜ÔØ×Ñ¨¸Ñ=Õ>ð  r(   F)Ú	recursiverK   r4   r5   ú<[^>]+>z<a z<p>z</p>rP   z<table>z</table>rJ   ú rZ   r[   r\   r]   r^   z
<img src="z" alt="Úaltz">zdiv.wjxxr6   rp   rq   rr   z<p><a href="z</a></p>ú
)r   Ú
select_oner?   r7   Ústringr#   ÚreÚsubr=   r>   rt   Úgroupr   r   r   Úsetr_   rb   rh   Údecode_contentsr@   r'   rs   ru   Újoin)rA   r   rB   r7   Ú	title_divÚtrF   Ú	meta_dateÚmÚdate_liÚcontent_divry   ÚpartsÚelr4   ÚinnerÚtxtÚt_htmlr[   ÚwjxxÚahrefrw   rm   rn   rx   s    `                     @@r    Úparse_detailr”   ]   sd  ú€ ä˜˜}Ó-€Dð €EØ—‘ Ó,€IÙØ×"Ñ"¨Ð"Ó.ˆÙ�T—Z’ZØ�J‰J×Ñ×#Ñ#Ó%ˆÜ—‘Ð6¸¸AÓ>×DÑDÓFˆð €IØ—	‘	˜&¨°Ð(;�	Ó<€IÙ�Y—]‘] 9Ô-Ü�I‰IÐ,¨i¸	Ñ.BÓCˆÙØŸ™ ›
ˆIÙØ—/‘/Ð"DÓEˆÙÜ—	‘	Ð0°'×2BÑ2BÓ2DÓEˆAÙØŸG™G A›J�	ð —/‘/Ð"7Ó8€KÙÜÐ)¨#¨Ð/´c·j±jÕAØ¨	¸bÐQSÑTÐTà€KÜ‹u€Hö?ð €Eà×"Ñ"¨UÐ"Ó3ó $.ˆØ�7‰7�cŠ>Ø—[‘[ ¨4�[Ó0ò �Ù˜•
ðä# B×$6Ñ$6Ó$8¸#Ó>ˆEÜ—&‘&˜ R¨Ó/×5Ñ5Ó7ˆCÙ�e˜u’nØ—‘˜s 5 '¨Ð.Õ/Ø�W‰W˜ÒØ—[‘[ ¨4�[Ó0ò �Ù˜•
ðä$ R×%7Ñ%7Ó%9¸3Ó?ˆFØ�L‰L˜7 6 (¨(Ð3Õ4Ø�W‰W˜Òà—‘˜Ó ˆAÙØŸ™ C¨d˜Ó3ò �AÙ˜A•Jðä(¨×):Ñ):Ó)<¸cÓB�Ø—‘˜w v h¨hÐ7Ö8ð Ÿ™ S¨t˜Ó4ò �AÙ˜A•Jðà—k‘k #¨T�kÓ2�ÛØ—L‘L 3 s e¨4 Ö1Ø�W‰W˜ÒØ—&‘&˜ Ó#ˆCØ˜#‰~ °Ñ!4Ð8JÈcÑ8QÙØ�L‰L˜:¤f¨S°#Ó&6Ð%7°w¸r¿v¹vÀeÈRÓ?PÐ>QÐQSÐTÖUà—+‘+˜c¨�+Ó.ˆCÛØ—‘˜s 3 % t˜_Ö-ðI$.ðN �?‰?˜:Ó&€DÙØ—‘˜s¨�Ó.ò 	GˆAÙ�AŒJÜ˜1Ÿ5™5 ¨Ó,¨cÓ2ˆEÜ×Ñ Õ&ØŸ™¨$˜Ó/Òd°1·5±5¸ÀRÓ3HÒdÈEÏLÉLÐY\Ð^_ÓL`ÐacÑLd�Ø—‘˜|¨E¨7°"°V°H¸HÐEÕFð	Gð �i‰i˜Ó€GØ I¸'ÐR]Ñ^Ð^r(   c                  ó  — t        t        «      } | s0t        dt        j                  ¬«       t        j
                  d«       d}t        | d«      }|j                  d«      }|�r@d}|j                  dd¬«      D ]w  }|j                  d¬	«      }|j                  «       rt        |«      }||kD  r|}t        j                  d
|d   «      }|sŒSt        |j                  d«      «      dz   }||kD  sŒv|}Œy |j                  dd¬«      D ]F  }t        j                  d|d   «      }|sŒt        |j                  d«      «      dz  dz   }||kD  sŒE|}ŒH |}|j                  d«      }	|	r@t        j                  d|	j                  «       «      }|rt        |j                  d«      «      }t        d|› �t        j                  ¬«       t        r9|t        kD  r0t        dt        › dt        › d�t        j                  ¬«       t        }g }
t!        d|dz   «      D ]£  }t#        |«      }t        d|› d|› d|› �t        j                  ¬«       t        |«      } | st        d|› �t        j                  ¬«       Œ^t%        | «      }t        dt'        |«      › d|› �t        j                  ¬«       |
j)                  |«       Œ¥ t        dt'        |
«      › �t        j                  ¬«       t+        j,                  t.        «      }|j1                  «       }d}d}d}|
D �]ÿ  }|j3                  d|d   f«       |j5                  «       rŒ+t        d|d   d d  › d!�t        j                  ¬«       t        |d   «      } | s"t        d"|d   › �t        j                  ¬«       Œ‚t7        | |d   «      }|d   xs |d   }|d#   xs |d#   }|d$   }|d%   }t        j8                  d&d'|«      j;                  «       }t        j8                  d(d'|«      }t        j8                  d)d*|«      j;                  «       }|r|d d+ nd'}|s#|dz  }t        d,|› �t        j                  ¬«       d}|rVt        j                  d-|«      }|r>t        |j                  d«      |j                  d.«      z   |j                  d/«      z   «      }|rt=        j>                  |d0¬1«      nd2}	 |j3                  d3|t@        tB        |d   |||||f	«       |jD                  dkD  r|dz  }|t'        |«      z  }�Œ |jI                  «        |jK                  «        t        d7|› d8|› d9|› d:�«       y # tF        $ r/}t        d4|d d5 › d6|› �t        j                  ¬«       Y d }~�Œld }~ww xY w);Nz[ERROR] Cannot fetch list pager   r   r3   zdiv.pages-lr4   Tr5   r8   zindex_(\d+)\.htmr6   zpager\.offset=(\d+)r,   zdiv.pages-ru   å…±(\d+)é¡µz[INFO] Total pages: z[INFO] Limiting to z pages (--pages=ú)z[INFO] Fetching page rq   z: z[WARN] Empty response for page z[INFO] Found z items on page z[INFO] Total items from list: r   z'SELECT id FROM gov_raw WHERE page_url=?r   z[INFO] Fetching detail: r7   é2   z...z&[WARN] Cannot fetch detail, skipping: r;   rm   rn   u_   ^\s*(å�Žå®¹åŽ¿äººæ°‘æ”¿åºœ|å²³é˜³å¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€å�Žå®¹åˆ†å±€|ç”Ÿæ€�çŽ¯å¢ƒå±€å�Žå®¹åˆ†å±€)\s+r   r{   z\s+r|   éÈ   z[WARN] Empty content: z(\d{4})-(\d{2})-(\d{2})r*   é   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   u"   
[RESULT] å�Žå®¹åŽ¿-ä¸šåŠ¡ç®¡ç�†: z new, z empty content, z attachments)&r!   r-   r   r   r   Úexitr   r   r_   r?   ÚisdigitÚintr�   rt   rƒ   Ú_MAX_PGÚranger1   rG   ÚlenÚextendÚsqlite3ÚconnectÚDBÚcursorÚexecuteÚfetchoner”   r‚   r#   ÚjsonÚdumpsÚ	SITE_NAMEÚ
GROUP_NAMEÚrowcountr   ÚcommitÚclose)rA   Útotal_pagesrB   Ú	pages_divÚmax_pager4   ÚtextrK   rŠ   Ú
pages_textÚ	all_itemsÚpgr   rC   ÚconnÚcÚ	new_countÚempty_contentÚtotal_attachmentsÚitemÚdetailr7   rF   rm   rn   ÚplainÚsummaryÚ	date_rankÚatt_jsonr   s                                 r    ÚmainrÁ   À   s:  € ä”‹?€DÙÜÐ.´S·Z±ZÕ@Ü�‰�Œà€KÜ˜˜}Ó-€DØ—‘ Ó.€IÚØˆØ×#Ñ# C¨dÐ#Ó3ò 	!ˆAà—:‘: D�:Ó)ˆDØ�|‰|Œ~Ü˜“I�Ø�x’<Ø �Hä—	‘	Ð-¨q°©yÓ9ˆAÚÜ˜Ÿ™ ›
“O aÑ'�Ø�x“<Ø ‘Hð	!ð ×#Ñ# C¨dÐ#Ó3ò 	!ˆAÜ—	‘	Ð0°!°F±)Ó<ˆAÚÜ˜Ÿ™ ›
“O rÑ)¨AÑ-�Ø�x“<Ø ‘Hð	!ð ˆà—_‘_ ]Ó3ˆ
ÙÜ—	‘	˜.¨*×*=Ñ*=Ó*?Ó@ˆAÙÜ! !§'¡'¨!£*›o�ä	Ð   Ð
.´S·Z±ZÕ@å�;¤Ò(ÜÐ#¤G 9Ð,<¼W¸IÀQÐGÌcÏjÉjÕYÜˆà€IÜ�A�{ Q‘Ó'ò 	 ˆÜ˜2ÓˆÜÐ% 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Ó€DØ�‰‹€Aà€IØ€MØÐàó 1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ˆ	Ø˜Ñ#ˆØ˜]Ñ+ˆô —‘ÐyÐ{}ð  @Eó  F÷  Lñ  Ló  Nˆô —‘�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Ð!ùð_1Tðf 	‡K�K„MØ‡J�J„Lä	Ð/°	¨{¸&ÀÀÐO_Ð`qÐ_rÐr~Ð
õ  Aøô ò 	TÜÐ.¨u°S°b¨z¨l¸#¸a¸SÐAÌÏ
É
×SÓSûð	Tús   ÓAU	Õ		VÕ$U<Õ<VÚ__main__)(Ú__doc__r�   r   Úosr¨   Úurllib.requestr   Úurllib.errorÚurllib.parser   Úbs4r   r¢   r.   r-   rª   ÚSITE_DISPLAYÚenvironr>   r¤   r«   r   ÚcompileÚIrs   rž   Ú	enumerateÚargvrS   r4   r    r�   r!   r'   r1   rG   rh   r”   rÁ   Ú__name__© r(   r    ú<module>rÑ      s  ðá Hß × ß #Ý  Ý Û à'€ØÐ@Ñ@€Ø$€	Ø&€Ø‡Z�Z‡^�^�KÐ!2Ó3€Ø€
ØÐWÐ
X€àˆB�J‰JÐ?ÀÇÁÓF€	à
€Ù�c—h‘hÓò �D€A€qØˆIƒ~˜!˜a™%¡# c§h¡h£-Ó/Ù�c—h‘h˜q 1™u‘oÓ&ˆÙðò
ò	òpòò"ò,`_òFzAðz ˆzÒÙ…Fð r(   