Ë
    ¸¬uj2"  ã                   ó¼   — 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ZdZ	e	dz   Z
dZdZd	Zd
e
dz   dœZe	dz   ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)uù  
crawl_ny_tzgg.py - å®�é˜³åŽ¿-é€šçŸ¥å…¬å‘Š
CMS: TRS Hanweb xxgk search.jsp
åˆ—è¡¨: POST /module/xxgk/search.jsp?standardXxgk=1&infotypeId=TAE41&area=
      POST data: divid=div4&currpage=N&vc_title=&vc_number=&vc_all=&standardXxgk=1&infotypeId=TAE41&vc_xxgkarea=NY1225544454455A-1
è¯¦æƒ…: /art/YYYY/M/D/art_171773_{id}.html?xxgkhide=1
æ ‡é¢˜: div.main-fl-tit / meta[ArticleTitle]
æ—¥æœŸ: div.main-fl-riqi (å�«"å�‘å¸ƒæ—¥æœŸï¼šYYYY-MM-DD") / meta[PubDate]
å†…å®¹: div.bt-left > p (è·³è¿‡å‰�å¯¼å…ƒæ•°æ�®div)
é    N)ÚBeautifulSoupz/root/search.dbzhttp://www.ny.gov.cnz/col/col171773/index.htmlu   å®�é˜³åŽ¿-é€šçŸ¥å…¬å‘Šu   å±±ä¸œu   å…¶ä»–zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36z,?vc_xxgkarea=NY1225544454455A-1&number=TAE41)z
User-AgentÚRefererzB/module/xxgk/search.jsp?standardXxgk=1&infotypeId=TAE41&divid=div4zkcurrpage={page}&vc_title=&vc_number=&vc_all=&standardXxgk=1&infotypeId=TAE41&vc_xxgkarea=NY1225544454455A-1c                  ól   — t        j                  «       } | j                  j                  t        «       | S )zCreate session)ÚrequestsÚSessionÚheadersÚupdateÚHEADERS)Úsessions    ú"/root/gov_crawler/crawl_ny_tzgg.pyÚget_sessionr   $   s'   € ä×ÑÓ €GØ‡O�O×Ñœ7Ô#Ø€Nó    c                 ó²  — t         }t        j                  |¬«      }	 | j                  ||d¬«      }d|_        |j
                  }t        j                  d|«      }t        j                  d|«      }|rt        |j                  d«      «      nd}|rt        |j                  d«      «      nd}	|||	fS # t        $ r}
