Ë
    ¡Š£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ZddlmZ ddl	m
Z
 ddlZddlZ ej                  «       Zej!                  dedd¬«       ej%                  «       \  ZZej*                  dkD  rej*                  ndZer ede› �«       d	Zd
ZdZdZdZdddddœZdddddddœZh d£Zd„ Z d„ Z!d&d„Z"d„ Z#d„ Z$d „ Z%d!„ Z&d'd"„Z'e(d#k(  r<d$ejR                  v Z*ejV                  jX                  j[                  «         e'e*¬%«       yy)(u6   çƒŸå�°ç»�æµŽæŠ€æœ¯å¼€å�‘åŒº - å»ºè®¾é¡¹ç›®çŽ¯è¯„å®¡æ‰¹é    N)Údatetime)ÚBeautifulSoupz--pagesu   é™�åˆ¶é¡µæ•°)ÚtypeÚdefaultÚhelpz[AutoPg] max_pages=zNhttps://www.yeda.gov.cn/api-gateway/jpaas-publish-server/front/page/build/unitzhttps://www.yeda.gov.cnz/root/search.dbu   çƒŸå�°ç»�å¼€åŒº-çŽ¯è¯„å®¡æ‰¹Ú	site_yedazoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36z!application/json, text/plain, */*zzh-CN,zh;q=0.9,en;q=0.8z%https://www.yeda.gov.cn/col/col50341/)z
User-AgentÚAcceptzAccept-LanguageÚRefererÚbulidstaticÚ140ÚFhvjvaxoOZi0km37YAMrKÚcolumnu   å½“å‰�æ �ç›®åˆ—è¡¨Ú50341)Ú	parseTypeÚwebIdÚtplSetIdÚpageTypeÚtagIdÚpageId>)   ÚpÚddÚdlÚdtÚh1Úh2Úh3Úh4Úh5Úh6ÚhrÚliÚolÚtdÚthÚtrÚulÚdivÚnavÚpreÚformÚmainÚasideÚtableÚtbodyÚtfootÚtheadÚcenterÚdialogÚfigureÚfooterÚheaderÚhgroupÚaddressÚarticleÚcaptionÚdetailsÚsectionÚfieldsetÚ
blockquoteÚ
figcaptionc                 óÒ   ‡‡‡— | €yddl }ddlmŠ g Šˆˆˆfd„Š ‰| «       dj                  ‰«      }|j	                  dd|«      }|j	                  dd	|«      }|j                  «       S )
ul   å�—çº§è¾¹ç•Œå‡ºæ�¢è¡Œã€�è¡Œå†…èŠ‚ç‚¹ç›´æŽ¥æ‹¼æŽ¥ã€�<br> å‡ºæ�¢è¡Œï¼ˆâ‰ˆ æµ�è§ˆå™¨çœ‹åˆ°çš„æ�¢è¡Œç»“æž„ï¼‰ã€‚NÚ r   )ÚNavigableStringc                 óF  •— | j                   D ]‘  }t        |‰«      r‰j                  t        |«      «       Œ*t	        |dd «      dk(  r‰j                  d«       ŒLt	        |dd «      t
        v r+‰j                  d«        ‰|«       ‰j                  d«       ŒŠ ‰|«       Œ“ y )NÚnameÚbrú
)ÚchildrenÚ
isinstanceÚappendÚstrÚgetattrÚ_BLOCK_TAGS)ÚnodeÚchrA   ÚoutÚwalks     €€€ú/root/gov_crawler/crawl_yeda.pyrO   zbody_text.<locals>.walk<   s„   ø€ Ø—-‘-ò 
	ˆBÜ˜"˜oÔ.Ø—
‘
œ3˜r›7Õ#Ü˜˜V TÓ*¨dÒ2Ø—
‘
˜4Õ Ü˜˜V TÓ*¬kÑ9Ø—
‘
˜4Ô Ù�R”Ø—
‘
˜4Õ á�R•ñ
	ó    z[ \t\r\f\v]*\n[ \t\r\f\v]*rE   ú\n{3,}ú

)ÚreÚbs4rA   ÚjoinÚsubÚstrip)ÚelÚ_reÚtrA   rN   rO   s      @@@rP   Ú	body_textr\   4   sb   ú€ à	€zØÛÝ#Ø
€Cöñ 	ˆ„HØ
�‰�‹€AØ�‰Ð-¨t°QÓ7€AØ�‰�	˜6 1Ó%€AØ�7‰7‹9ÐrQ   c                  ó^   — t        j                  t        d¬«      } | j                  d«       | S )Né<   )Útimeoutz CREATE TABLE IF NOT EXISTS site_yeda (id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT UNIQUE, url TEXT, date TEXT, content TEXT, summary TEXT, created_at TEXT))Úsqlite3ÚconnectÚDBÚexecute)Úconns    rP   Úget_connre   O   s*   € Ü�?‰?œ2 rÔ*€DØ‡L�Lð  tô  uØ€KrQ   c                 óN  — t        t        «      }t        j                  | |dœd¬«      |d<   	 t	        j
                  t        |t        dd¬«      }d|_        |j                  «       }|j                  d«      r|d	   d
   S y # t        $ r}t        d| |fz  «       Y d }~y d }~ww xY w)N)ÚpageNoÚpageSizeF)Úensure_asciiÚ	paramJsoné   )ÚparamsÚheadersr_   Úverifyúutf-8ÚsuccessÚdataÚhtmlz   [ERROR] fetch list page %d: %s)ÚdictÚ
