Ë
    }�jR'  ã                   ó¼  — 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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ej&                  j)                  ej&                  j+                  ej&                  j-                  e«      «      d
«      ZddddœZ ej4                  «       Zde_        ej:                  e_        dd„Zd„ Z d„ Z!d„ Z"d„ Z#d„ Z$dd„Z%d„ Z&e'dk(  r e&«        yy)u¬  
crawl_gzqz_tzgg.py - æ¸…é•‡å¸‚äººæ°‘æ”¿åºœ-é€šçŸ¥å…¬å‘Š
åˆ—è¡¨: https://www.gzqz.gov.cn/xwdt/tzgg/ (TRS createPageHTML, å…±113é¡µ index_N.html)
è¯¦æƒ…: https://www.gzqz.gov.cn/xwdt/tzgg/YYYYMM/tYYYYMMDD_ID.html
æ­£æ–‡: div.Article_zw > font#Zoom > .trs_editor_view
é™„ä»¶: æ­£æ–‡å†…ç›¸å¯¹è·¯å¾„ ./P0xxx -> è½¬ç»�å¯¹ URL, ç‹¬ç«‹æˆ�æ®µ <p><a href>é™„ä»¶å��</a></p>
å›¾ç‰‡: è½¬ç»�å¯¹ URL, <p><a href>æŸ¥çœ‹å›¾ç‰‡</a></p>

ç”¨æ³•:
  python3 crawl_gzqz_tzgg.py --pages 1           # æµ‹è¯• 1 é¡µ
  python3 crawl_gzqz_tzgg.py --pages 5           # å‰� 5 é¡µ
  python3 crawl_gzqz_tzgg.py --pages 113         # å…¨é‡�
  python3 crawl_gzqz_tzgg.py --incremental       # å¢žé‡� (æ–­ç‚¹ç»­ä¼ )
é    N)Úurljoinzhttps://www.gzqz.gov.cnz"https://www.gzqz.gov.cn/xwdt/tzgg/u"   æ¸…é•‡å¸‚äººæ°‘æ”¿åºœ-é€šçŸ¥å…¬å‘Šu   è´µå·žéq   z/root/search.dbzgzqz_tzgg_done.jsonzkMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36z?text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8zzh-CN,zh;q=0.9)z
User-AgentÚAcceptzAccept-LanguageFc                 ó¢  — t        |«      D ]z  }	 t        j                  j                  | t        ¬«      }t        j                  j                  ||t        ¬«      5 }|j                  «       j                  dd¬«      cd d d «       c S  y # 1 sw Y   nxY wŒ‹# t        $ r.}||dz
  k(  r‚ t        j                  d|dz  z   «       Y d }~Œ½d }~ww xY w)N)Úheaders)ÚtimeoutÚcontextúutf-8Úreplace)Úerrorsé   é   )ÚrangeÚurllibÚrequestÚRequestÚHEADERSÚurlopenÚctxÚreadÚdecodeÚ	ExceptionÚtimeÚsleep)Úurlr   ÚretriesÚiÚreqÚrÚes          ú$/root/gov_crawler/crawl_gzqz_tzgg.pyÚsafe_getr"   /   sÄ   € Ü�7‹^ò "ˆð	"Ü—.‘.×(Ñ(¨´gÐ(Ó>ˆCÜ—‘×'Ñ'¨°WÄcÐ'ÓJð BÈaØ—v‘v“x—‘ w°y�ÓA÷Bó Bð"ð ÷Bð Búð Bøäò 	"Ø�G˜a‘KÒØÜ�J‰J�q˜1˜q™5‘y×!Ñ!ûð	"ús0   �ABÁ!B
Á<	BÂ
B	ÂBÂ	CÂ $C	Ã	Cc                  óê   — t         j                  j                  t        «      r.	 t	        t        j                  t        t        d¬«      «      «      S t	        «       S # t        $ r t	        «       cY S w xY w)Nr
   ©Úencoding)	ÚosÚpathÚexistsÚ	DONE_FILEÚsetÚjsonÚloadÚopenr   © ó    r!   Ú	load_doner0   <   sS   € Ü	‡w�w‡~�~”iÔ ð	Ü”t—y‘y¤¤i¸'Ô!BÓCÓDÐDô ‹5€Løô ò 	Ü“5ŠLð	ús   ¥,A ÁA2Á1A2c                 óf   — t        j                  t        | «      t        t        dd¬«      d¬«       y )NÚwr
   r$   F©Úensure_ascii)r+   ÚdumpÚsortedr-   r)   )Údones    r!   Ú	save_doner8   E   s    € Ü‡I�IŒf�T‹lœD¤¨C¸'ÔBÐQVÖWr/   c                 ó
  — g }t        j                  d| t         j                  «      D ]Ø  }|j                  d«      |j                  d«      |j                  d«      |j                  d«      j	                  «       f\  }}}}|s%t        j
                  dd|«      j	                  «       }t        t        |«      }|j	                  «       }t        j                  d|«      sŒ¶|j                  ||j	                  «       |d	œ«       ŒÚ |S )
