Ë
    ¸¬ujå  ã                   ó   — 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mZ d dlZ e j                  dd«      ZdZ	dZ
e
dz   Zdd	d
dddddœZ ej                  «        ed¬«      z
  j                  d«      ZddiZd„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)é    N)ÚdatetimeÚ	timedeltaÚ	SEARCH_DBz/root/search.dbu   ç™½é“¶é«˜æ–°åŒº-é€šçŸ¥å…¬å‘Šzhttps://www.baiyin.gov.cnz7/api-gateway/jpaas-publish-server/front/page/build/unitÚbulidstaticÚ 95a12467959f44d29b0148749a6e0dafÚ 718c52a1506547739d141ce0ed891fd3Úcolumnu   åˆ—è¡¨æ•°æ�®ÚnullÚ 30a6064e0b3740f1ab77f5f04dc436bf)Ú	parseTypeÚwebIdÚtplSetIdÚpageTypeÚtagIdÚeditTypeÚpageIdiG  )Údaysz%Y-%m-%dz
User-Agentz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36c                 óÎ  — 	 t        t        t        | «      ¬«      }t        j                  t
        |t        d¬«      }|j                  «       }|d   d   }t        j                  d|t        j                  «      }t        j                  d|«      }|rt        |j                  d«      «      n
t        |«      }||fS # t        $ r }t!        d	| |fz  d
¬«       g dfcY d}~S d}~ww xY w)z$Fetch one page of list data from API)Úpageé   )ÚparamsÚheadersÚtimeoutÚdataÚhtmlzG<a class="fl" href="([^"]+)" title="([^"]*)".*?<span class="fr">([^<]+)zcount="(\d+)"é   z  API error page %d: %sT©Úflushr   N)ÚdictÚ
API_PARAMSÚstrÚrequestsÚgetÚAPI_URLÚHEADERSÚjsonÚreÚfindallÚDOTALLÚsearchÚintÚgroupÚlenÚ	ExceptionÚprint)	r   r   Úrr   r   ÚitemsÚcount_mÚtotalÚes	            ú!/root/gov_crawler/crawl_baiyin.pyÚget_listr6      sÃ   € ðÜ”j¤s¨4£yÔ1ˆÜ�L‰Lœ¨¼È"ÔMˆØ�v‰v‹xˆØ�F‰|˜FÑ#ˆä—
‘
ØVØ”"—)‘)ó
ˆô
 —)‘)Ð,¨dÓ3ˆÙ)0”�G—M‘M !Ó$Ô%´c¸%³jˆØ�eˆ|ÐøÜò ÜÐ'¨4°¨)Ñ3¸4Õ@Ø�1ˆu�ûðús   ‚B8B; Â;	C$ÃCÃC$ÃC$c                 ó  — | j                  d«      }|dk  ry|t        d«      z   }d}|}|t        | «      k  rJ|dkD  rE| ||dz    dk(  r|dz  }|dz  }n| ||dz    dk(  r|dz  }|dz  }n|dz  }|t        | «      k  r|dkD  rŒE| ||dz
   }t        j                  d	d|t        j                  t        j
                  z  ¬
«      }t        j                  dd|t        j                  t        j
                  z  ¬
«      }|j                  «       S )zGExtract content from div.content inside div.detail using depth countingz<div class="content">r   Ú r   é   z<divé   z</div>z<script[^>]*>.*?</script>)Úflagsz<style[^>]*>.*?</style>)Úfindr-   r'   Úsubr)   ÚIÚstrip)r   ÚidxÚstartÚdepthÚposÚcontents         r5   Úextract_contentrE   ,   s  € à
�)‰)Ð+Ó
,€CØ
ˆQ‚wØØ”#Ð-Ó.Ñ.€EØ€EØ
€CØ
”�D“	Š/˜e ašiØ��C˜‘Eˆ?˜fÒ$Ø�Q‰JˆEØ�1‰H‰CØ�#�c˜!‘eˆ_ Ò(Ø�Q‰JˆEØ�1‰H‰Cà�1‰HˆCð ”�D“	Š/˜e a›ið �5˜˜Q™Ð€GÜ�f‰fÐ1°2°wÄbÇiÁiÔPR×PTÑPTÁnÔU€GÜ�f‰fÐ/°°WÄBÇIÁIÌbÏdÉdÁNÔS€GØ�=‰=‹?Ðó    c                 óü  — t         | z   }	 t        j                  |t        d¬«      }d|_        |j
                  }d}t        j                  d|«      }|r"|j                  d«      j                  «       dd }t        |«      }|rt        |j                  «       «      d	k  rd}d}t        j                  d
