Ë
    9JŠjN"  ã                   óx  — 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mZmZ ddlm	Z	 dZ
dZdZdZd	d
ddœZd„ Zdd„Zd„ Zd„ Zd„ Zd d„Zedk(  roddlZ ej.                  d¬«      Zej3                  dedd¬«       ej3                  ddd¬«       ej7                  «       Z eej:                  ej<                  ¬«       yy)!u™   å¼ æŽ–ç»�æµŽæŠ€æœ¯å¼€å�‘åŒº - é€šçŸ¥å…¬å‘Šçˆ¬è™«
ç«™ç‚¹: www.zhangye.gov.cn
æ �ç›®: /jjkfq/gzdt/tzgg/ (é€šçŸ¥å…¬å‘Š)
CMS: TRS (Terton) - æ ‡å‡†TRSåˆ†é¡µ
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoupzhttp://www.zhangye.gov.cnz/jjkfq/gzdt/tzgg/z/root/search.dbzwww.zhangye.gov.cn-jjkfq-tzggzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36z`text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8zzh-CN,zh;q=0.9,en;q=0.8)z
User-AgentÚAcceptzAccept-Languagec                  óZ   — t        j                  t        «      } | j                  d«       | S )NzPRAGMA journal_mode=WAL)Úsqlite3ÚconnectÚDB_PATHÚexecute)Úconns    ú"/root/gov_crawler/crawl_zy_tzgg.pyÚinit_dbr      s"   € Ü�?‰?œ7Ó#€DØ‡L�LÐ*Ô+Ø€Kó    c                 óì   — 	 t        j                  | t        |d¬«      }d|_        |j                  dk(  r|j
                  S y # t        $ r(}t        d|› �t        j                  ¬«       Y d }~y d }~ww xY w)NF)ÚheadersÚtimeoutÚverifyzutf-8éÈ   z  [ERROR] fetch failed: )Úfile)