u#   æ��å�–åˆ—è¡¨é¡¹: (url, title, date)z[<li[^>]*>\s*<a[^>]+href="([^"]+)"[^>]*title="([^"]*)"[^>]*>(.*?)</a>\s*<span>([^<]*)</span>r   r   é   é   ú<[^>]+>Ú z!/xwdt/tzgg/\d{6}/t\d{8}_\d+\.html)r   ÚtitleÚdate)
ÚreÚfinditerÚDOTALLÚgroupÚstripÚsubr   ÚLIST_URLÚsearchÚappend)ÚhtmlÚitemsÚmÚhrefr>   Úinnerr?   r   s           r!   Ú
parse_listrN   I   sä   € à€Eä�[‰[ÐwÐy}ô  @B÷  @Iñ  @Ió  Jò 	IˆØ#$§7¡7¨1£:¨q¯w©w°q«z¸1¿7¹7À1»:ÀqÇwÁwÈqÃz×GWÑGWÓGYÐ#YÑ ˆˆe�U˜DÙÜ—F‘F˜: r¨5Ó1×7Ñ7Ó9ˆEÜ”h Ó%ˆØ�z‰z‹|ˆä�y‰yÐ=¸sÔCØØ�‰˜S¨5¯;©;«=À$ÑGÕHð	Ið €Lr/   c                 ó*  — d}t        j                  d| «      }|r|j                  d«      j                  «       }|sLt        j                  d| «      }|r4t        j                  dd|j                  d«      «      j                  «       }d}t        j                  d| «      }|r7t        j                  d|j                  d«      «      }|r|j                  «       }d}t        j                  d| t         j
                  «      }|s%t        j                  d	| t         j
                  «      }|r|j                  d«      j                  «       }|sFt        j                  d
