Ë
    ¸¬uj°  ã                   ó´   — 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Z	dZ
dZdZdZd	Zd
Zde	dz   dœZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)uB   Crawl sthjj.huainan.gov.cn - æ·®å�—å¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€ çŽ¯è¯„å…¬ç¤ºé    N)Údatetimezhttps://sthjj.huainan.gov.cnÚhn_sthj_hpgsz/root/search.dbÚ18125225é   é   i³  z<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36ú/hbyw/xmgl/hpgs/index.html)z
User-AgentÚRefererc                 óÐ   — t         j                  j                  | t        ¬«      }t         j                  j	                  |d¬«      }|j                  «       j                  dd¬«      S )N)Úheadersé   )Útimeoutzutf-8Úreplace)Úerrors)ÚurllibÚrequestÚRequestr   ÚurlopenÚreadÚdecode)ÚurlÚreqÚresps      ú"/root/gov_crawler/crawl_hn_sthj.pyÚfetchr      sP   € Ü
�.‰.×
 Ñ
  ¬gÐ
 Ó
6€CÜ�>‰>×!Ñ! #¨rÐ!Ó2€DØ�9‰9‹;×Ñ˜g¨iÐÓ8Ð8ó    c                 ó†  — g }t        j                  dt         j                  «      }|j                  | «      D ]†  }|j	                  d«      }|j	                  d«      j                  «       }|j	                  d«      }|sŒG|sŒJt        |«      dkD  sŒY|j                  d«      s	t        |z   }|j                  |||f«       Œˆ |S )z/Extract (title, url, date) from list page HTML.zkhref="([^"]+)"[^>]*title="([^"]*)"[^>]*>.*?</a>\s*<span[^>]*class="[^"]*date[^"]*"[^>]*>(\d{4}-\d{2}-\d{2})é   é   é   é   Úhttp)
ÚreÚcompileÚSÚfinditerÚgroupÚstripÚlenÚ
startswithÚBASEÚappend)ÚhtmlÚitemsÚpatternÚmÚhrefÚtitleÚdates          r   Úextract_itemsr3      s©   € à€Eä�j‰jØvÜ
�‰ó€Gð ×Ñ˜dÓ#ò .ˆØ�w‰w�q‹zˆØ—‘˜“
× Ñ Ó"ˆØ�w‰w�q‹zˆÚ’Eœc %›j¨1›nØ—?‘? 6Ô*Ü˜d‘{�Ø�L‰L˜%  tÐ,Õ-ð.ð €Lr   c                 óˆ  — t        j                  dd| t         j                  ¬«      }t        j                  dd|t         j                  ¬«      }t        j                  dd|t         j                  ¬«      }t        j                  dd|t         j                  ¬«      }t        j                  d	d|t         j                  ¬«      }t        j                  d
d|«      }|j                  d«      D �cg c]  }|j	                  «       ‘Œ }}dj                  |«      }t        j                  d
d|«      }|j	                  «       S c c}w )z4Extract text from HTML, preserving paragraph breaks.z</p>ú

)Úflagsz	<br\s*/?>ú
ú</div>z*</?(?:b|span|font|strong|em|u|i|a)\b[^>]*>Ú z
<p\b[^>]*>z\n{3,})r"   ÚsubÚIÚsplitr'   Újoin)Ú
html_chunkÚtextÚlÚliness       r   Úextract_clean_textrB   +   sã   € ä�6‰6�'˜6 :´R·T±TÔ:€DÜ�6‰6�,  d´"·$±$Ô7€DÜ�6‰6�)˜V T´·±Ô6€DÜ�6‰6Ð?ÀÀTÔQS×QUÑQUÔV€DÜ�6‰6�-  T´·±Ô6€DÜ�6‰6�)˜V TÓ*€DØ $§
¡
¨4Ó 0Ö1˜1ˆQ�W‰W�YÐ1€EÐ1Ø�9‰9�UÓ€DÜ�6‰6�)˜V TÓ*€DØ�:‰:‹<Ðùò 2s   Ã.D?c                 óð  — g }t        j                  d| t         j                  «      }|D ]G  \  }}|j                  d«      r|nt        |z   }|j                  d|j                  «       › d|› d�«       ŒI |sqt        j                  d| t         j                  «      }|D ]G  \  }}|j                  d«      r|nt        |z   }|j                  d|j                  «       › d|› d�«       ŒI dj                  |«      S )z-Extract attachment links, return as markdown.z5<a\s[^>]*href="([^"]*download[^"]*)"[^>]*>([^<]+)</a>r!   ú[z](ú)zK<a\s[^>]*href="([^"]+\.(?:pdf|doc|docx|xls|xlsx|zip|rar))"[^>]*>([^<]+)</a>r7   )r"   Úfindallr;   r)   r*   r+   r'   r=   )r,   ÚpartsÚlinksr0   ÚnameÚfull_urlÚlinks2s          r   Úextract_attachmentsrL   9   sé   € à€EÜ�J‰JØ@ØŒb�d‰dó€Eð ò 6‰
ˆˆdØŸ?™?¨6Ô2‘4¼¸t¹ˆØ�‰�q˜Ÿ™›˜ b¨¨
°!Ð4Õ5ð6ñ ä—‘ØZØ”"—$‘$ó
ˆð !ò 	:‰JˆD�$Ø#Ÿ™¨vÔ6‘t¼DÀ4¹KˆHØ�L‰L˜1˜TŸZ™Z›\˜N¨"¨X¨J°aÐ8Õ9ð	:ð �9‰9�UÓÐr   c                 ó  — t        | «      }d}t        j                  d|«      }|r4t        j                  dd|j	                  d«      «      j                  «       }d}t        j                  d|«      }|r|j	                  d«      }|s)t        j                  d|«      }|r|j	                  d«      }d}t        j                  d|«      }|r|j	                  d«      j                  «       }d}	|j                  d«      }
|
d	k  r|j                  d
«      }
|
d	kD  rÐ|j                  dd	|
«      }|d	k  r|
}|j                  d|
«      dz   }d}|}|d	kD  r{|t        |«      k  rm|j                  d|«      }|j                  d|«      }|d	k  rnC|d	k\  r ||k  r|dz  }|j                  d|«      dz   }n
|dz  }|dz   }|d	kD  r|t        |«      k  rŒm|d	k(  r|||dz
   n||d }t        |«      }	t        |«      }|r|	r|	dz  }	|	|z  }	|||	|fS )z4Get (title, date, content, source) from detail page.r9   z<title>([^<]+)</title>u   \s*[-â€“â€”|_].*$r   u(   å�‘å¸ƒæ—¥æœŸ[ï¼š:]\s*(\d{4}-\d{2}-\d{2})z!(\d{4}-\d{2}-\d{2})\s+\d{2}:\d{2}u   æ�¥æº�[ï¼š:]\s*([^<]+)zclass="wzconr   zclass="j-fontContentz<divú>r8   é   Nr5   )r   r"   Úsearchr:   r&   r'   ÚfindÚrfindr(   rB   rL   )r   r,   r1   Útmr2   ÚdmÚdm2ÚsourceÚsmÚcontentÚidxÚstartÚposÚdepthÚendÚnoÚncÚchunkÚatts                      r   Ú
