Ë
    G«£jÈ#  ã            	       ó  — d Z ddlZddlm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
 ej                  ej                  j                  «       dZdZdZdZdZd	Zd
ZddiZ ej,                  «       Zej0                  j3                  e«       de_        dd„Zd„ Zdd„Zd„ Zd„ Zdd„Z e!dk(  rbddl"Z" e"jF                  «       Z$e$jK                  de&d¬«       e$jO                  «       Z( e e(jR                  ¬«      \  Z*Z+ e,de› de*› de+› d�«       yy) u~   
crawl_linzi.py - ä¸´æ·„ç”Ÿæ€�çŽ¯å¢ƒåˆ†å±€-æ‹Ÿå�—ç�†ï¼ˆçŽ¯è¯„å�—ç�†å…¬ç¤ºï¼‰
æ·„å�šå¸‚æ”¿åŠ¡å…¬å¼€å¹³å�° - é€šè¿‡CDN IPè®¿é—®
é    N©ÚBeautifulSoupzhttp://www.linzi.gov.cnzL/gongkai/site_lzqsthjj/channel_c_5f9f6cdc1ebfe2f7fcddefe1_n_1605681498.3499/z221.194.141.170iÌ  z/root/search.dbu"   ä¸´æ·„ç”Ÿæ€�çŽ¯å¢ƒåˆ†å±€-æ‹Ÿå�—ç�†g      à?z
User-AgentzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36Fc                 óÄ   — | j                  dt        «      }ddi}	 t        j                  |||d¬«      }d|_        |S # t
        $ r}t        d|› �«       Y d}~yd}~ww xY w)z!Fetch via CDN IP with Host headerzwww.linzi.gov.cnÚHosté   )ÚheadersÚparamsÚtimeoutzutf-8z  [NET ERR] N)ÚreplaceÚCDN_IPÚsessionÚgetÚencodingÚ	ExceptionÚprint)Úurlr	   Úreal_urlr   ÚrespÚes         úcrawl_linzi.pyÚget_pager   "   sg   € à�{‰{Ð-¬vÓ6€HØÐ)Ð*€GðÜ�{‰{˜8¨W¸VÈRˆ{ÓPˆØˆŒØˆøÜò Ü�˜Q˜CÐ Ô!Üûðús   œ!> ¾	AÁAÁAc                 ó~  — g }t        j                  d| t         j                  «      D �]  }|j                  d«      }t        j                  dd|j                  d«      «      j                  «       }t        j                  dd|«      j                  «       }| |j                  «       |j                  «       dz    }t        j                  d	|«      }|r|j                  d«      nd}|j                  d