| t         j
                  «      }|r|j                  d«      j                  «       }|||fS )u(   æ��å�–è¯¦æƒ…: title/publish_date/contentr=   z/<meta\s+name="ArticleTitle"\s+content="([^"]*)"r   z<title>([^<]*)</title>z	[-\s_].*$z*<meta\s+name="PubDate"\s+content="([^"]*)"z\d{4}-\d{2}-\d{2}z5<div[^>]*class="Article_zw"[^>]*>(.*?)</div>\s*</div>z%<font[^>]*id="Zoom"[^>]*>(.*?)</font>z6<div[^>]*class="trs_editor_view[^"]*"[^>]*>(.*?)</div>)r@   rG   rC   rD   rE   rB   )rI   r   r>   rK   Úpub_dateÚdmÚcontents          r!   Úparse_detailrS   Z   sC  € à€EÜ
�	‰	ÐDÀdÓK€AÙØ—‘˜“
× Ñ Ó"ˆÙÜ�I‰IÐ/°Ó6ˆÙÜ—F‘F˜<¨¨Q¯W©W°Q«ZÓ8×>Ñ>Ó@ˆEà€HÜ
�	‰	Ð?ÀÓF€AÙÜ�Y‰YÐ+¨Q¯W©W°Q«ZÓ8ˆÙØ—x‘x“zˆHð €GÜ
�	‰	ÐJÈDÔRT×R[ÑR[Ó\€AÙÜ�I‰IÐ>ÀÄbÇiÁiÓPˆÙØ—'‘'˜!“*×"Ñ"Ó$ˆÙä�I‰IÐOÐQUÔWY×W`ÑW`ÓaˆÙØ—g‘g˜a“j×&Ñ&Ó(ˆGà�(˜GÐ#Ð#r/   c                 ó”  ‡— | syˆfd„}t        j                  d|| t         j                  ¬«      } ˆfd„}t        j                  d|| «      } ˆfd„}t        j                  d|| t         j                  ¬«      } t        j                  d	d| t         j                  t         j                  z  ¬«      } t        j                  d
d| t         j                  t         j                  z  ¬«      } t        j                  dd| t         j                  t         j                  z  ¬«      } t        j                  dd| «      } | j	                  «       } | S )uE   æ¸…æ´—æ­£æ–‡: é™„ä»¶/å›¾ç‰‡è½¬ç»�å¯¹URLç‹¬ç«‹æˆ�æ®µ, åŽ»è„šæœ¬/æ ·å¼�r=   c                 óŽ   •— | j                  d«      }| j                  d«      j                  «       }t        ‰|«      }d|› d|› d�S )Nr   r   ú<p><a href="z">z</a></p>)rC   rD   r   )rK   rL   ÚnameÚabs_urlÚ
detail_urls       €r!   Ú
fix_attachz!clean_content.<locals>.fix_attach�   sG   ø€ Ø�w‰w�q‹zˆØ�w‰w�q‹z×ÑÓ!ˆÜ˜* dÓ+ˆØ˜g˜Y b¨¨¨hÐ7Ð7r/   u8   <a[^>]+href="([^"]+)"[^>]*>\s*(é™„ä»¶[^<]{0,60}?)\s*</a>)Úflagsc                 ó–   •— | j                  d«      }t        j                  d|t        j                  «      ryt	        ‰|«      }d|› d�S )Nr   z+ueditor|editor|icon|emoji|placeholder|data:r=   rV   õ   ">æŸ¥çœ‹å›¾ç‰‡</a></p>)rC   r@   rG   ÚIr   )rK   ÚsrcrX   rY   s      €r!   Úfix_imgzclean_content.<locals>.fix_img‰   sD   ø€ Ø�g‰g�a‹jˆä�9‰9ÐCÀSÌ"Ï$É$ÔOØÜ˜* cÓ*ˆØ˜g˜YÐ&<Ð=Ð=r/   z<img[^>]+src="([^"]+)"[^>]*>c                 óÊ   •— | j                  d«      }t        j                  d|t        j                  «      ryt        j                  d|«      rd|› d�S dt        ‰|«      › d�S )Nr   z%ueditor|editor|icon|emoji|placeholderr=   z^(https?://|data:)rV   r]   )rC   r@   rG   r^   Úmatchr   )rK   r_   rY   s     €r!   Úfix_srczclean_content.<locals>.fix_src“   s_   ø€ Ø�g‰g�a‹jˆä�9‰9Ð=¸sÄBÇDÁDÔIØÜ�8‰8Ð)¨3Ô/Ø! # Ð&<Ð=Ð=Øœg j°#Ó6Ð7Ð7MÐNÐNr/   z5(?:src|href)="([^"]+\.(?:jpg|jpeg|png|gif|bmp|webp))"z<script[^>]*>.*?</script>z<style[^>]*>.*?</style>z<iframe[^>]*>.*?</iframe>z\n\s*\n+ú
)r@   rE   r^   rB   rD   )rR   rY   rZ   r`   rc   s    `   r!   Úclean_contentre   |   s  ø€ áØô8ô
 �f‰fÐPÐR\Ð^eÔmo×mqÑmqÔr€Gô>ô �f‰fÐ4°g¸wÓG€GôOô �f‰fÐMÈwÐX_Ôgi×gkÑgkÔl€Gô �f‰fÐ1°2°wÄbÇiÁiÔRT×RVÑRVÑFVÔW€GÜ�f‰fÐ/°°WÄBÇIÁIÔPR×PTÑPTÑDTÔU€GÜ�f‰fÐ1°2°wÄbÇiÁiÔRT×RVÑRVÑFVÔW€Gô �f‰f�[ $¨Ó0€GØ�m‰m‹o€GØ€Nr/   c                 ó  — t        j                  t        d¬«      }|j                  d«       d}d}|j	                  «       }| D ]v  }|j                  d|d   f«      j                  «       }|r|dz  }Œ/|j                  d|d	   |d
   |d   |d   |d   t        |j                  dd«      t        ddf
«       |dz  }Œx |j                  «        g }| rS| D �cg c]  }|d   ‘Œ	 }	}dj                  dt        |	«      z  «      }
|j                  d|
› d�|	«      j                  «       }|D ];  \  }}}}t        j                  dd|xs d«      dd }|j                  d||||f«       Œ= |j                  «        |j                  «        ||fS c c}w )u2   å†™ search.db (INSERT OR IGNORE by page_url) + FTSé<   )r   zPRAGMA busy_timeout=60000r   z&SELECT 1 FROM gov_raw WHERE page_url=?r   r   zÄINSERT OR IGNORE INTO gov_raw
               (title, content, publish_date, source_url, page_url, site_name, summary, group_name, category, script_name)
               VALUES (?,?,?,?,?,?,?,?,?,?)r>   rR   rP   Úsummaryr=   u   é€šçŸ¥å…¬å‘Šzcrawl_gzqz_tzgg.pyú,ú?zESELECT id, title, content, site_name FROM gov_raw WHERE page_url IN (ú)r<   NéÈ   zRINSERT OR IGNORE INTO gov_search(rowid, title, site_name, summary) VALUES(?,?,?,?))Úsqlite3ÚconnectÚDB_PATHÚexecuteÚcursorÚfetchoneÚ	SITE_NAMEÚgetÚ
