Ë
    Í«£jñ'  ã                   óÐ   — 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dl	m
Z
 dZedz   Zedz   ZdZd	Zd
Zd
ZddddœZdZd„ Zdd„Zd„ Zdd„Zd„ Zd„ Zd„ Zedk(  r e«        yy)u1  
é¡ºæ˜ŒåŽ¿äººæ°‘æ”¿åºœ - å…¬ç¤ºå…¬å‘Šçˆ¬è™«
CMS: è‡ªå®šä¹‰ï¼ˆé�žLonsunï¼‰
åˆ—è¡¨: div.mid-mj-list > ul#resources > li > span.list-content > a[href] + span.list-time
åˆ†é¡µ: /cms/sitemanage/index.shtml?siteId=30128195135920000&page=Nï¼ˆ756é¡µï¼Œ20æ�¡/é¡µï¼‰
è¯¦æƒ…: div.content + meta ArticleTitle/PubDate
é    N)ÚBeautifulSoup)Úurljoinzhttp://www.fjsc.gov.cnz!/cms/html/scxrmzf/gsgg/index.htmlz</cms/sitemanage/index.shtml?siteId=30128195135920000&page={}z/root/search.dbu"   é¡ºæ˜ŒåŽ¿äººæ°‘æ”¿åºœ-å…¬ç¤ºå…¬å‘Šu   ç¦�å»ºzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36zJtext/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8zzh-CN,zh;q=0.9,en;q=0.8)z
User-AgentÚAcceptzAccept-Languageé   c                 ón   — | s| S | j                  dd«      j                  dd«      j                  dd«      S )u[   é¡µé�¢ meta PubDate ç”¨ em-dash(â€”) è€Œåˆ—è¡¨é¡µç”¨è¿žå­—ç¬¦(-)ï¼Œç»Ÿä¸€ä¸ºå�Šè§’è¿žå­—ç¬¦u   â€”ú-u   â€“u   ï¼�)Úreplace)Úds    úcrawl_fjsc.pyÚnormalize_dater   %   s5   € áØˆØ�9‰9�U˜CÓ ×(Ñ(¨°Ó4×<Ñ<¸UÀCÓHÐHó    c                 óÊ  — ddl }t        t        | «      d«      }|j                  d«      D ]L  }|j	                  dd«      }|sŒ|j                  d«      rŒ*|r|j                  j                  ||«      n||d<   ŒN |j                  d«      D ]L  }|j	                  d	d«      }|sŒ|j                  d
«      rŒ*|r|j                  j                  ||«      n||d	<   ŒN t        |«      S )uA   ä¿�ç•™ HTML è¡¨æ ¼ç»“æž„ï¼Œä»…å°†ç›¸å¯¹é“¾æŽ¥/å›¾ç‰‡è½¬ç»�å¯¹ URLr   Núhtml.parserÚaÚhrefÚ )ÚhttpÚ
javascriptú#ÚimgÚsrc)r   z//zdata:)Úurllib.parser   ÚstrÚfind_allÚgetÚ
startswithÚparser   )ÚtableÚbase_urlÚurllibÚtblr   r   r   r   s           r   Úhtml_table_to_htmlr"   ,   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€Or   c                  ó|   — t        j                  t        «      } | j                  d«       | j                  d«       | S )NzPRAGMA journal_mode=WALzPRAGMA busy_timeout=5000)Úsqlite3ÚconnectÚDB_PATHÚexecute)Úconns    r   Úinit_dbr)   9   s/   € Ü�?‰?œ7Ó#€DØ‡L�LÐ*Ô+Ø‡L�LÐ+Ô,Ø€Kr   c                 óÜ   — |xs t        j                  «       }	 |j                  | t        d¬«      }d|_        |j
                  dk7  ry t        |j                  d«      S # t        $ r Y y w xY w)Né   ©ÚheadersÚtimeoutúutf-8éÈ   r   )	ÚrequestsÚSessionr   ÚHEADERSÚencodingÚstatus_coder   ÚtextÚ	Exception)ÚurlÚsessionÚsÚresps       r   Úget_soupr<   @   si   € ØÒ%”8×#Ñ#Ó%€AðØ�u‰u�S¤'°2ˆuÓ6ˆØˆŒØ×Ñ˜sÒ"ØÜ˜TŸY™Y¨Ó6Ð6øÜò Ùðús   š.A Á	A Á	A+Á*A+c                 óP  — g }| j                  dd¬«      }|s|S |j                  dd¬«      }|s÷|j                  d«      D ]á  }|j                  d«      }|j                  d	d