«      r
t        |z   }n%|j                  d«      rd|vrŒî|}nt        d
z   |z   }|j                  |||dœ«       �Œ |S )zParse article list from HTMLz7<a[^>]*href="([^"]*doc_[a-f0-9]+\.html)"[^>]*>(.*?)</a>é   ú<[^>]+>Ú é   ú\s+ú éÈ   z)zfxxgk-list-time[^>]*>(\d{4}-\d{2}-\d{2})ú/Úhttpúlinzi.gov.cn)Útitler   Údate)ÚreÚfinditerÚDOTALLÚgroupÚsubÚstripÚendÚsearchÚ
startswithÚBASE_URLÚappend)	ÚhtmlÚitemsÚmÚhrefr#   Ú	ctx_afterÚdate_mÚdate_strr   s	            r   Ú
parse_listr7   /   s  € à€EÜ�[‰[ØBØÜ
�	‰	óó Eˆð
 �w‰w�q‹zˆÜ—‘�z 2 q§w¡w¨q£zÓ2×8Ñ8Ó:ˆÜ—‘�v˜s EÓ*×0Ñ0Ó2ˆà˜Ÿ™› 1§5¡5£7¨S¡=Ð1ˆ	Ü—‘ÐGÈÓSˆÙ&,�6—<‘< ”?°"ˆð �?‰?˜3ÔÜ˜T‘/‰CØ�_‰_˜VÔ$Ø TÑ)ØØ‰Cä˜S‘. 4Ñ'ˆCà�‰˜u¨S¸(ÑCÖDð/Eð2 €Ló    c                 óØ  — ddl m}  |t        | «      d«      }|j                  d«      D ]P  }|j	                  dd«      }|sŒ|j                  d«      rŒ*|r t        j                  j                  ||«      n||d<   ŒR |j                  d«      D ]P  }|j	                  d	d«      }|sŒ|j                  d
«      rŒ*|r t        j                  j                  ||«      n||d	<   ŒR t        |«      S )uA   ä¿�ç•™ HTML è¡¨æ ¼ç»“æž„ï¼Œä»…å°†ç›¸å¯¹é“¾æŽ¥/å›¾ç‰‡è½¬ç»�å¯¹ URLr   r   zhtml.parserÚar3   r   )r!   Ú
javascriptú#ÚimgÚsrc)r!   z//zdata:)	Úbs4r   ÚstrÚfind_allr   r-   ÚurllibÚparseÚurljoin)ÚtableÚbase_urlr   Útblr:   r3   r=   r>   s           r   Úhtml_table_to_htmlrH   N   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€Or8   c                 óÐ  — ddddœ}t        j                  d| «      }|r"|j                  d«      j                  «       |d<   t        j                  d| «      }|rJ|j                  d«      j                  «       }t        j                  d|«      }|r|j                  «       |d<   t        j                  d	| t         j                  «      }|s|S |j                  d«      }g }d
}	|	t        |«      k  �rÔt        j                  d||	d t         j                  «      }
|
r¢t        j                  dd|
j                  d«      «      j                  «       }t        j                  dd|«      j                  «       }|j                  dd«      j                  dd«      }|r|j                  |«       |	|
j                  «       z  }	ŒÛt        j                  d||	d t         j                  «      }|rD|j                  d
«      }t        |«      }|r|j                  |«       |	|j                  «       z  }	�ŒIt        j                  d||	d t         j                  «      }|rU|j                  d«      }|j                  d«      s	t        |z   }|j                  d|› d�«       |	|j                  «       z  }	�ŒÈt        j                  d||	d t         j                  «      }|r|t        j                  dd|j                  d«      «      j                  «       }|j                  dd«      j                  «       }|r|j                  |«       |	|j                  «       z  }	�Œnt        j                  d||	d «      }|r|	|j                  «       z  }	�Œžt        j                  d||	d «      }|r|	|j                  «       z  }	�ŒÎ|	dz  }	|	t        |«      k  r�ŒÔdj                  |«      j                  «       |d<   |S )z5Parse article detail - handles p, table, img in orderr   )r#   r$   Úcontentz/<meta\s+name="ArticleTitle"\s+content="([^"]*)"r   r#   z*<meta\s+name="PubDate"\s+content="([^"]*)"z\d{4}-\d{2}-\d{2}r$   z.<div[^>]*id="details-content"[^>]*>(.*?)</div>r   z<p[^>]*>(.*?)</p>Nr   r   r   z&nbsp;z&mdash;u   â€”z9(?:<div[^>]*>\s*)?<table[^>]*>(.*?)</table>(?:\s*</div>)?z<img[^>]*src="([^"]+)"[^>]*>r!   u
   ![å›¾ç‰‡](ú)z<(h[23])[^>]*>(.*?)</\1>r   z