GROUP_NAMEÚcommitÚjoinÚlenÚfetchallr@   rE   Úclose)rJ   ÚincrementalÚconnÚaddedÚskippedÚcurÚitr(   ÚrowsÚurlsÚplaceholdersÚridr>   rR   Ú	site_namerh   s                   r!   Ú
push_to_dbr†   ¨   s­  € ä�?‰?œ7¨BÔ/€DØ‡L�LÐ,Ô-Ø€EØ€GØ
�+‰+‹-€CØò ˆØ—‘ÐEÈÈ5É	À|ÓT×]Ñ]Ó_ˆÙØ�q‰LˆGØØ�‰ð/ð �‰[˜"˜Y™-¨¨J©¸¸E¹ÀBÀuÁIÜ˜Ÿ™˜y¨"Ó-¬z¸>ÐK_ðaô		
ð 	�‰
‰ðð 	‡K�K„Mà€DÙØ$)Ö*˜b��5“	Ð*ˆÐ*Ø—x‘x ¤c¨$£i¡Ó0ˆØ�{‰{ØSÐT`ÐSaÐabÐcØó
÷ ‰(‹*ð 	ð +/ò 
Ñ&ˆˆU�G˜YÜ—&‘&˜ R¨ª°BÓ7¸¸Ð=ˆØ�‰Ø`Ø�%˜ GÐ,õ	
ð
ð 	‡K�K„MØ‡J�J„LØ�'ˆ>Ðùò +s   ÃFc                  ó.  — t        j                  «       } | j                  dt        dd¬«       | j                  ddd¬«       | j                  d	d d
¬«       | j	                  «       }|j
                  r
t        «       n	t        «       }g }t        |j                  t        «      }t        |«      D ]Ñ  }|dk(  rt        nt        › d|› d�}	 t        |«      }|st        d|dz   › d�«        n˜t#        |«      }	|	D �
cg c]  }
|
d   |vsŒ|
‘Œ }}
t        d|dz   › dt%        |	«      › dt%        |«      › d�«       |j'                  |«       |j
                  r|j)                  d„ |	D «       «       t+        j,                  d«       ŒÓ t        dt%        |«      › d�«       g }t/        |d«      D ]–  \  }}
	 t        |
d   «      }|sŒt1        ||
d   «      \  }}}t3        ||
d   «      }|s|
d    }|s|
d!   }|j5                  ||
d   ||d"d#œ«       |d$z  dk(  rt        d%t%        |«      › d&�«       t+        j,                  d'«       Œ˜ |j6                  rwt9        |j6                  d(d)¬*«      5 }|D ]+  }|j;                  t=        j>                  |d+¬,«      d-z   «       Œ- 	 d d d «       t        d.t%        |«      › d/|j6                  › �«       n,tA        ||j
                  ¬0«      \  }}t        d1|› d2|› d&�«       |j
                  rtC        |«       y y # t        $ r,}t        d|dz   › dt!        |«      d d › �«       Y d }~ �Œ·d }~ww xY wc c}
w # t        $ r:}t        d|› dt%        |«      › d|
d   › dt!        |«      d d › �«       Y d }~�ŒÜd }~ww xY w# 1 sw Y   ŒöxY w)3Nz--pagesé   u   æŠ“å�–é¡µæ•°)ÚtypeÚdefaultÚhelpz--incrementalÚ
store_trueu   å¢žé‡�æ¨¡å¼�(æ–­ç‚¹ç»­ä¼ ))Úactionr‹   z--outu#   è¾“å‡º JSONL è·¯å¾„(é»˜è®¤ç›´å†™DB))rŠ   r‹   r   Úindex_z.htmlz[list] pr   z ERR: éP   u
    ç©ºå“�åº”r   z: u    æ�¡(æ–°rk   c              3   ó&   K  — | ]	  }|d    –— Œ y­w)r   Nr.   )Ú.0r€   s     r!   ú	<genexpr>zmain.<locals>.<genexpr>ë   s   è ø€ Ò2 b˜˜5�	Ñ2ùs   ‚g      à?u   [*] åˆ—è¡¨å…± u    æ�¡, å¼€å§‹æŠ“è¯¦æƒ…z	[detail] ú/z ERR rg   r>   r?   r=   )r>   r   rP   rR   rh   é   z