ÚrequestsÚgetÚHEADERSÚencodingÚstatus_codeÚtextÚ	ExceptionÚprintÚsysÚstderr)Úurlr   ÚrespÚes       r   Ú
fetch_pager#       sf   € ðÜ�|‰|˜C¬¸'È%ÔPˆØˆŒØ×Ñ˜sÒ"Ø—9‘9ÐØøÜò ÜÐ(¨¨Ð,´3·:±:Õ>Üûðús   ‚>A Á	A3ÁA.Á.A3c                 óV  — g }t        | d«      }|j                  dd¬«      }|s|S |j                  dd¬«      D �]l  }|j                  d«      }|r|j                  d	«      sŒ)|d	   j	                  «       }|j                  d
«      sŒN|j                  d«      rt        t        z   |dd z   }n!|j                  d«      st        t        z   |z   }|j                  d¬«      }|j                  d«      }	d}
|	r2|	j                  d¬«      }
|j                  |
d«      j	                  «       }t        j                  dd|«      j	                  «       }t        j                  dd|«      }|s�Œ-t        j                  d|
«      }|r|j                  d«      nd}
|j                  |||
dœ«       �Œo |S )u2   è§£æž�åˆ—è¡¨é¡µï¼Œè¿”å›ž (url, title, date) åˆ—è¡¨úhtml.parserÚulÚ	news_list©Úclass_ÚliF)Ú	recursiveÚaÚhrefú.htmlz./é   NÚhttpT©ÚstripÚspanÚ z</?TRS_DOCUMENT>z\s+ú ú(\d{4}-\d{2}-\d{2})é   )r    ÚtitleÚpub_date)r   ÚfindÚfind_allr   r2   ÚendswithÚ
startswithÚBASE_URLÚ	LIST_PATHÚget_textÚreplaceÚreÚsubÚsearchÚgroupÚappend)ÚhtmlÚpage_numÚitemsÚsoupr&   r*   r,   r-   Ú
title_textÚ	date_spanr9   Ú
date_matchs               r   Ú
parse_listrN   +   s‰  € à€EÜ˜˜}Ó-€DØ	�‰�4 ˆÓ	,€BÙØˆØ�k‰k˜$¨%ˆkÓ0ó OˆØ�G‰G�C‹LˆÙ˜Ÿ™˜fœØØ�‰y�‰Ó ˆØ�}‰}˜WÔ%ØØ�?‰?˜4Ô ÜœiÑ'¨$¨q¨r¨(Ñ2‰DØ—‘ Ô(ÜœiÑ'¨$Ñ.ˆDà—Z‘Z d�ZÓ+ˆ
Ø—F‘F˜6“Nˆ	ØˆÙØ ×)Ñ)°Ð)Ó5ˆHØ#×+Ñ+¨H°bÓ9×?Ñ?ÓAˆJÜ—V‘VÐ/°°ZÓ@×FÑFÓHˆ
Ü—V‘V˜F C¨Ó4ˆ
ÙÙÜ—Y‘YÐ5°xÓ@ˆ
Ù*4�:×#Ñ# AÔ&¸"ˆà�‰˜T¨JÀHÑMÖNð3Oð4 €Lr   c                 ó�  ‡— t        | d«      }|j                  dd¬«      }|r|j                  d¬«      nd}|sL|j                  d«      }|r9|j                  d¬«      }t        j                  d	d|«      }|j                  «       }d}|j                  d
d¬«      }|r;|j                  d¬«      }	t        j                  d|	«      }
|
r|
j                  d«      }|j                  dd¬«      }|s|j                  dd¬«      }|s(|j                  dd¬«      }|r|j                  dd¬«      }g }d}d}|�rR|j                  d«      D ]¡  }|j                  dd«      Št        ˆfd„dD «       «      sŒ*‰j                  d«      s t        j                  j                  |‰«      Š|j                  d¬«      xs t        j                   j#                  ‰«      }|j%                  ‰|dœ«       Œ£ |j                  ddg«      D ]  }|j'                  «        Œ t)        |«      }t        j                  dd|t        j*                  ¬«      }t        j                  dd|t        j*                  ¬«      }t        |d«      }t-        «       }|j                  d«      D ]˜  }|j                  d«      }t        d „ |D «       «      }|sŒ)|r|d!   nd"}|r,|j                  d#d$g«      }|rt/        d%„ |D «       «      nd&}|sŒ`|j                  d¬«      }||v rŒw|j1                  |«       |t)        |«      d'z   z  }Œš |j                  d«      D ]  }|j'                  «        Œ |j                  d'd¬(«      }t        j                  d)d'|«      }|r|d*|z   z  }t3        |j                  «       «      d+k  r"d,|› d-|› d.�}|D ]  }|d/|d   › d0|d1   › d2�z  }Œ ||||fS )3u   è§£æž�è¯¦æƒ…é¡µr%   Úh1Údetails_titler(   Tr1   r4   r8   u)   ^å¼ æŽ–ç»�æµŽæŠ€æœ¯å¼€å�‘åŒº[-ï¼�â€”]?\s*ÚpÚsecond_titler6   r7   Údivzview TRS_UEDITORÚTRS_UEDITORÚnews_contentÚviewr,   r-   c              3   ó@   •K  — | ]  }‰j                  |«      –— Œ y ­w)N)r<   )Ú.0Úextr-   s     €r   ú	<genexpr>zparse_detail.<locals>.<genexpr>r   s    øè ø€ ò  F¨#�4—=‘= ×%ñ  Fùs   ƒ)
z.docz.docxz.pdfz.xlsz.xlsxz.zipz.rarz.txtz.pptz.pptxr0   )r    r8   ÚscriptÚstylez</?span[^>]*>)Úflagsz#</?(?:b|font|strong|em|u|i|a)[^>]*>ÚtableÚtrc              3   óV   K  — | ]!  }t        |j                  d «      «      dk\  –— Œ# y­w)Útdé   N)Úlenr;   )rY   Úrows     r   r[   zparse_detail.<locals>.<genexpr>„   s#   è ø€ ÒLÀœs 3§<¡<°Ó#5Ó6¸!Õ;ÑLùs   ‚')r   Nrb   Úthc              3   óX   K  — | ]"  }t        |j                  d ¬«      «      dk  –— Œ$ y­w)Tr1   é(   N)rd   r@   )rY   Úcs     r   r[   zparse_detail.<locals>.<genexpr>Š   s%   è ø€ Ò$VÈ1¤S¨¯©¸$¨Ó)?Ó%@ÀBÕ%FÑ$Vùs   ‚(*Fz

)Ú	separatorr2   z\n{4,}u   

[è¡¨æ ¼]
é   z<p><a href="z">z	</a></p>
u
   