get_detailrb   O   s  € ä�‹:€Dð €EÜ	�‰Ð,¨dÓ	3€BÙ	Ü—‘Ð+¨R°·±¸!³Ó=×CÑCÓEˆð €DÜ	�‰Ð>ÀÓ	E€BÙ	Ø�x‰x˜‹{ˆÙÜ�i‰iÐ<¸dÓCˆÙØ—9‘9˜Q“<ˆDð €FÜ	�‰Ð,¨dÓ	3€BÙ	Ø—‘˜!“×"Ñ"Ó$ˆð €GØ
�)‰)�NÓ
#€CØ
ˆQ‚wØ�i‰iÐ.Ó/ˆØ
ˆQ‚wØ—
‘
˜6 1 cÓ*ˆØ�1Š9ØˆEØ�i‰i˜˜SÓ! AÑ%ˆàˆØˆØ�aŠi˜C¤# d£)šOØ—‘˜6 3Ó'ˆBØ—‘˜8 SÓ)ˆBØ�AŠvØØ�QŠw˜2 š7Ø˜‘
�Ø—i‘i  RÓ(¨1Ñ,‘à˜‘
�Ø˜1‘f�ð �aŠi˜C¤# d£)›Oð $)¨A¢:��S˜˜Q™‘°4¸¸°:ˆÜ$ UÓ+ˆô ˜dÓ
#€CÙ
ÙØ�vÑˆGØ�3‰ˆà�$˜ Ð'Ð'r   c                 ób  — | syt        j                  t        «      }|j                  d«       |j	                  «       }d}| D ]Ú  }|j                  d|d   f«      j                  «       }|rt        d|d   d d › �«       Œ>|d   xs d	d d
 }|j                  dt        |d   |d   |d   |d   |d   r0t        t        j                  |d   d«      j                  «       «      nd|d d |f«       |j                  «        |dz  }t        d|d   d d › d|d   › �«       ŒÜ |j                  «        |S )Nr   zPRAGMA busy_timeout=30000z)SELECT id FROM gov_raw WHERE source_url=?r   z  SKIP: r1   é(   rX   r9   iˆ  zŒINSERT INTO gov_raw (site_name, source_url, page_url, title, publish_date, date_rank, summary, content)
            VALUES (?,?,?,?,?,?,?,?)r2   z%Y-%m-%déÈ   r   z  OK: é2   z | )Úsqlite3ÚconnectÚDB_PATHÚexecuteÚcursorÚfetchoneÚprintÚ	SITE_NAMEÚintr   ÚstrptimeÚ	timestampÚcommitÚclose)ÚrecordsÚconnÚcÚcountÚrÚexistingrX   s          r   Ú
