Ë
    ¸¬uj(  ã                   óD  — 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 ddlZddl	m
Z
 dZdZddiZd	Zd
Z ej                   dd«      ZdZddiZ ej(                  «       Zej,                  j/                  e«       d„ Zd„ Zdd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z e!dk(  r e «        yy)uñ   
å»ºå³°é›†å›¢ - çŽ¯å¢ƒå…¬ç¤º çˆ¬è™« (cnjf.com)
æ �ç›®: ä¿¡æ�¯å…¬å¼€ > çŽ¯å¢ƒå…¬ç¤º (classid=26)
CMS: ASP.NET è‡ªå»º
åˆ—è¡¨: ul.attractbid-nav > li > a
åˆ†é¡µ: ?classid=26&page=N
è¯¦æƒ…: div.video-detail > h3(æ ‡é¢˜), span(æ—¥æœŸ), p(æ­£æ–‡)
é    N)Úurljoin)ÚBeautifulSoupzhttps://www.cnjf.comz/aspx/ch/dutylist.aspxÚclassidé   u   å»ºå³°é›†å›¢-çŽ¯å¢ƒå…¬ç¤ºu   ä¼�ä¸šÚ	SEARCH_DBz/mnt/data/search.dbé   z
User-AgentzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36c                 óV   — | syt        j                  dd| «      } | j                  «       S )u>   æ¸…ç�†æ ‡é¢˜ï¼šstrip &middot;&nbsp;å®žä½“å‰�ç¼€å’Œå¤šä½™ç©ºç™½Ú z(&middot;|&nbsp;|\s)+ú )ÚreÚsubÚstrip)Útexts    ú#/root/gov_crawler/crawl_cnjf_env.pyÚ
clean_textr   &   s'   € áØÜ�6‰6Ð*¨C°Ó6€DØ�:‰:‹<Ðó    c                 óÈ  — | syt        | d«      } |ddg«      D ]  }|j                  «        Œ g }|j                  D �]  }|j                  sŒ|j                  dk(  rÆ|j	                  dd¬«      D ]‰  }|d	   }t        j                  d
|t
        j                  «      sŒ.|j                  d¬«      xs |}|j                  d«      st        ||«      n|}	|j                  |j                  d|› d|	› d�«      «       Œ‹ |j                  d¬«      }
|
sŒÔ|j                  |
«       Œæ|j                  dk(  r|j                  t        |«      «       �Œ|j                  dv r„|j	                  dd¬«      D ]:  }|j                  d«      rŒ|j                  d¬«      }
|
sŒ*|j                  |
«       Œ< |j	                  dd¬«      D ]  }|j                  t        |«      «       Œ �Œ£|j                  dk(  s�Œ´|j!                  dd«      }|j!                  dd«      }|s�ŒÜ|j                  d«      st        ||«      n|}|j                  d|› d|› d�«       �Œ dj#                  |«      S )u?   æ��å�–æ­£æ–‡ï¼šæ®µè�½