¬«      }|sŒ*|j                  d«      sŒ<|j                  d«      xs |j                  d¬«      xs d}|j	                  «       }|sŒx|d   j	                  «       }|j                  d«      r|nt        t        |«      }	|rt        |j                  d¬«      «      nd}
|j                  ||	|
dœ«       Œã |S |j                  dd¬«      D ]á  }|j                  d«      }|j                  d	d
¬«      }|sŒ*|j                  d«      sŒ<|j                  d«      xs |j                  d¬«      xs d}|j	                  «       }|sŒx|d   j	                  «       }|j                  d«      r|nt        t        |«      }	|rt        |j                  d¬«      «      nd}
|j                  ||	|
dœ«       Œã |s‡|j                  d«      D ]s  }|j                  dd«      }|j                  d¬«      }|sŒ*|sŒ-t        |«      dkD  sŒ<|j                  d«      r|nt        t        |«      }	|j                  ||	ddœ«       Œu |S )NÚdivzmid-mj-list©Úclass_ÚulÚ	resources)ÚidÚlir   Úspanz	list-timer   ÚtitleT©Ústripr   r   )rF   r8   ÚdateF©Ú	recursiver   )Úfindr   r   Úget_textrH   r   r   ÚBASE_URLr   ÚappendÚlen)ÚsoupÚitemsr>   rA   rD   r   Ú	span_timerF   r   Úfull_urlrI   s              r   Úextract_list_itemsrU   L   sh  € Ø€EØ
�)‰)�E -ˆ)Ó
0€CÙØˆØ	�‰�$˜;ˆÓ	'€BÙà—,‘,˜tÓ$ò 	NˆBØ—‘˜“ˆAØŸ™ ¨{˜Ó;ˆIÚ�Q—U‘U˜6•]ØŸ™˜g›ÒF¨!¯*©*¸4¨*Ó*@ÒFÀB�ØŸ™›�ÙØØ˜‘y—‘Ó(�Ø#'§?¡?°6Ô#:™4ÄÌÐRVÓ@W�ÙIR”~ i×&8Ñ&8¸tÐ&8Ó&DÔEÐXZ�Ø—‘ u°XÀtÑLÕMð	Nð ˆà�k‰k˜$¨%ˆkÓ0ò JˆØ�G‰G�C‹LˆØ—G‘G˜F¨;�GÓ7ˆ	Ú�—‘�v•Ø—E‘E˜'“NÒB a§j¡j°t jÓ&<ÒBÀˆEØ—K‘K“MˆEÙØØ�V‘9—?‘?Ó$ˆDØ#Ÿ™¨vÔ6‘t¼GÄHÈdÓ<SˆHÙEN”> )×"4Ñ"4¸4Ð"4Ó"@ÔAÐTVˆDØ�L‰L 5°À4ÑHÕIðJñ Ø—‘˜cÓ"ò 	LˆAØ—5‘5˜ Ó$ˆDØ—J‘J T�JÓ*ˆEÚš¤# e£*¨q£.Ø#'§?¡?°6Ô#:™4ÄÌÐRVÓ@W�Ø—‘ u°XÀrÑJÕKð	Lð €Lr   c                 óî  ‡— 	 t        j                  | t        d¬«      }d|_        |j                  dk7  ry	 t        |j                  d«      }d	}|j                  d
ddi¬«      }|r$|j                  d«      r|d   j                  «       }|s%|j                  d«      }|r|j                  d¬«      }d	}|j                  d
ddi¬«      }|r0|j                  d«      rt        |d   j                  «       d d «      }d	}	|j                  d
ddi¬«      }
|
r$|
j                  d«      r|
d   j                  «       }	|j                  dd¬«      xs |j                  dd¬«      Šg }g }‰�rÙ‰j                  ddg«      D ]  }|j!                  «        Œ ˆfd„}‰j                  g d¢d¬«      D ]ê  }|j"                  dk(  r!t%        || «      }|sŒ!|j'                  |«       Œ3|j"                  dk(  r@ ||«      rŒK|j                  dd¬«      }|sŒat)        |«      d kD  sŒp|j'                  |«       Œ‚|j"                  d!k(  sŒ’|j                  d"d	«      }|j                  d#d	«      }|sŒ¹|j+                  d$«      st-        | |«      }|j'                  d%|›d&�«       Œì ‰j                  d'd¬(«      D ]”  }|d)   j                  «       }t/        j0                  d*|t.        j2                  «      sŒ<|j+                  d$«      r|nt-        | |«      }|j'                  |j                  d¬«      xs |j5                  d+«      d,   |d-œ«       Œ– d.j7                  |«      }t)        |j                  «       «      d/k  rd%| ›d0|xs | j5                  d+«      d,   ›d1�}t)        |«      dkD  r|d d n|}|rt9        j:                  |d2¬3«      nd	}|||	|||fS # t
        $ r(}t        d|z  t        j                  ¬«       Y d }~yd }~ww xY w)4Nr+   r,   r/   r0   )NNNNNNz  [ERROR] fetch detail: %s)Úfiler   r   ÚmetaÚnameÚArticleTitle)ÚattrsÚcontentÚh1TrG   ÚPubDateé
   ÚContentSourcer>   r?   Ú