save_to_dbrz   �   sF  € ÙØÜ�?‰?œ7Ó#€DØ‡L�LÐ,Ô-Ø�‰‹€AØ€EØò 8ˆØ—9‘9ÐHÈ1ÈUÉ8È+ÓV×_Ñ_ÓaˆÙÜ�H˜Q˜w™Z¨¨˜_Ð-Ð.Ô/ØØ�Y‘<Ò% 2 u¨Ð-ˆØ	�	‰	ð (ä˜˜%™ ! E¡(¨A¨g©J¸¸&¹	ØJKÈFÊ)ŒS”×"Ñ" 1 V¡9¨jÓ9×CÑCÓEÔFÐYZØ�T�cˆ]˜Gð%ô	&ð
 	�‰ŒØ�‰
ˆÜ��q˜‘z # 2�Ð' s¨1¨V©9¨+Ð6Õ7ð8ð 	‡J�J„LØ€Lr   c                  ó„  — t        dt        › d�«       g } t        t        dz   «      }t	        |«      }t        dt        |«      › d�«       | j                  |«       t        dt        dz   «      D ]~  }t        › dt        › d	|› �}	 t        |«      }t	        |«      }|st        d
|› d�«        nBt        d
|› dt        |«      › d�«       | j                  |«       t        | «      t        k\  r nŒ€ t        dt        | «      › d�«       t        «       }g }| D ]0  \  }	}}
||vsŒ|j                  |«       |j                  |	||
f«       Œ2 t        dt        |«      › d�«       g }t        |«      D ]]  \  }\  }	}}
t        d|dz   › dt        |«      › d|	d d › d�«       	 t!        |«      \  }}}}|j                  |xs |	||xs |
||dœ«       Œ_ t#        |«      }t        d|› dt        |«      › d�«       y # t        $ r}t        d
|› d|› �«       Y d }~ �Œ&d }~ww xY w# t        $ r}t        d|› �«       Y d }~ŒÌd }~ww xY w)Nz=== Crawling z ===r   zPage 1: z itemsr   r   z/content/column/z?pageIndex=zPage z: no items, stoppingz: z
: error - z
=== Total: z
 items ===zUnique: z
[ú/z] rf   z...)r1   r   r2   rX   rV   z	  ERROR: z
=== Complete: z new records ===)rm   rn   r   r*   r3   r(   ÚextendÚrangeÚ	MAX_PAGESÚ	COLUMN_IDÚMAX_ARTICLESÚ	ExceptionÚsetÚaddr+   Ú	enumeraterb   rz   )Ú	all_itemsÚhtml1r-   Úpager   r,   ÚeÚseenÚuniquer1   r2   rt   ÚiÚd_titleÚd_daterX   rV   Úsaveds                     r   Úmainr�   ¨   sw  € Ü	ˆMœ)˜ DÐ
)Ô*à€Iô ”$Ð5Ñ5Ó6€EÜ˜%Ó €EÜ	ˆH”S˜“Z�L Ð
'Ô(Ø×Ñ�UÔô �aœ Q™Ó'ò ˆÜ�Ð&¤y k°¸T¸FÐCˆð	Ü˜“:ˆDÜ! $Ó'ˆEÙÜ˜˜d˜VÐ#7Ð8Ô9ÙÜ�E˜$˜˜r¤# e£* ¨VÐ4Ô5Ø×Ñ˜UÔ#Ü�9‹~¤Ò-Ùð .ðô  
ˆMœ#˜i›.Ð)¨Ð
4Ô5ô ‹5€DØ€FØ%ò .Ñˆˆs�DØ�dŠ?Ø�H‰H�SŒMØ�M‰M˜5 # tÐ,Õ-ð.ô 
ˆH”S˜“[�M Ð
(Ô)ð €GÜ!*¨6Ó!2ò #ÑˆÑˆE�3˜Ü��A�a‘C�5˜œ#˜f›+˜ b¨¨s°¨¨°CÐ8Ô9ð
	#Ü/9¸#«Ñ,ˆG�V˜W fØ�N‰NØ Ò) EØØš $Ø"Ø ñõ ð	#ô �wÓ€EÜ	Ð˜U˜G 1¤S¨£\ NÐ2BÐ
CÕDøôA ò 	Ü�E˜$˜˜z¨!¨Ð-Ô.Þûð	ûô8 ò 	#Ü�I˜a˜S�/×"Ñ"ûð	#ús6   Â'G5Â.>G5Æ/HÇ5	HÇ>HÈHÈ	H?È'H:È:H?Ú__main__)Ú__doc__Úsysr"   rg   Úurllib.requestr   Úurllib.errorÚ	tracebackr   r*   rn   ri   r€   ÚPER_PAGEr   r�   r   r   r3   rB   rL   rb   rz   r�   Ú__name__© r   r   ú<module>rš      s‡   ðá Hß @× @× @Ý à%€Ø€	Ø
€Ø€	Ø€Ø€	Ø€ð QØÐ2Ñ2ñ€ò
9ò
ò&òò,=(ò@ò28Eðv ˆzÒÙ…Fð r   