åˆ†éš”ã€�è¡¨æ ¼HTMLä¿�ç•™ã€�é™„ä»¶åµŒå…¥r
   úhtml.parserÚscriptÚstyleÚpÚaT©Úhrefr   z"\.(pdf|doc|docx|xls|xlsx|zip|rar)$©r   Úhttpz [z](z) Útable)ÚdivÚsection©Ú	recursiveÚimgÚsrcÚaltz![ú)z

)r   Ú	decomposeÚchildrenÚnameÚfind_allr   ÚsearchÚIÚget_textÚ
startswithr   Úreplace_withÚ
new_stringÚappendÚstrÚfind_parentÚgetÚjoin)Úhtml_contentÚ
detail_urlÚsoupÚtagÚpartsÚchildÚa_tagr   Úa_textÚfull_urlÚtr   Útblr#   r$   Úfull_srcs                   r   Úclean_content_htmlrA   .   s.  € áØÜ˜ }Ó5€DÙ�X˜wÐ'Ó(ò ˆØ�‰�ðð €EØ—‘ó 6ˆØ�zŠzØØ�:‰:˜ÒàŸ™¨°$˜Ó7ò U�Ø˜V‘}�Ü—9‘9ÐBÀDÌ"Ï$É$ÕOØ"Ÿ^™^°$˜^Ó7Ò?¸4�FØ@DÇÁÐPVÔ@Wœw z°4Ô8Ð]a�HØ×&Ñ& t§¡¸¸F¸8À2ÀhÀZÈrÐ7RÓ'SÕTðUð —‘ T�Ó*ˆAÚØ—‘˜Q•Ø�Z‰Z˜7Ò"Ø�L‰Lœ˜U›Ö$Ø�Z‰ZÐ-Ñ-Ø—^‘^ C°4�^Ó8ò $�Ø—=‘= Ô)ØØ—J‘J T�JÓ*�ÚØ—L‘L •Oð$ð —~‘~ g¸�~Ó>ò '�Ø—‘œS ›XÕ&ò'à�Z‰Z˜5Ô Ø—)‘)˜E 2Ó&ˆCØ—)‘)˜E 2Ó&ˆCÛØ;>¿>¹>È&Ô;Qœ7 :¨sÔ3ÐWZ�Ø—‘˜r #  b¨¨
°!Ð4Ö5ð=6ð@ �;‰;�uÓÐr   c           	      óp  — t        |«      D ]\  }	 t        j                  | d¬«      }d|_        |j                  dk(  r|j
                  c S t        d|j                  › d| d d › �«       Œ^ y # t        $ r@}||dz
  k  rt        j                  d	«       Y d }~Œ‹t        d
| d d › d|› �«       Y d }~Œ¤d }~ww xY w)Né   )Útimeoutzutf-8éÈ   u     âš ï¸� HTTP z for éP   é   é   u     â�Œ è¯·æ±‚å¤±è´¥: z: )
ÚrangeÚsessionr3   ÚencodingÚstatus_coder   ÚprintÚ	ExceptionÚtimeÚsleep)ÚurlÚretriesÚiÚrÚes        r   ÚfetchrV   Z   s¶   € Ü�7‹^ò :ˆð
	:Ü—‘˜C¨�Ó,ˆAØ ˆAŒJØ�}‰} Ò#Ø—v‘v’Ü�N 1§=¡= /°°s¸3¸B°x°jÐAÕBð:ð øô ò 	:Ø�7˜Q‘;ŠÜ—