rJ   )r%   r,   r(   r*   r'   ÚlenÚmatchr)   r   r/   r+   rH   r-   r.   Újoin)r0   ÚresultÚm_titleÚm_dateÚrawÚdmrM   Úcontent_htmlÚpartsÚposÚp_matchÚp_textÚtable_matchÚ
table_htmlÚmd_tableÚ	img_matchr>   Úh_matchÚh_textÚ	tag_matchÚws_matchs                        r   Úparse_detailra   ]   sq  € à 2°"Ñ5€Fô �i‰iÐJÈDÓQ€GÙØ!Ÿ-™-¨Ó*×0Ñ0Ó2ˆˆw‰ä�Y‰YÐDÀdÓK€FÙØ�l‰l˜1‹o×#Ñ#Ó%ˆÜ�Y‰YÐ+¨SÓ1ˆÙØŸX™X›ZˆF�6‰Nô �I‰IØ9¸4ÄÇÁó€Eñ Øˆà—;‘;˜q“>€LØ€Eð €CØ
”�LÓ!Ó
!ä—(‘(Ð/°¸c¸dÐ1CÄRÇYÁYÓOˆÙÜ—V‘V˜J¨¨G¯M©M¸!Ó,<Ó=×CÑCÓEˆFÜ—V‘V˜F C¨Ó0×6Ñ6Ó8ˆFØ—^‘^ H¨cÓ2×:Ñ:¸9ÀeÓLˆFÙØ—‘˜VÔ$Ø�7—;‘;“=Ñ ˆCØô —h‘hØHØ˜˜ÐÜ�I‰Ió
ˆñ
 Ø$×*Ñ*¨1Ó-ˆJÜ)¨*Ó5ˆHÙØ—‘˜XÔ&Ø�;—?‘?Ó$Ñ$ˆCÙô —H‘HØ+¨\¸#¸$Ð-?ÄÇÁó
ˆ	ñ Ø—/‘/ !Ó$ˆCØ—>‘> &Ô)Ü ‘n�Ø�L‰L˜: c U¨!Ð,Ô-Ø�9—=‘=“?Ñ"ˆCÙô —(‘(Ø'¨°c°dÐ);¼R¿Y¹Yó
ˆñ Ü—V‘V˜J¨¨G¯M©M¸!Ó,<Ó=×CÑCÓEˆFØ—^‘^ H¨cÓ2×8Ñ8Ó:ˆFÙØ—‘˜VÔ$Ø�7—;‘;“=Ñ ˆCÙô —H‘H˜Z¨°c°dÐ);Ó<ˆ	ÙØ�9—=‘=“?Ñ"ˆCÙô —8‘8˜F L°°Ð$6Ó7ˆÙØ�8—<‘<“>Ñ!ˆCÙð 	ˆq‰ˆð ”�LÓ!Ô
!ðB Ÿ™ EÓ*×0Ñ0Ó2€Fˆ9ÑØ€Mr8   c                 ó¶  — t        j                  t        «      }|j                  «       }	 |j	                  d| t
        f«       |j                  «       r|j                  «        y|d d }d|v rdnd}|j	                  d| ||t
        |d||f«       |j                  «        |j                  «        y	# t        $ r}|j                  «        d
|› �cY d }~S d }~ww xY w)Nz7SELECT id FROM gov_raw WHERE page_url=? AND site_name=?Úskipr   z| ---r   r   z«INSERT OR REPLACE INTO gov_raw
            (page_url, title, publish_date, site_name, content, attachments, summary, has_table)
            VALUES (?, ?, ?, ?, ?, ?, ?, ?)r   Únewzerror:)
Úsqlite3ÚconnectÚDB_PATHÚcursorÚexecuteÚ	SITE_NAMEÚfetchoneÚcloseÚcommitr   )	r   r#   r$   rJ   ÚconnÚcÚsummaryÚ	has_tabler   s	            r   Ú
save_to_dbrr   ¿   sÊ   € Ü�?‰?œ7Ó#€DØ�‰‹€AðØ	�	‰	ØEØ”)Ðô	
ð �:‰:Œ<Ø�J‰JŒLØà˜$˜3�-ˆØ  GÑ+‘A°ˆ	Ø	�	‰	ð/ð �%˜œy¨'°2°wÀ	ÐJô		
ð 	�‰ŒØ�
‰
ŒØøÜò Ø�
‰
ŒØ˜�sˆ|Õûðús$   «8B0 Á$AB0 Â0	CÂ9CÃCÃCé   c           	      óˆ  — t         dz   dz  }d}d}t        dt        | dz   |dz   «      «      D �]  }dt        |«      ddœ}t	        t
        t        z   |¬«      }|�|j                  d	k7  rt        d