é™„ä»¶: [z](r    ú))r   r:   r@   rB   rC   r2   rD   rE   r;   r   Úanyr=   r   ÚcompatÚurljoinÚosÚpathÚbasenamerF   Ú	decomposeÚstrÚ
IGNORECASEÚsetÚallÚaddrd   )rG   r    rJ   Útitle_elr8   Ú	title_tagÚtr9   Údate_elÚ	date_textrM   Úcontent_divÚncÚattachmentsÚcontentÚtables_htmlÚa_tagÚ	att_titleÚtagÚraw_htmlÚcontent_div_cleanÚ
seen_textsr_   ÚrowsÚhas_data_rowÚ	first_rowÚcellsÚis_data_headerÚcontent_textÚattr-   s                                 @r   Úparse_detailr�   N   sÔ  ø€ ä˜˜}Ó-€Dà�y‰y˜ oˆyÓ6€HÙ-5ˆH×Ñ DÐÔ)¸2€EÙØ—I‘I˜gÓ&ˆ	ÙØ×"Ñ"¨Ð"Ó.ˆAÜ—‘ÐCÀRÈÓKˆAØ—G‘G“IˆEà€HØ�i‰i˜ NˆiÓ3€GÙØ×$Ñ$¨4Ð$Ó0ˆ	Ü—Y‘YÐ5°yÓAˆ
ÙØ!×'Ñ'¨Ó*ˆHà—)‘)˜EÐ*<�)Ó=€KÙØ—i‘i ¨m�iÓ<ˆÙØ�Y‰Y�u ^ˆYÓ4ˆÙØŸ'™' %°˜'Ó7ˆKà€KØ€GØ€KâØ ×)Ñ)¨#Ó.ò 	FˆEØ—9‘9˜V RÓ(ˆDÜó  Fð  2Eô  Fõ  FØ—‘ vÔ.Ü#Ÿ?™?×2Ñ2°3¸Ó=�DØ!ŸN™N°˜NÓ6ÒP¼"¿'¹'×:JÑ:JÈ4Ó:P�	Ø×"Ñ"¨4¸)Ñ#DÕEð	Fð ×'Ñ'¨°7Ð(;Ó<ò 	ˆCØ�M‰M�Oð	ô �{Ó#ˆÜ—6‘6Ð*¨B°ÄÇÁÔNˆÜ—6‘6Ð@À"ÀhÔVX×VcÑVcÔdˆä)¨(°MÓBÐä“Uˆ
Ø ×)Ñ)¨'Ó2ò 	/ˆEØ—>‘> $Ó'ˆDÜÑLÀtÔLÓLˆLÙØÙ#'˜˜Qš¨TˆIÙØ!×*Ñ*¨D°$¨<Ó8�ÙZ_¤Ñ$VÐPUÔ$VÔ!VÐej�Ù%ØØ Ÿ>™>°˜>Ó5ˆLØ˜zÑ)ØØ�N‰N˜<Ô(Øœ3˜u›:¨Ñ.Ñ.‰Kð	/ð" %×-Ñ-¨gÓ6ò 	ˆCØ�M‰M�Oð	ð $×,Ñ,°vÀTÐ,ÓJˆÜ—&‘&˜ F¨GÓ4ˆáØÐ'¨+Ñ5Ñ5ˆGä
ˆ7�=‰=‹?Ó˜bÒ Ø    R¨ w¨jÐ9ˆØò 	CˆCØ˜ S¨¡\ N°"°S¸±Z°LÀÐBÑB‰Gð	Cð �'˜8 [Ð0Ð0r   c                 ó
  — dd l }|r|j                  |d¬«      nd}t        j                  «       j	                  d«      }	t        t        |«      «      dz  dz   }
| j                  d|||||||||
f	«       | j                  «        y )	Nr   F)Úensure_asciiz[]z%Y-%m-%d %H:%M:%Sé
   r7   uû   
        INSERT OR REPLACE INTO gov_raw 
        (page_url, site_name, source_url, title, publish_date, summary, content, attachments, date_rank, status, category, visits)
        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 'published', 'é€šçŸ¥å…¬å‘Š', 0)
    )	ÚjsonÚdumpsr   ÚnowÚstrftimeÚabsÚhashr   Úcommit)r   Úpage_urlr8   Úsummary_textÚpublish_dater€   Ú	site_namer”   Úattachments_jsonr–   Úlevels              r   Úsave_articler¡   ¤   sƒ   € ÛÙFQ�t—z‘z +¸E�zÔBÐW[ÐÜ
�,‰,‹.×
!Ñ
!Ð"5Ó
6€CÜ”�X“Ó "Ñ$ qÑ(€EØ‡L�Lð ð �I˜x¨°¸lÈLÐZjÐlqÐ	rô	tð
 	‡K�K…Mr   é   c                 óV  — t        «       }d}d}t        | «      D �]k  }|dk(  rt        t        z   dz   }nt        t        z   d|› d�z   }t	        d|dz   › d|› �«       t        |«      }|st	        d|dz   › d	�«        �nt        ||«      }t	        d