‘
˜1”ÜÜÐ(¨¨S¨b¨¨
°"°Q°CÐ8×9Ñ9ûð		:ús#   �8A,ÁA,Á,	B5Á5B0ÂB0Â0B5c                 óœ  — g }t        | d«      }|j                  d«      }|s|S |j                  dd¬«      D �]  }|j                  dd¬«      }|sŒ|d	   }|j	                  d
«      st        t        |«      }|j                  d«      }|r`|j                  d«      }|j                  d«      }	|r|j                  d¬«      nd}
|	r|	j                  d¬«      nd}|
r	|r|
› d|› �n|
xs |}nd}|j                  d«      }d}|r.|j                  d«      }|rt        |j                  d¬«      «      }|sŒû|sŒþ|j                  |||f«       �Œ |S )u6   è§£æž�åˆ—è¡¨é¡µï¼Œè¿”å›ž [(title, url, date_str), ...]r   zul.attractbid-navÚliFr    r   Tr   r   r   zdiv.attractbid-timer   Úspanr   r
   ú-zdiv.attractbid-menu)
r   Ú
select_oner)   Úfindr-   r   ÚBASE_URLr,   r   r0   )ÚhtmlÚitemsr7   ÚulrX   r   r   Útime_divÚyear_tagÚ	month_tagÚyearÚmonthÚdate_strÚmenu_divÚtitler   s                   r   Ú
parse_listri   j   sZ  € à€EÜ˜˜}Ó-€DØ	�‰Ð,Ó	-€BÙØˆà�k‰k˜$¨%ˆkÓ0ó 2ˆØ�G‰G�C˜dˆGÓ#ˆÙØØ�‰yˆØ�‰˜vÔ&Üœ8 TÓ*ˆDð —<‘<Ð 5Ó6ˆÙØ—}‘} SÓ)ˆHØ Ÿ™ fÓ-ˆIÙ4<�8×$Ñ$¨4Ð$Ô0À"ˆDÙ6?�I×&Ñ&¨TÐ&Ô2ÀRˆEÙ,0±U˜$˜˜q  Ñ(ÀÂÈ‰HàˆHð —<‘<Ð 5Ó6ˆØˆÙØ—‘˜cÓ"ˆAÙÜ" 1§:¡:°D :Ó#9Ó:�â’TØ�L‰L˜%  xÐ0Ö1ð92ð< €Lr   c                 ó  — t        | d«      }|j                  d«      }|sy|j                  d«      }d}|D ]O  }|j                  dd«      }t	        j
                  d|«      }|sŒ.t        |j                  d«      «      }||kD  sŒN|}ŒQ |S )u   è§£æž�æ€»é¡µæ•°r   zdiv.pagerG   r   r   r
   z
page=(\d+))r   r[   r)   r3   r   r*   ÚintÚgroup)	r^   r7   Úpage_divÚlinksÚmax_pager   r   Úmr   s	            r   Úparse_total_pagesrq   “   s�   € ä˜˜}Ó-€DØ�‰˜zÓ*€HÙØØ×Ñ˜cÓ"€EØ€HØò ˆØ�u‰u�V˜RÓ ˆÜ�I‰I�m TÓ*ˆÚÜ�A—G‘G˜A“J“ˆAØ�8‹|Ø‘ðð €Or   c                 óˆ  — t        | «      }|syt        |d«      }|j                  d«      }|sy|j                  d«      }|rt	        |j                  d¬«      «      nd}|j                  d«      }d}|r;|j                  d¬«      }t        j                  d	|«      }	|	r|	j                  d
«      }g }
|j                  dd¬«      D ]g  }|j                  dd¬«      s|j                  dd¬«      rŒ*|j                  d¬«      }|sŒ?t        |«      dkD  sŒN|
j                  t        |«      «       Œi dj                  |
«      }|||fS )u8   èŽ·å�–è¯¦æƒ…é¡µï¼Œè¿”å›ž (title, date_str, content_html))NNNr   zdiv.video-detailÚh3Tr   r
   rY   z(\d{4}-\d{2}-\d{2})rG   r   r    r   zproduct-page)Úclass_zmasses-pager   ú
)rV   r   r[   r\   r   r,   r   r*   rl   r)   r2   Úlenr0   r1   r4   )rQ   r^   r7   Ú
detail_divrs   rh   Ú	date_spanrf   r   rp   Úcontent_partsr   r>   Úcontent_htmls                 r   Úfetch_detailr{   ¥   s<  € ä�‹:€DÙØä˜˜}Ó-€DØ—‘Ð!3Ó4€JÙØð 
�‰˜Ó	€BÙ35ŒJ�r—{‘{¨�{Ó.Ô/¸2€Eð —‘ Ó'€IØ€HÙØ×!Ñ!¨Ð!Ó-ˆÜ�I‰IÐ,¨dÓ3ˆÙØ—w‘w˜q“zˆHð €MØ× Ñ  °Ð Ó5ò )ˆà�=‰=˜ ~ˆ=Ô6¸!¿-¹-ÈÐVc¸-Ô:dØØ�J‰J˜TˆJÓ"ˆÚ”�Q“˜!“Ø× Ñ ¤ Q£Õ(ð)ð —9‘9˜]Ó+€LØ�(˜LÐ(Ð(r   c                  ó¸   — dd l } | j                  t        «      }|j                  «       }|j	                  d«       |j                  «        |j                  «        y )Nr   a  CREATE TABLE IF NOT EXISTS gov_raw (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        title TEXT,
        content TEXT,
        publish_date TEXT,
        source_url TEXT UNIQUE,
        page_url TEXT,
        site_name TEXT,
        summary TEXT
    ))Úsqlite3ÚconnectÚDB_PATHÚcursorÚexecuteÚcommitÚclose)r}   ÚconnÚcs      r   Úinit_dbr†   Ë   sC   € ÛØ�?‰?œ7Ó#€DØ�‰‹€AØ‡I�Ið 		ô 	
ð 	‡K�K„MØ‡J�J…Lr   c                  ód   — t        j                  t        j                  ddt        › d�gd¬«       y)u   è·¨è¿›ç¨‹å�Œæ­¥FTSz-cz
import sqlite3, os
db = "a|  "
conn = sqlite3.connect(db)
conn.execute("CREATE VIRTUAL TABLE IF NOT EXISTS gov_search USING fts5(title, site_name, summary, tokenize=trigram)")
conn.execute("INSERT OR IGNORE INTO gov_search(rowid, title, site_name, summary) SELECT rowid, title, site_name, summary FROM gov_raw WHERE rowid NOT IN (SELECT rowid FROM gov_search)")
conn.commit()
conn.close()
print("FTS synced")
T)Úcapture_outputN)Ú
subprocessÚrunÚsysÚ
executabler   © r   r   Úsync_ftsrŽ   Ý   s5   € ä‡N�NÜ�‰˜ð #ä€ið ð	ð
ð ö
r   c                  óD  — dd l } | j                  dt        › �¬«      }|j                  dt        t
        dt
        › d�¬«       |j                  «       }|j                  }t        dt        › d	�«       t        d
t        › t        › �«       t        d|› �«       t        «        dd l}|j                  t        «      }|j                  «       }t!        t        › t        › d�«      }|st        d«       y t#        |«      }t%        ||«      }t        d|› �«       g }	t'        d|dz   «      D ]‘  }
t        › t        › d�}|
dkD  r|d|
› �z  }t        d|
› d�dd¬«       t!        |«      }|st        d«       ŒJt)        |«      }t        t+        |«      › d�«       |	j-                  |«       t/        j0                  d«       Œ“ t        dt+        |	«      › d�«       t3        «       }|j5                  d«      D ]  }|j7                  |d   «       Œ t        dt+        |«      › �«       d}d}d}t9        |	d«      D ]Ñ  \  }\  }}}||v r|dz  }Œt;        |«      \  }}}|s|dz  }Œ+|xs |}|xs |}t=        ||«      }|r(t?        j@                  dd|«      d d jC                  «       nd}	 |j5                  d |||||t        |f«       |jD                  r|dz  }|d!z  dk(  sŒ§|dkD  sŒ­|jI                  «        t        d"|› d#|› d$|› d%�«       ŒÓ |jI                  «        |jK                  «        t        d&«       t        d'|› d�«       t        d(|› d�«       t        d)|› d�«       |dkD  rtM        «        t        d*«       t        d+|› d�«       y # tF        $ r}|dz  }Y d }~�Œjd }~ww xY w),Nr   u   çˆ¬è™«: )Údescriptionz--pagesu   é¡µæ•°ï¼ˆé»˜è®¤u   ï¼‰)ÚtypeÚdefaultÚhelpz=== u    çˆ¬è™« ===zURL: u   é¡µæ•°: z?classid=26u   â�Œ æ— æ³•èŽ·å�–åˆ—è¡¨é¡µu   æ€»é¡µæ•°: rG   z&page=u   
ç¬¬u   é¡µ...r   T)ÚendÚflushu
   â�Œ å¤±è´¥u   æ�¡g      à?u   
åˆ—è¡¨æ€»è®¡: u    æ�¡zSELECT source_url FROM gov_rawu   å·²çŸ¥URL: z<[^>]+>r
   rE   zƒINSERT OR IGNORE INTO gov_raw (title, content, publish_date, source_url, page_url, site_name, summary) VALUES (?, ?, ?, ?, ?, ?, ?)é
   u
     è¿›åº¦: u   æ�¡æ–°, u   æ�¡è·³è¿‡, u	   æ�¡é”™è¯¯u   
=== å®Œæˆ� ===u
     æ–°å¢ž: u
     è·³è¿‡: u
     é”™è¯¯: u     FTSå�Œæ­¥å®Œæˆ�u	     æ–°å¢ž )'ÚargparseÚArgumentParserÚ	SITE_NAMEÚadd_argumentrk   Ú	MAX_PAGESÚ
parse_argsÚpagesrM   r]   Ú	LIST_PATHr†   r}   r~   r   r€   rV   rq   ÚminrI   ri   rv   ÚextendrO   rP   Úsetr�   ÚaddÚ	enumerater{   rA   r   r   r   Ú	lastrowidrN   r‚   rƒ   rŽ   )r—   ÚparserÚargsÚ	max_pagesr}   r„   r…   r^   Útotal_pagesÚ	all_itemsÚpagerQ   r_   ÚexistingÚrowÚ	new_countÚ
skip_countÚerror_countrS   rh   rf   Údetail_titleÚdetail_daterz   Úfinal_titleÚ
final_dateÚcontentÚsummaryrU   s                                r   Úmainr¶   ì   sÁ  € ÛØ×$Ñ$°8¼I¸;Ð1GÐ$ÓH€FØ
×Ñ˜	¬´YÀÔW`ÐVaÐadÐEeÐÔfØ×ÑÓ€DØ—
‘
€Iä	ˆD”�˜;Ð
'Ô(Ü	ˆE”(�œI˜;Ð
'Ô(Ü	ˆH�Y�KÐ
 Ô!ä„IÛØ�?‰?œ7Ó#€DØ�‰‹€Aô ”H�:œi˜[¨Ð4Ó5€DÙÜÐ)Ô*Øä# DÓ)€KÜ�k 9Ó-€KÜ	ˆK˜�}Ð