[detail] +u    æ�¡g333333Ó?r2   r
   r$   Fr3   rd   u   [âœ“] å®Œæˆ�: u    æ�¡ -> )r{   u   [âœ“] å®Œæˆ�: æœ¬æ¬¡æ–°å¢ž u    æ�¡, è·³è¿‡ )"ÚargparseÚArgumentParserÚadd_argumentÚintÚ
parse_argsr{   r0   r*   ÚminÚpagesÚTOTAL_PAGESr   rF   r"   r   ÚprintÚstrrN   rx   ÚextendÚupdater   r   Ú	enumeraterS   re   rH   Úoutr-   Úwriter+   Údumpsr†   r8   )ÚapÚargsr7   Ú	all_itemsr›   ÚpgÚpage_urlrI   r    rJ   r€   ÚnewÚrecordsr   r>   rP   rR   Úfr   r}   r~   s                        r!   Úmainr­   Ñ   s„  € Ü	×	 Ñ	 Ó	"€BØ‡O�O�I¤C°¸€OÔHØ‡O�O�O¨LÐ?[€OÔ\Ø‡O�O�G TÐ0U€OÔVØ�=‰=‹?€Dà×*Ò*Œ9Œ;´³€DØ€IÜ�—
‘
œKÓ(€Eä�E‹lò ˆØ! Qšw•8¬x¨j¸¸r¸dÀ%Ð,Hˆð	Ü˜HÓ%ˆDñ Ü�H˜R ™T˜F *Ð-Ô.ÙÜ˜4Ó ˆØ!Ö;�b R¨¡Y°dÒ%:ŠrÐ;ˆÐ;Ü�˜˜A™˜˜b¤ U£ ¨H´S¸³X°J¸aÐ@ÔAØ×Ñ˜ÔØ×ÒØ�K‰KÑ2¨EÔ2Ô2Ü�
‰
�3�ð!ô$ 
ˆNœ3˜y›>Ð*Ð*?Ð
@ÔAØ€GÜ˜9 aÓ(ò ‰ˆˆ2ð	Ü˜B˜u™IÓ&ˆDñ ØÜ#/°°b¸±iÓ#@Ñ ˆˆx˜Ü ¨¨E©Ó3ˆÙØ�w‘KˆEÙØ˜&‘zˆHØ�‰Ø 2 e¡9¸(Ø¨2ñ
ô 	ð ˆr‰6�QŠ;Ü�Jœs 7›|˜n¨DÐ1Ô2Ü�
‰
�3�ð)ð, ‡x‚xÜ�$—(‘(˜C¨'Ô2ð 	B°aØò B�Ø—‘œŸ
™
 1°5Ô9¸DÑ@ÕAñB÷	Bô 	�œs 7›|˜n¨H°T·X±X°JÐ?Õ@ä# G¸×9IÑ9IÔJ‰ˆˆwÜÐ+¨E¨7°-À¸yÈÐMÔNà×ÒÜ�$�ð øô_ ò 	Ü�H˜R ™T˜F &¬¨Q«°°¨¨Ð6Ô7Þûð	üò <øô ò 	Ü�I˜a˜S ¤# i£.Ð!1°°r¸%±y°kÀÄCÈÃFÈ3ÈBÀKÀ=ÐQÔRÝûð	ú÷(	Bð 	BúsH   ÃLÃ8M ÄM Æ.MÉ$1NÌ	L=Ì L8Ì8L=Í	NÍ/NÎNÎNÚ__main__)é   r:   )F)(Ú__doc__r•   r+   r&   r@   rm   ÚsslÚsysr   Úurllib.requestr   Úurllib.parser   ÚBASErF   rs   ru   rœ   ro   r'   rw   ÚdirnameÚabspathÚ__file__r)   r   Úcreate_default_contextr   Úcheck_hostnameÚ	CERT_NONEÚverify_moder"   r0   r8   rN   rS   re   r†   r­   Ú__name__r.   r/   r!   ú<module>r¾      sð   ðñó Û Û 	Û 	Û Û 
Û 
Û Û Ý  à €Ø/€Ø0€	Ø€
Ø€Ø
€Ø�G‰G�L‰L˜Ÿ™Ÿ™¨¯©¯©¸Ó)BÓCÐEZÓ[€	ð @ØOØ'ñ€ð !€c× Ñ Ó"€Ø€Ô Ø—-‘-€„ó
òòXòò"$òD)óX&òR?ðD ˆzÒÙ…Fð r/   