API_PARAMSÚjsonÚdumpsÚrequestsÚgetÚAPI_URLÚHEADERSÚencodingÚ	ExceptionÚprint)ÚpageÚ	page_sizerl   Úrrq   Úes         rP   Ú
fetch_listr‚   T   s˜   € Ü”*Ó€FÜŸ*™*°À)Ñ%LÐ[`Ôa€Fˆ;Ñð	Ü�L‰Lœ¨¼È"ÐUZÔ[ˆØˆŒ
Ø�v‰v‹xˆØ�8‰8�IÔØ˜‘< Ñ'Ð'ØøÜò ÜÐ0°D¸!°9Ñ<Ô=Üûðús   ®AB Â	B$Â
BÂB$c                 óº  — g }t        | d«      }|j                  dd¬«      D ]¶  }|j                  d«      }|j                  d«      }|r|j                  d«      sŒ9|j                  dd	«      j	                  «       }|s|j                  d
¬«      }|d   }|j                  d«      r	t        |z   }|r|j                  d
¬«      nd	}|j                  |||dœ«       Œ¸ |S )Núhtml.parserr!   zbt-main-r-ul-li©Úclass_ÚaÚspanÚhrefÚtitler@   T)rX   ú/)rŠ   ÚurlÚdate)	r   Úfind_allÚfindrx   rX   Úget_textÚ
startswithÚBASErH   )	rr   ÚitemsÚsoupr!   r‡   rˆ   rŠ   r‰   r�   s	            rP   Ú
parse_listr•   b   sÔ   € Ø€EÜ˜˜}Ó-€DØ�m‰m˜DÐ):ˆmÓ;ò BˆØ�G‰G�C‹LˆØ�w‰w�v‹ˆÙ˜Ÿ™˜fœØØ—‘�g˜rÓ"×(Ñ(Ó*ˆÙØ—J‘J T�JÓ*ˆEØ�‰yˆØ�?‰?˜3ÔÜ˜$‘;ˆDÙ,0ˆt�}‰} 4ˆ}Ô(°bˆØ�‰˜u¨T¸4Ñ@ÕAðBð €LrQ   c                 óÈ   — t        | d«      }|j                  dd¬«      }|rAt        |j                  dd«      «      }t        |j                  dd«      «      }||z   d	z
  |z  S y	)
Nr„   r'   Ú
paginationr…   Úcountr   Úrowsé   é   )r   r�   Úintrx   )rr   r”   r—   r˜   r™   s        rP   Úget_page_infor�   t   sd   € Ü˜˜}Ó-€DØ—‘˜5¨�Ó6€JÙÜ�J—N‘N 7¨AÓ.Ó/ˆÜ�:—>‘> &¨"Ó-Ó.ˆØ˜‘˜qÑ  TÑ)Ð)ØrQ   c                 ó¸   — 	 t        j                  | t        dd¬«      }d|_        |j                  S # t
        $ r}t        d| dd  ›d|›�«       Y d }~y d }~ww xY w)Nrk   F)rm   r_   rn   ro   z  [ERROR] fetch detail iØÿÿÿz: )rw   rx   rz   r{   Útextr|   r}   )rŒ   r€   r�   s      rP   Úfetch_detailr    }   sQ   € ðÜ�L‰L˜¤g°rÀ%ÔHˆØˆŒ
Ø�v‰vˆøÜò Ý°°S°T²¹AÐ>Ô?Üûðús   ‚/2 ²	A»AÁAc                 ó¾   — t        | d«      }|j                  ddd¬«      }|syt        |«      }t        j                  dd|«      }t        |«      d	kD  r|d d	 n|}||fS )
Nr„   r'   rŸ   Úzoom)r†   Úid)r@   r@   rR   rS   i,  )r   r�   r\   rT   rW   Úlen)rr   r”   r¢   rŸ   Úsummarys        rP   Úextract_textr¦   †   sd   € Ü˜˜}Ó-€DØ�9‰9�U 6¨fˆ9Ó5€DÙØÜ�T‹?€DÜ�6‰6�)˜V TÓ*€DÜ ›I¨šOˆd�4�C‰j°€GØ�ˆ=ÐrQ   c           
      ód  — t        «       }|j                  «       }t        «       }| r*|j                  d«      D ]  }|j	                  |d   «       Œ t        d«      }|s t        d«       t        j                  d«       t        |«      }t        d|z  «       t        |«      }t        dt        |t        xs |«      dz   «      D ]‚  }t        |«      }|rNt        |«      }	|j                  |	«       |dz  dk(  s||k(  r5t        d||t        |	«      t        |«      fz  «       nt        d	||fz  «       t!        j"                  d
«       Œ„ t        dt        |«      z  «       d}
d}|D ]õ  }|d   }||v r|dz  }Œt%        |d   «      }|s|dz  }Œ(t'        |«      \  }}|rt        |«      dk  r|dz  }ŒLt)        j*                  «       j-                  d«      }	 |j                  d||d   |d   |||f«       |j.                  dkD  r5|
dz  }
|
dz  dk(  r-t        d|
|d d |d   fz  «       |j1                  «        n|dz  }|
dz  dk(  sŒà|
dkD  sŒæ|j1                  «        Œ÷ |j1                  «        |j5                  «        t        d|
|fz  «       y # t2        $ r}t        d|z  «       Y d }~Œnd }~ww xY w)NzSELECT title FROM site_yedar   r›   z[ERROR] Could not fetch listzTotal pages: %dé   é
   z"  Page %d/%d: %d items (total: %d)z  Page %d/%d: FAILEDg333333Ó?zTotal items: %drŠ   rŒ   z%Y-%m-%d %H:%M:%SzeINSERT OR IGNORE INTO site_yeda (title, url, date, content, summary, created_at) VALUES (?,?,?,?,?,?)r�   é2   z  + [%d] %s (%s)z  [ERROR] DB insert: %srk   z 
Done! Inserted: %d, Skipped: %d)re   ÚcursorÚsetrc   Úaddr‚   r}   ÚsysÚexitr�   r•   ÚrangeÚminÚ_MAX_PGÚextendr¤   ÚtimeÚsleepr    r¦   r   ÚnowÚstrftimeÚrowcountÚcommitr|   Úclose)Úincrementalrd   ÚcurÚexistingÚrowrr   Útotal_pagesÚ	all_itemsr   r“   Útotal_insertedÚtotal_skippedÚitemrŠ   Údetail_htmlrŸ   r¥   r¶   r�   s                      rP   ÚcrawlrÅ   �   sÀ  € Ü‹:€DØ
�+‰+‹-€Cä‹u€HÙØ—;‘;Ð<Ó=ò 	!ˆCØ�L‰L˜˜Q™Õ ð	!ô �a‹=€DÙÜÐ,Ô-Ü�‰�Œä Ó%€KÜ	Ð
˜kÑ
)Ô*ä˜4Ó €IÜ�1”c˜+¤wÒ'=°+Ó>ÀÑBÓCò 	ˆÜ˜!‹}ˆÙÜ˜tÓ$ˆEØ×Ñ˜UÔ#Ø�2‰v˜Š{˜a ;Ò.ÜÐ:¸aÀÌcÐRWËjÔZ]Ð^gÓZhÐ=iÑiÕjäÐ(¨A¨{Ð+;Ñ;Ô<Ü�
‰
�3�ð	ô 
Ð
œc )›nÑ
,Ô-à€NØ€Màò !ˆØ�W‘ˆØ�HÑØ˜QÑˆMØä" 4¨¡;Ó/ˆÙØ˜QÑˆMØä$ [Ó1‰ˆˆgÙ”s˜4“y 2’~Ø˜QÑˆMØä�l‰l‹n×%Ñ%Ð&9Ó:ˆð	1Ø�K‰KØwØ˜˜U™ T¨&¡\°4¸À#ÐFôð �|‰|˜aÒØ !Ñ#�Ø! BÑ&¨!Ò+ÜÐ,°ÀÀcÀrÀ
ÈDÐQWÉLÐ/YÑYÔZØ—K‘K•Mà Ñ"�ð ˜BÑ !Ó#¨¸Ó(:Ø�K‰K�MðC!ðF 	‡K�K„MØ‡J�J„LÜ	Ð
-°ÀÐ0OÑ
OÕPøô ò 	1ÜÐ+¨aÑ/×0Ñ0ûð	1ús   ÇA'JÊ	J/ÊJ*Ê*J/Ú__main__z--incremental)r»   )r›   rš   )F).Ú__doc__rw   r®   Úosr`   rT   r´   ru   r   rU   r   Ú_SYSÚargparseÚ_APÚArgumentParserÚ
_AP_PARSERÚadd_argumentrœ   Úparse_known_argsÚ_AP_ARGSÚ_Úpagesr²   r}   ry   r’   rb   Ú	SITE_NAMEÚTABLErz   rt   rK   r\   re   r‚   r•   r�   r    r¦   rÅ   Ú__name__Úargvr»   ÚpackagesÚurllib3Údisable_warnings© rQ   rP   ú<module>rÛ      s=  ðá <ß 1× 1× 1Ó 1Ý Ý ó ã ØˆS×ÑÓ!€
Ø 
× Ñ ˜	¨°Q¸^Ð Ô LØ×)Ñ)Ó+�€ˆ!Ø$ŸN™N¨QÒ.ˆ(�.Š.°D€Ù
Ù	Ð ˜yÐ
)Ô*à
Z€Ø €Ø€Ø*€	Ø€ð DØ1Ø0Ø6ñ	€ð ØØ'ØØ!Øñ€
ò*€òò6ó
òò$òòóGQðR ˆzÒØ! S§X¡XÐ-€KØ×Ñ×Ñ×.Ñ.Ô0Ù	�kÖ"ð rQ   