|› d�«       ŒLt        |j                  «      }|st        d
|› d�«       Œst        d|› dt        |«      › d�«       d}|D �]F  }	d|	d   vr|dz  }Œt	        |	d   «      }
|
�|
j                  d	k7  rt        d|	d   d d › �«       |dz  }ŒJt        |
j                  «      }|j                  dd«      }|st        d|	d   d d › �«       |dz  }Œ�|j                  d«      xs |	d   }|j                  d«      xs |	j                  dd«      }t        |	d   |||«      }|dk(  r|dz  }d}t        d|d d › �«       n5|dk(  r|dz  }t        d|d d › �«       n|dz  }t        d |d d › d!|› �«       t        j                   t"        «       �ŒI |s|dkD  rt        d"|› d#�«        ||fS t        j                   t"        «       �Œ ||fS )$Né	   é
   r   r   ÚfdzdgknrÚ10)ÚopenÚnr_pageÚnr_per_page)r	   r   z[WARN] Page z failedz has no itemsz[LIST] Page ú: z itemsFr"   r   z  [FAIL] HTTP ?: r#   é2   rJ   r   z
  [EMPTY] r$   rd   Tz  [OK] é<   rc   z	  [SKIP] z  [ERR] z - z[INFO] Page z no new content, stopping)ÚTOTAL_ITEMSÚrangeÚminr@   r   r.   Ú	LIST_PATHÚstatus_coder   r7   ÚtextrL   ra   r   rr   ÚtimeÚsleepÚSLEEP)ÚpagesÚ	max_pagesÚ	total_newÚ
total_skipÚpager	   r   r1   Úhas_contentÚitemÚresp2ÚdetailrJ   r#   r$   rO   s                   r   Úcrawlr‘   Û   s—  € Ü˜q‘ RÑ'€IØ€IØ€Jä�aœ˜U Q™Y¨	°A©Ó6Ó7ó 6ˆØ$´°T³È4ÑPˆÜœ¤9Ñ,°VÔ<ˆØˆ<˜4×+Ñ+¨sÒ2Ü�L   gÐ.Ô/Øä˜4Ÿ9™9Ó%ˆÙÜ�L   mÐ4Ô5Øä�˜T˜F "¤S¨£Z L°Ð7Ô8Øˆàó !	ˆDØ T¨%¡[Ñ0Ø˜a‘�
Øä˜T %™[Ó)ˆEØˆ} × 1Ñ 1°SÒ 8ÜÐ)¨$¨w©-¸¸Ð*<Ð)=Ð>Ô?Ø˜a‘�
Øä! %§*¡*Ó-ˆFØ—j‘j ¨BÓ/ˆGÙÜ˜
 4¨¡=°°"Ð#5Ð"6Ð7Ô8Ø˜a‘�
Øà—J‘J˜wÓ'Ò8¨4°©=ˆEØ—:‘:˜fÓ%Ò=¨¯©°&¸"Ó)=ˆDä  U¡¨U°D¸'ÓBˆFØ˜ŠØ˜Q‘�	Ø"�Ü˜  c r 
˜|Ð,Õ-Ø˜6Ò!Ø˜a‘�
Ü˜	 %¨¨ * Ð.Õ/à˜a‘�
Ü˜  s¨  ¨C°¨xÐ8Ô9ä�J‰J”uÖðC!	ñF ˜t ašxÜ�L  Ð&?Ð@ÔAØð �jÐ Ð ô 	�
‰
”5Öðm6ðp �jÐ Ð r8   Ú__main__z--pages)ÚtypeÚdefault)rˆ   z

[RESULT] r|   z new, z skip)N)r   )rs   )-Ú__doc__Úrequestsr?   r   r%   re   Úsysr…   Úurllib3Úurllib.parserB   Údisable_warningsÚ
exceptionsÚInsecureRequestWarningr.   r‚   r   r   rg   rj   r‡   ÚHEADERSÚSessionr   r   ÚupdateÚverifyr   r7   rH   ra   rr   r‘   Ú__name__ÚargparseÚArgumentParserÚparserÚadd_argumentÚintÚ
parse_argsÚargsrˆ   rd   rc   r   © r8   r   ú<module>rª      s5  ðñó Ý Û 	Û Û 
Û Û Û à €× Ñ ˜×+Ñ+×BÑBÔ Cà$€ØZ€	Ø	€Ø€Ø
€Ø0€	Ø€ð ð  Dð€ð ˆ(×
Ñ
Ó
€Ø ‡�× Ñ �wÔ Ø€„ó
òó>ò_òDó8=!ð@ ˆzÒÛà$ˆX×$Ñ$Ó&€FØ
×Ñ˜	¨°QÐÔ7Ø×ÑÓ€Dá˜DŸJ™JÔ'�I€CˆÙ	ˆK˜	�{ " S E¨°¨v°UÐ
;Õ<ð r8   