t        d	|› d
|
› �«       Y d}
~
yd}
~
ww xY w)z/Fetch one page of list data via search.jsp POST)Úpageé<   )ÚdataÚtimeoutúutf-8u   å…±(\d+)æ�¡u   å…±\s*(\d+)\s*é¡µé   r   z  [API ERROR] page ú: N)Nr   r   )Ú
SEARCH_URLÚPOST_DATA_TPLÚformatÚpostÚencodingÚtextÚreÚsearchÚintÚgroupÚ	ExceptionÚprint)r   Úpage_noÚurlr   ÚrÚhtmlÚcount_mÚpage_mÚtotalÚtotal_pagesÚes              r   Úfetch_list_pager,   +   sÇ   € ä
€CÜ×Ñ WÐÓ-€DðØ�L‰L˜ 4°ˆLÓ4ˆØˆŒ
Ø�v‰vˆä—)‘)˜N¨DÓ1ˆÜ—‘Ð/°Ó6ˆÙ)0”�G—M‘M !Ó$Ô%°aˆÙ.4”c˜&Ÿ,™, q›/Ô*¸!ˆØ�U˜KÐ'Ð'øÜò ÜÐ# G 9¨B¨q¨cÐ2Ô3Üûðús   žBB2 Â2	CÂ;CÃCc                 ó@  — g }t        | d«      }|j                  d«      D ]û  }|j                  d«      }|j                  d«      }|r|j                  d«      sŒ9|j                  dd«      j	                  «       }|j                  dd«      j	                  «       xs |j                  d¬	«      }|r|j                  d¬	«      nd}t        j                  d
|«      }	|	r|	j                  d«      nd}
|j                  d«      r	t        |z   }|j                  |||
f«       Œý |S )z?Parse search.jsp list HTML to extract (url, title, date) tuplesúhtml.parserÚliÚaÚbÚhrefÚ ÚtitleT©Ústripú(\d{4}-\d{2}-\d{2})r   ú/)r   Úfind_allÚfindÚgetr6   Úget_textr   Úmatchr    Ú
startswithÚBASE_URLÚappend)r&   ÚitemsÚsoupr/   r0   r1   r2   r4   Ú	date_textÚdate_mÚdate_strs              r   Ú
parse_listrF   >   sü   € à€EÜ˜˜}Ó-€DØ�m‰m˜DÓ!ò .ˆØ�G‰G�C‹LˆØ�G‰G�C‹LˆÙ˜Ÿ™˜fœØØ�u‰u�V˜RÓ ×&Ñ&Ó(ˆØ—‘�g˜rÓ"×(Ñ(Ó*ÒD¨a¯j©j¸t¨jÓ.DˆÙ./�A—J‘J T�JÔ*°Rˆ	Ü—‘Ð0°)Ó<ˆÙ&,�6—<‘< ”?°"ˆØ�?‰?˜3ÔÜ˜d‘?ˆDØ�‰�d˜E 8Ð,Õ-ð.ð €Lr   c                 ó˜   — 	 | j                  |d¬«      }d|_        |j                  S # t        $ r}t	        d|› �«       Y d}~yd}~ww xY w)zFetch detail page HTMLr   ©r   r   zERR:N)r;   r   r   r!   r"   )r   r$   r%   r+   s       r   Úfetch_detailrI   R   sJ   € ðØ�K‰K˜ RˆKÓ(ˆØˆŒ
Ø�v‰vˆøÜò Ü��Q�CˆjÔÜûðús   ‚%( ¨	A	±AÁA	c           	      óê  — t        | d«      }d}|j                  ddt        j                  dt        j                  «      i¬«      }|r$|j                  d«      r|d   j                  «       }|s'|j                  dd	¬
«      }|r|j                  d¬«      }d}dD ]Œ  }|j                  ddt        j                  |t        j                  «      i¬«      }|sŒ=|j                  d«      sŒO|d   j                  «       }	t        j                  d|	«      }
|
sŒ{|
j                  d«      } n |sL|j                  dd¬
«      }|r7t        j                  d|j                  «       «      }
|
r|
j                  d«      }d}|j                  dd¬
«      }|s|j                  dd¬
«      }|r¯g }|j                  dd¬«      D ]?  }|j                  d¬«      }|sŒ|dvsŒ|j                  d«      rŒ/|j                  |«       ŒA |j                  dd¬«      D ]1  }d|j                  dg «      v rŒ|j                  t        |«      «       Œ3 dj                  |«      }|rt        j                   dd|«      dd nd}||||fS )z-Extract title, date, content from detail pager.   r3   ÚmetaÚnameÚArticleTitle)ÚattrsÚcontentÚdivzmain-fl-tit)Úclass_Tr5   )ÚPublishDateÚPubDateÚpublishdateÚpubdater7   r   zmain-fl-riqizbt-leftzmain-flÚp)Ú	recursive)õ   Â r3   ÚtableÚ
xxgk_tableÚclassz