t        |«      › d�«       |st	        d«        nØ|D ]Ð  }	|	d   }
|	d   }|	d   }|r6|j                  d|
f«      j                  «       }|rt	        d|d d › d�«       ŒJt	        d|d d › d�«       t        |
«      }|s|dz  }t	        d|
› �«       Œ}t        ||
«      \  }}}}|s|r|}|r0t        ||
||||t        «       |dz  }t	        d|› d|d d › d�«       ŒÆt	        d«       ŒÒ �Œn |j                  «        t	        d|› d|› �«       y )Nr   z
index.htmlÚindex_r.   z[PAGE r7   z] z  [WARN] Page z unreachable, stoppingz  Found z	 articlesz  No items found, stoppingr    r8   r9   z%SELECT url FROM gov_raw WHERE url = ?z  [SKIP] already exists: rh   z...z
  [FETCH] é2   z#  [ERROR] detail page unreachable: u       âœ“ saved [u       âœ— empty title, skippedz
[DONE] Total: z articles, Errors: )r   Úranger>   r?   r   r#   rN   rd   r   Úfetchoner�   r¡   Ú	SITE_NAMEÚclose)Ú	max_pagesÚincrementalr   ÚtotalÚerrorsÚpageÚlist_urlrG   rI   Úitemr    r8   Ú	list_dateÚexistingÚdetail_htmlÚdetail_titler�   r9   r€   s                      r   Úcrawlrµ   ±   sü  € Ü‹9€DØ€EØ€Fä�iÓ ó 07ˆØ�1Š9Ü¤)Ñ+¨lÑ:‰Hä¤)Ñ+°°t°f¸EÐ.BÑBˆHä��t˜A‘v�h˜b  
Ð+Ô,Ü˜(Ó#ˆÙÜ�N 4¨¡6 (Ð*@ÐAÔBÚä˜4 Ó&ˆÜ�œ˜U›˜ IÐ.Ô/áÜÐ.Ô0Ùàò 	7ˆDØ�u‘+ˆCØ˜‘MˆEØ˜ZÑ(ˆIáØŸ<™<Ø;¸c¸Vóç‘(“*ð ñ ÜÐ5°e¸C¸R°j°\ÀÐEÔFØä�J˜u S b˜z˜l¨#Ð.Ô/Ü$ S›/ˆKÙØ˜!‘�ÜÐ;¸C¸5ÐAÔBØä;GÈÐUXÓ;YÑ8ˆL˜' 8¨[Ù¡	Ø$�áÜ˜T 3¨°g¸xÈÔV_Ô`Ø˜‘
�Ü˜¨ z°°LÀÀ"Ð4EÐ3FÀcÐJÕKäÐ4Õ6ò;	7ð'07ðd 	‡J�J„LÜ	Ð˜U˜GÐ#6°v°hÐ
?Õ@r   Ú__main__u-   å¼ æŽ–ç»�æµŽæŠ€æœ¯å¼€å�‘åŒºé€šçŸ¥å…¬å‘Šçˆ¬è™«)Údescriptionz--max-pagesu   æœ€å¤§çˆ¬å�–é¡µæ•°)ÚtypeÚdefaultÚhelpz--incrementalÚ
store_trueu   å¢žé‡�æ¨¡å¼�)Úactionrº   )rª   r«   )é   )r¢   F)Ú__doc__r   r   rB   r   rp   r   r   Úbs4r   r>   r?   r
   r¨   r   r   r#   rN   r�   r¡   rµ   Ú__name__ÚargparseÚArgumentParserÚparserÚadd_argumentÚintÚ
parse_argsÚargsrª   r«   © r   r   ú<module>rÉ      sß   ðñó Û Û 	Û 
Û 	ß (Ý à&€Ø€	Ø
€Ø+€	ð DØpØ0ñ€òó
	ò!òFS1òl
ó8Aðv ˆzÒÛØ$ˆX×$Ñ$Ð1`Ôa€FØ
×Ñ˜¨C¸ÐAUÐÔVØ
×Ñ˜°À>ÐÔRØ×ÑÓ€DÙ	�D—N‘N°×0@Ñ0@ÖAð r   