%Ô&à€IÜ�a˜ q™Ó)ò ˆÜ�
œ9˜+ [Ð1ˆØ�!Š8Ø�V˜D˜6�?Ñ"ˆCä��d�V˜6Ð"¨°4Õ8Ü�S‹zˆÙÜ�,ÔØä˜4Ó ˆÜ”�U“�˜CÐ Ô!Ø×Ñ˜ÔÜ�
‰
�3�ðô  
ÐœS ›^Ð,¨DÐ
1Ô2ô ‹u€HØ�y‰yÐ9Ó:ò ˆØ�‰�S˜‘VÕðô 
ˆKœ˜H›�Ð
'Ô(à€IØ€JØ€Kä%.¨y¸!Ó%<ò  aÑ!ˆÑ!ˆE�3˜Ø�(‰?Ø˜!‰OˆJØô 3?¸sÓ2CÑ/ˆ�k <ÙØ˜1ÑˆKØð #Ò+ eˆØ Ò, Hˆ
ô % \°3Ó7ˆÙCJ”"—&‘&˜ R¨Ó1°$°3Ð7×=Ñ=Ô?ÐPRˆð		Ø�I‰Ið VØ˜g z°3¸¼YÈÐPôð �{Š{Ø˜Q‘�	ð
 �r‰>˜QÓ 9¨q£=Ø�K‰KŒMÜ�J˜y˜k¨°*°¸[ÈÈÐU^Ð_Õ`ðA aðD 	‡K�K„MØ‡J�J„Lä	ÐÔÜ	ˆJ�y�k Ð
&Ô'Ü	ˆJ�z�l $Ð
'Ô(Ü	ˆJ�{�m 4Ð
(Ô)à�1‚}ÜŒ
ÜÐ!Ô#ä	ˆI�i�[ Ð
%Õ&øô) ò 	Ø˜1ÑˆKÝûð	ús   Ê .NÎ	NÎNÎNÚ__main__)é   )"Ú__doc__r   r‹   rO   Úosr‰   Úurllib.parser   ÚrequestsÚbs4r   r]   rž   ÚLIST_PARAMSr™   ÚGROUPÚgetenvr   r›   ÚHEADERSÚSessionrJ   ÚheadersÚupdater   rA   rV   ri   rq   r{   r†   rŽ   r¶   Ú__name__r�   r   r   ú<module>rÆ      s×   ðñó 
Û 
Û Û 	Û Ý  ã Ý ð "€Ø$€	Ø˜"ˆo€Ø'€	Ø€Ø
ˆ"�)‰)�KÐ!6Ó
7€Ø€	ð ð  Dð€ð ˆ(×
Ñ
Ó
€Ø ‡�× Ñ �wÔ òò)óXò &òRò$#)òLò$òf'ðR ˆzÒÙ…Fð r   