z<[^>]+>NéÈ   )r   r:   r   ÚcompileÚIr;   r6   r<   r=   r    r   r9   Úfind_parentr@   ÚstrÚjoinÚsub)r&   r$   rB   r4   Ú
meta_titleÚtit_divrE   rL   Ú	meta_dateÚrawÚmÚriqirO   Úcontent_divÚpartsrV   r   rY   Úsummarys                      r   Úextract_detailrl   ]   sX  € ä˜˜}Ó-€Dð €EØ—‘˜6¨&´"·*±*¸_ÌbÏdÉdÓ2SÐ)T�ÓU€JÙ�j—n‘n YÔ/Ø˜9Ñ%×+Ñ+Ó-ˆÙØ—)‘)˜E¨-�)Ó8ˆÙØ×$Ñ$¨4Ð$Ó0ˆEð €HØDò ˆØ—I‘I˜f¨V´R·Z±ZÀÄbÇdÁdÓ5KÐ,L�IÓMˆ	Ú˜Ÿ™ yÕ1Ø˜IÑ&×,Ñ,Ó.ˆCÜ—‘Ð/°Ó5ˆAÚØŸ7™7 1›:�Ùðñ Ø�y‰y˜ ~ˆyÓ6ˆÙÜ—	‘	Ð0°$·-±-³/ÓBˆAÙØŸ7™7 1›:�ð €GØ—)‘)˜E¨)�)Ó4€KÙØ—i‘i ¨i�iÓ8ˆÙàˆà×%Ñ% c°TÐ%Ó:ò 	#ˆAØ—:‘: D�:Ó)ˆDÚ˜ LÒ0à—=‘= Ô)ØØ—‘˜TÕ"ð	#ð !×)Ñ)¨'¸TÐ)ÓBò 	%ˆEà˜uŸy™y¨°"Ó5Ñ5ØØ�L‰Lœ˜U›Õ$ð		%ð
 —+‘+˜eÓ$ˆñ 8?Œb�f‰f�Z  WÓ-¨d¨sÑ3ÀB€Gà�(˜G WÐ,Ð,r   c                 óø  — ddl }|j                  t        d¬«      }|j                  «       }d}g }| D ]†  \  }}}}	}
	 |j	                  d|
f«       |j                  «       rŒ.|j	                  d|
|t        |||	|
dt        t        df«       |j                  }|r|j                  ||t        |	xs d	f«       |d
z  }Œˆ |j                  «        |rK|D ]  \  }}}}		 |j	                  d||||	f«       Œ  |j                  «        t        dt        |«      › d�«       |j                  «        |S # t        $ r}t        d|dd › d|› �«       Y d}~�Œd}~ww xY w# t        $ r}t        d|› d|› �«       Y d}~Œ¥d}~ww xY w)z.Batch insert into gov_raw and gov_search (FTS)r   Né
   rH   z)SELECT id FROM gov_raw WHERE page_url = ?zíINSERT INTO gov_raw 
                   (page_url, title, site_name, publish_date, content, summary,
                    source_url, category, industry, group_name, script_name)
                   VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)u   æ”¿åºœå…¬å‘Šzcrawl_ny_tzgg.pyr3   r   z  [DB ERROR] é   r   zVINSERT OR IGNORE INTO gov_search(rowid, title, site_name, summary) VALUES (?, ?, ?, ?)z  [FTS ERROR] id=u     FTSå�Œæ­¥: u   æ�¡)Úsqlite3ÚconnectÚDB_PATHÚcursorÚexecuteÚfetchoneÚ	SITE_NAMEÚINDUSTRYÚGROUPÚ	lastrowidr@   r!   r"   ÚcommitÚlenÚclose)Ú
items_datarp   ÚconnÚcÚinsertedÚ	fts_batchr4   rE   rO   rk   Úpage_urlÚnew_idr+   ÚridÚsites                  r   Ú
save_to_dbr†   š   s›  € ãØ�?‰?œ7¨Bˆ?Ó/€DØ�‰‹€AØ€HØ€IØ7Aò 5Ñ3ˆˆx˜ '¨8ð	5Ø�I‰IÐAÀHÀ;ÔOØ�z‰zŒ|ØØ�I‰Ið?ð ˜5¤)¨X°wÀØ˜>¬8´UÐ<NðPôð —[‘[ˆFÙØ× Ñ  &¨%´¸GºMÀrÐ!JÔKØ˜‰M‰Hð!5ð& 	‡K�K„MáØ)2ò 	6Ñ%ˆC�˜˜gð6Ø—	‘	ØlØ˜%  wÐ/õð	6ð 	�‰ŒÜ�œc )›nÐ-¨SÐ1Ô2à‡J�J„LØ€Oøô# ò 	5Ü�M %¨¨ * ¨R°¨sÐ3×4Ò4ûð	5ûô ò 6ÜÐ)¨#¨¨b°°Ð4×5Ñ5ûð6ús6   ¼#D*Á AD*ÃEÄ*	EÄ3EÅEÅ	E9ÅE4Å4E9c            
      ó6  — dd l } | j                  t        › d�¬«      }|j                  dt        dd¬«       |j                  dd	d