|«      }|r|j                  d«      }||||fS # t        $ r }	t        d|	z  d¬«       ddd|fcY d}	~	S d}	~	ww xY w)z2Fetch detail page and extract title, date, contentr   )r   r   zutf-8r8   z<title>(.*?)</title>r   NéÈ   é   u"   å�‘å¸ƒæ—¶é—´.*?(\d{4}-\d{2}-\d{2})z  Detail error: %sTr   )ÚBASE_URLr"   r#   r%   ÚencodingÚtextr'   r*   r,   r?   rE   r-   r.   r/   )
Úurl_pathÚurlr0   r   ÚtitleÚtrD   ÚdateÚpdr4   s
             r5   Úfetch_detailrS   B   sð   € ä
�XÑ
€CðÜ�L‰L˜¤g°rÔ:ˆØˆŒ
Ø�v‰vˆØˆÜ�I‰IÐ-¨tÓ4ˆÙØ—G‘G˜A“J×$Ñ$Ó& t¨Ð,ˆEÜ! $Ó'ˆÙœ#˜gŸm™m›oÓ.°Ò3ØˆGàˆÜ�Y‰YÐ<¸dÓCˆÙØ—8‘8˜A“;ˆDØ�d˜G SÐ(Ð(øÜò ÜÐ" QÑ&¨dÕ3Ø�2�r˜3ˆÕûðús   ‹CC Ã	C;ÃC6Ã0C;Ã6C;c                  ó  — t        dt        z  d¬«       t        dd¬«       t        d«      \  } }|dk(  rt        dd¬«       y |dz   d	z  }t        d
||fz  d¬«       t        dd¬«       g }t        d|dz   «      D ]”  }|dkD  rt        |«      n| |f\  }}|s ny|D ]:  \  }}}	|	r
|	t        k  rŒ|j                  «       d d }
|j                  ||
|	dœ«       Œ< |r|d   d   t        k  r n'|dz  dk(  sŒyt        d||t        |«      fz  d¬«       Œ– t        dt        |«      z  d¬«       |st        dd¬«       y t        dd¬«       t        j                  t        «      }|j                  d«       |j                  «       }|j                  d«       d}t        |«      D ]Ý  \  }}t        |d   z   }|j                  d|f«      j                  «       }|rŒ6t!        |d   «      \  }}	}}|xs |d   }|	xs |d   }	|r|j                  «       sd}	 |j                  d|||d d |t        |	df«       |j"                  dkD  r|dz  }|dz   dz  dk(  sŒ°|j'                  «        t        d|dz   t        |«      fz  d¬«       Œß |j'                  «        |j)                  «        t        d |z  d¬«       t        d!d¬«       t        j                  t        «      }|j                  «       }	 |j                  d"t        f«       |j'                  «        t        d#d¬«       |j)                  «        t        d%d¬«       y # t$        $ r}t        d|z  d¬«       Y d }~�Œd }~ww xY w# t$        $ r}t        d$|z  d¬«       Y d }~Œcd }~ww xY w)&NzStarting: %sTr   zPhase 1: Getting list info...r   r   z  No data found!é   é   z  Total items: %d, Pages: %dz!Phase 2: Collecting list items...rH   )rM   rO   rQ   éÿÿÿÿé   é   z(  Collected page %d/%d, items so far: %dz   Total items within 3 years: %dz  Nothing to crawl!z'Phase 3: Fetching details and saving...zPRAGMA journal_mode=WALzáCREATE TABLE IF NOT EXISTS gov_raw (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        title TEXT, content TEXT, summary TEXT,
        source_url TEXT UNIQUE, site_name TEXT,
        publish_date TEXT, category TEXT
    )rM   z*SELECT 1 FROM gov_raw WHERE source_url = ?rO   rQ   r8   zžINSERT OR REPLACE INTO gov_raw
                (title, content, summary, source_url, site_name, publish_date, category)
                VALUES (?,?,?,?,?,?,?)z  DB error: %sr   z  Saved %d/%d items...z  Total saved: %dzPhase 4: Updating FTS...a  INSERT OR REPLACE INTO gov_search (rowid, title, site_name, summary)
            SELECT r.id, r.title, r.site_name, r.summary
            FROM gov_raw r WHERE r.site_name = ? AND r.content != ''
            AND NOT EXISTS (SELECT 1 FROM gov_search s WHERE s.rowid = r.id)z  FTS updatedz  FTS error: %szDone!)r/   Ú	SITE_NAMEr6   ÚrangeÚCUTOFFr?   Úappendr-   Úsqlite3Úconnectr   ÚexecuteÚcursorÚ	enumeraterJ   ÚfetchonerS   Úrowcountr.   ÚcommitÚclose)Ú