TRS_EditorÚscriptÚstylec                 ó–   •— | j                   }|r:|‰k7  r5|j                  dk(  r|j                  d«      ry|j                   }|r|‰k7  rŒ5y)Nr>   r   TF)ÚparentrY   rL   )ÚelÚpÚcontent_divs     €r   Ú_has_table_ancestorz+extract_detail.<locals>._has_table_ancestor¢   sH   ø€ Ø—	‘	ˆAÙ˜˜[Ò(Ø—6‘6˜U’? q§v¡v¨g¤ØØ—H‘H�ñ ˜˜[Ó(ð r   )rg   r   r   rJ   r   rg   ú é   r   r   Úaltr   z<p><a href="u   ">æŸ¥çœ‹å›¾ç‰‡</a></p>r   )r   r   z"\.(pdf|doc|docx|xls|xlsx|zip|rar)$ú/éÿÿÿÿ)rY   r8   z

é   z">z</a></p>F)Úensure_ascii)r1   r   r3   r4   r5   r7   ÚprintÚsysÚstderrr   r6   rL   rH   rM   r   r   Ú	decomposerY   r"   rO   rP   r   r   ÚreÚsearchÚIÚsplitÚjoinÚjsonÚdumps)r8   ÚrÚerQ   rF   Ú
meta_titler]   Úpublish_dateÚmeta_pubÚ
source_urlÚmeta_srcÚcontent_partsÚattachmentsÚnoiseri   ÚchildÚtbl_htmlÚtxtr   rl   r   r   Ú	full_hrefr\   ÚsummaryÚattach_jsonrh   s                             @r   Úextract_detailrŒ   {   s¸  ø€ ð2Ü�L‰L˜¤g°rÔ:ˆØˆŒ
Ø�=‰=˜CÒØ5ð  ô ˜Ÿ™ Ó/€Dà€EØ—‘˜6¨&°.Ð)A�ÓB€JÙ�j—n‘n YÔ/Ø˜9Ñ%×+Ñ+Ó-ˆÙØ�Y‰Y�t‹_ˆÙØ—K‘K d�KÓ+ˆEà€LØ�y‰y˜¨°	Ð':ˆyÓ;€HÙ�H—L‘L Ô+Ü% h¨yÑ&9×&?Ñ&?Ó&AÀ#À2Ð&FÓGˆà€JØ�y‰y˜¨°Ð'@ˆyÓA€HÙ�H—L‘L Ô+Ø˜iÑ(×.Ñ.Ó0ˆ
à—)‘)˜E¨)�)Ó4Ò]¸¿	¹	À%ÐP\¸	Ó8]€KØ€MØ€KâØ ×)Ñ)¨8°WÐ*=Ó>ò 	ˆEØ�O‰OÕð	ô	ð !×)Ñ)Ò*?È4Ð)ÓPò 	ZˆEØ�z‰z˜WÒ$Ü-¨e°SÓ9�ÚØ!×(Ñ(¨Õ2Ø—‘˜sÒ"Ù& uÔ-ØØ—n‘n S°�nÓ5�Úœ3˜s›8 a›<Ø!×(Ñ(¨Õ-à—‘˜uÓ$Ø—i‘i  rÓ*�Ø—i‘i  rÓ*�ÚØŸ>™>¨&Ô1Ü% c¨3Ó/˜Ø!×(Ò(ÒSVÐ)XÕYð%	Zð* ×%Ñ% c°Ð%Ó5ò 	ˆAØ�V‘9—?‘?Ó$ˆDÜ�y‰yÐ>ÀÄbÇdÁdÕKØ$(§O¡O°FÔ$;™DÄÈÈdÓAS�	Ø×"Ñ"ØŸJ™J¨T˜JÓ2ÒI°d·j±jÀ³oÀbÑ6IØ$ñ$õ ð		ð �k‰k˜-Ó(€Gä
ˆ7�=‰=‹?Ó˜bÓ Ú25°uÒ7RÀÇ	Á	È#ÃÈrÑ@RÑ7RÐSˆä" 7›|¨cÒ1ˆg�d�s‰m°w€GÙAL”$—*‘*˜[°uÕ=ÐRT€Kà�, 
¨G°W¸kÐIÐIøô_ ò 2ÜÐ*¨QÑ.´S·Z±ZÕ@Ü1ûð2ús   ƒ2O Ï	O4ÏO/Ï/O4c                  óÂ  — dd l } | j                  d¬«      }|j                  dt        t        ¬«       |j                  dd¬«       |j                  «       }|j                  rd	n|j                  }t        j                  «       }g }t        «       }t        d
|d
z   «      D ]á  }|d
k(  rt        nt        j                  |«      }t        d|||fz  «       t!        ||«      }	|	st        d«       ŒNt#        |	«      }
|
st        d«        n|d}|
D ]4  }|d   |vsŒ|j%                  |d   «       |j'                  |«       |d
z  }Œ6 t        dt)        |
«      |t)        |«      fz  «       |dk(  r nt+        j,                  d«       Œã t        dt)        |«      z  «       t/        «       }d}d}d}t1        |«      D ]Ý  \  }}	 t        d|d
z   t)        |«      |d   d d fz  «       t3        |d   «      \  }}}}}}|€|d
z  }ŒG|xs |d   }|xs |d   }|r	|xs |d d n|}|j5                  |t6        |xs |d   |d   |j9                  «       ||j9                  «       |t:        |t<        f
«       |j?                  «        |d
z  }t+        j,                  d«       Œß |jC                  «        t        d||fz  «       |S # t@        $ r}t        d|z  «       |d
z  }Y d }~�Œ$d }~ww xY w)Nr   u(   é¡ºæ˜ŒåŽ¿äººæ°‘æ”¿åºœ-å…¬ç¤ºå…¬å‘Šçˆ¬è™«)Údescriptionz--max-pages)ÚtypeÚdefaultz--fullÚ
store_true)Úactioniô  é   u   åˆ—è¡¨é¡µ %d/%d: %sz  FAILEDu     ç©ºåˆ—è¡¨ï¼Œå�œæ­¢r8   u)     æœ¬é¡µ%dæ�¡ï¼Œæ–°å¢ž%dæ�¡ï¼Œç´¯è®¡%dæ�¡g      à?u'   
å…±%dç¯‡æ–‡ç« ï¼Œå¼€å§‹æŠ“å�–è¯¦æƒ…...z¿INSERT OR IGNORE INTO gov_raw
        (site_name, source_url, page_url, title, publish_date, summary, content, category, attachments, group_name)
        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)z  [%d/%d] %s...rF   é(   rI   r0   g333333Ó?z  ERROR: %su#   
å®Œæˆ�ï¼�æ–°å¢ž%dæ�¡ï¼Œé”™è¯¯%dæ�¡)"ÚargparseÚArgumentParserÚadd_argumentÚintÚ	MAX_PAGESÚ
parse_argsÚfullÚ	max_pagesr1   r2   ÚsetÚrangeÚLIST_URL_P1ÚLIST_URL_PNÚformatrq   r<   rU   ÚaddrO   rP   ÚtimeÚsleepr)   Ú	enumeraterŒ   r'   Ú	SITE_NAMErH   ÚCATEGORYÚGROUPÚcommitr7   Úclose)r•   ÚparserÚargsrœ   r9   Ú	all_itemsÚ	seen_urlsÚpager8   rQ   rR   Ú	new_countÚitemr(   ÚinsertedÚerrorsÚ
INSERT_SQLÚidxrF   Úpub_dateÚsrc_urlr\   rŠ   r„   Úfinal_titleÚ
final_dateÚfinal_summaryr}   s                               r   Úmainr»   Ó   sø  € ÛØ×$Ñ$Ð1[Ð$Ó\€FØ
×Ñ˜¬C¼ÐÔCØ
×Ñ˜¨ÐÔ6Ø×ÑÓ€Dà—y’y‘ d§n¡n€Iä×ÑÓ €GØ€IÜ“€Iä�a˜ Q™Ó'ò ˆØ! QšY�k¬K×,>Ñ,>¸tÓ,DˆÜÐ# t¨Y¸Ð&<Ñ<Ô=Ü˜˜WÓ%ˆÙÜ�*ÔØä" 4Ó(ˆÙÜÐ(Ô)Ùàˆ	Øò 	ˆDØ�E‰{ )Ò+Ø—‘˜d 5™kÔ*Ø× Ñ  Ô&Ø˜Q‘‘	ð		ô 	Ð9¼SÀ»ZÈÔTWÐXaÓTbÐ<cÑcÔdØ˜Š>ÙÜ�
‰
�3�ð/ô2 
Ð
4´s¸9³~Ñ
EÔFÜ‹9€DØ€HØ€Fð1€Jô ˜yÓ)ò ‰	ˆˆTð	ÜÐ# s¨Q¡w´°I³ÀÀWÁÈcÈrÐ@RÐ&SÑSÔTÜFTÐUYÐZ_ÑU`ÓFaÑCˆE�8˜W g¨w¸Øˆ}Ø˜!‘�ØàÒ0 4¨¡=ˆKØ!Ò1 T¨&¡\ˆJÙ8?˜GÒ4 w¨t°¡}À[ˆMà�L‰L˜Ü˜7Ò1 d¨5¡k°4¸±;Ø×!Ñ!Ó# ZØ×#Ñ#Ó% wÜ˜+¤uð	&ô ð �K‰KŒMØ˜‰MˆHÜ�J‰J�s�Oð)ð4 	‡J�J„LÜ	Ð
0°H¸fÐ3EÑ
EÔFØ€Oøô ò 	Ü�- !Ñ#Ô$Ø�a‰KŽFûð	ús   Æ<?J7Ç<BJ7Ê7	KË KËKÚ__main__)r   )N)Ú__doc__ru   rr   rz   r£   r1   r$   Úbs4r   r   r   rN   rŸ   r    r&   r¦   r§   r¨   r3   r™   r   r"   r)   r<   rU   rŒ   r»   Ú__name__© r   r   ú<module>rÁ      s«   ðñó 
Û 
Û Û Û Û Ý Ý  à#€ØÐ<Ñ<€ØÐWÑW€Ø
€Ø0€	Ø€Ø€ð DØZØ0ñ€ð €	òIóòó	ò,ò^UJòpKð\ ˆzÒÙ…Fð r   