¬«       |j                  «       }|j                  rdn|j                  }t        «       }d}t        d|dz   «      D �]H  }t        dt        j                  d«      › d|› d�dd¬«       t        ||«      \  }}}	|st        d«        �n t        |«      }
|
st        d«        næt        t        |
«      › d|› d|	› d�d¬«       g }|
D ]]  \  }}}t!        ||«      }|sŒt#        ||«      \  }}}}|xs |}|xs |}|j%                  |||||f«       t        j&                  d«       Œ_ t)        |«      }||z  }t        d|› dt        |«      › d|› d�d¬«       |j                  r�Œ'|dk(  s�Œ.t        |«      dkD  s�Œ>t        d«        n t        d «       t        d!|› d"�«       t        d#t        › �«       t        d$t*        › �«       y )%Nr   u   çˆ¬è™«)Údescriptionz--pagesr   u   çˆ¬å�–é¡µæ•°)ÚtypeÚdefaultÚhelpz--fullÚ
store_trueu   å…¨é‡�çˆ¬å�–)Úactionr‹   iç  ú[z%H:%M:%Su   ] ç¬¬u   é¡µ...ú T)ÚendÚflushu   å¤±è´¥u   æ— æ•°æ�®ï¼Œå�œæ­¢u   æ�¡ (å…±u   æ�¡/u   é¡µ))r‘   g333333Ó?u     å…¥åº“r8   u   æ�¡ (ç´¯è®¡ú)u      å…¨éƒ¨å·²å­˜åœ¨ï¼Œå¢žé‡�å�œæ­¢u   
===== å®Œæˆ� =====u   æ–°å¢žå…¥åº“: u    æ�¡u   ç«™ç‚¹: u   åˆ†ç»„: )ÚargparseÚArgumentParserrv   Úadd_argumentr   Ú
parse_argsÚfullÚpagesr   Úranger"   ÚtimeÚstrftimer,   rF   r{   rI   rl   r@   Úsleepr†   rx   )r“   ÚparserÚargsÚ	max_pagesr   Ú	total_newr#   r&   r)   r*   rA   Úbatchr2   r4   rE   Údetail_htmlÚdetail_titleÚdetail_daterO   rk   Úfinal_titleÚ
final_dateÚsaveds                          r   Úmainr¨   Æ   s#  € ÛØ×$Ñ$´I°;¸fÐ1EÐ$ÓF€FØ
×Ñ˜	¬°Q¸^ÐÔLØ
×Ñ˜¨¸NÐÔKØ×ÑÓ€Dà—y’y‘ d§j¡j€IÜ‹m€GØ€Iä˜˜I¨™MÓ*ó  ˆÜ�”$—-‘- 
Ó+Ð,¨E°'°¸&ÐAÀsÐRVÕWÜ#2°7¸GÓ#DÑ ˆˆe�[ÙÜ�(ŒOÚä˜4Ó ˆÙÜÐ&Ô'Ùä”�U“�˜H U G¨4°¨}¸DÐAÈÕNàˆØ%*ò 	Ñ!ˆD�%˜Ü& w°Ó5ˆKÙØÜ:HÈÐVZÓ:[Ñ7ˆL˜+ w°Ø&Ò/¨%ˆKØ$Ò0¨ˆJØ�L‰L˜+ z°7¸GÀTÐJÔKÜ�J‰J�s�Oð	ô ˜5Ó!ˆØ�UÑˆ	Ü�˜˜˜q¤ U£ ¨K¸	°{À!ÐDÈDÕQð �yŒy˜U aœZ¬C°«J¸¬NÜÐ4Ô5ÙðA ôD 
Ð Ô"Ü	ˆN˜9˜+ TÐ
*Ô+Ü	ˆH”Y�KÐ
 Ô!Ü	ˆH”U�GÐ
Õr   Ú__main__)Ú__doc__r   r   ÚsysÚosrš   Úbs4r   rr   r?   ÚLIST_URLrv   rx   rw   r
   r   r   r   r,   rF   rI   rl   r†   r¨   Ú__name__© r   r   ú<module>r±      s¤   ðñ	ó Û 	Û 
Û 	Û Ý à
€Ø!€ØÐ1Ñ1€Ø$€	Ø€Ø€ð DØÐHÑHñ€ð
 Ð\Ñ\€
Ø}€òòò&ò(ò:-òz)òX0ðf ˆzÒÙ…Fð r   