first_pager3   Útotal_pagesÚ	all_itemsr   r1   Ú_rM   rO   rQ   Úclean_titleÚconnÚcÚsavedÚiÚitemÚ
detail_urlÚexistingrD   r4   s                       r5   Úmainrs   Z   s˜  € Ü	ˆ.œ9Ñ
$¨DÕ1ä	Ð
)°Õ6Ü  ›Ñ€J�Ø�‚zÜÐ ¨Õ-Øà˜2‘: "Ñ$€KÜ	Ð
(¨E°;Ð+?Ñ
?ÀtÕLä	Ð
-°TÕ:Ø€IÜ�a˜ q™Ó)ò pˆØ%)¨A¢X”8˜D”>°JÀÐ3F‰ˆˆqÙÙØ%*ò 	YÑ!ˆH�e˜TÙ˜œvšØàŸ+™+›-¨¨Ð-ˆKØ×Ñ¨(¸[ÐRVÑWÕXð	Yñ �U˜2‘Y˜q‘\¤FÒ*ÙØ�!‰8�q‹=ÜÐ<ÀÀkÔSVÐW`ÓSaÐ?bÑbÐjnÖoðpô 
Ð
,¬s°9«~Ñ
=ÀTÕJÙÜÐ#¨4Õ0Øä	Ð
3¸4Õ@Ü�?‰?œ9Ó%€DØ‡L�LÐ*Ô+Ø�‰‹€AØ‡I�Ið 	ô 
ð €EÜ˜YÓ'ò P‰ˆˆ4Ü  ZÑ 0Ñ0ˆ
à—9‘9ÐIÈJÈ=ÓY×bÑbÓdˆÙØä".¨t°JÑ/?Ó"@Ñˆˆt�W˜aØÒ&˜˜g™ˆØÒ#�t˜F‘|ˆÙ˜gŸm™mœoØˆGð	4Ø�I‰Ið *ð ˜  t¨ ¨j¼)ÀTÈ2ÐNôPð �z‰z˜AŠ~Ø˜‘
�ð �‰E�R‰<˜1ÓØ�K‰KŒMÜÐ*¨a°©c´3°y³>Ð-BÑBÈ$ÖOð3Pð6 	‡K�K„MØ‡J�J„LÜ	Ð
 Ñ
%¨TÕ2ô 
Ð
$¨DÕ1Ü�?‰?œ9Ó%€DØ�‰‹€Að1Ø	�	‰	ð Pô S\ÐQ]ô	_ð 	�‰ŒÜˆo TÕ*ð 	‡J�J„Lä	ˆ'˜Öøô5 ò 	4ÜÐ" QÑ&¨d×3Ó3ûð	4ûô, ò 1ÜÐ !Ñ#¨4×0Ò0ûð1ús0   È4L9Ë'4M  Ì9	MÍMÍMÍ 	NÍ)M>Í>NÚ__main__)ÚosÚsysr'   r"   r   r   r^   Úgetenvr   rZ   rJ   r$   r    ÚnowÚstrftimer\   r%   r6   rE   rS   rs   Ú__name__© rF   r5   ú<module>r|      s´   ðã 	Ø 3ß × ß (Û àˆB�I‰I�kÐ#4Ó5€	Ø*€	Ø&€Ø
ÐNÑ
N€àØ/Ø2ØØØØ0ñ€
ð ˆ(�,‰,‹.™9¨%Ô0Ñ
0×	:Ñ	:¸:Ó	F€ØÐWÐ
X€òò(ò,ò0\ð| ˆzÒÙ…Fð rF   