Ë
    9JŠj"*  ã                   óN  — 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mZ ddl	m
Z
 ddlmZ dZdZeez   dz   Zd	Zd
ZdZdZ ej(                  dd«      ZddddœZdZ ej0                  «       Zej4                  j7                  e«       d„ Zd„ Zd„ Zd„ Zd„ Z e!dk(  r e «        yy)u°   
Crawler for å’Œå¸ƒå…‹èµ›å°”è’™å�¤è‡ªæ²»åŽ¿äººæ°‘æ”¿åºœ - é€šçŸ¥å…¬å‘Š
CMS: è‡ªå®šä¹‰ï¼Œul.list.pt20åˆ—è¡¨ + div.content_p#NewsContentæ­£æ–‡
Site: www.xjhbk.gov.cn/xjhbk/tzgg/
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoup)Úurljoinzhttp://www.xjhbk.gov.cnz/xjhbk/tzggz/list.shtmlu   å’Œå¸ƒå…‹èµ›å°”åŽ¿-é€šçŸ¥å…¬å‘Šu   æ–°ç–†é   é   Ú	SEARCH_DBz/root/search.dbzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36z?text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8zzh-CN,zh;q=0.9,en;q=0.8)z
User-AgentÚAcceptzAccept-Languageé   c                 ó^   — t         j                  | t        ¬«      }d|_        |j                  S )N)Útimeoutzutf-8)ÚsessionÚgetÚTIMEOUTÚencodingÚtext)ÚurlÚresps     ú%/root/gov_crawler/crawl_xjhbk_tzgg.pyÚfetchr       s%   € Ü�;‰;�s¤Gˆ;Ó,€DØ€D„MØ�9‰9Ðó    c                 óZ  — t        | d«      }g }|j                  dd¬«      }|s|S |j                  dd¬«      D ]ï  }|j                  dd	¬
«      }|sŒ|j                  d«      xs |j	                  d	¬«      }|d   j                  «       }|r|sŒV|j                  d«      }|r|j	                  d	¬«      nd}	|j                  d«      r
t        |z   }n3|j                  d«      s"t        t        z   dz   |j                  d«      z   }|j                  |j                  «       ||	dd f«       Œñ |S )u–   
    Parse list page â€” ul.list.pt20 > li > a[title] + span(date)
    Pagination: list.shtml ~ list_6.shtml (6 pages, 20 items/page, ~116 total)
    úhtml.parserÚulÚlist©Úclass_ÚliF)Ú	recursiveÚaT©ÚhrefÚtitle©Ústripr"   ÚspanÚ ú/Úhttpz./Né
   )r   ÚfindÚfind_allr   Úget_textr%   Ú
startswithÚBASE_URLÚ	LIST_PATHÚlstripÚappend)
ÚhtmlÚsoupÚitemsr   r   r    r#   r"   Ú	date_spanÚdates
             r   Ú
parse_listr8   &   s   € ô
 ˜˜}Ó-€DØ€EØ	�‰�4 ˆÓ	'€BÙØˆØ�k‰k˜$¨%ˆkÓ0ò 7ˆØ�G‰G�C˜dˆGÓ#ˆÙØØ—‘�g“Ò8 !§*¡*°4 *Ó"8ˆØ�‰y�‰Ó ˆÙ™DØà—G‘G˜F“Oˆ	Ù1:ˆy×!Ñ!¨Ð!Ô-Àˆà�?‰?˜3ÔÜ˜d‘?‰DØ—‘ Ô(ÜœiÑ'¨#Ñ-°·±¸DÓ0AÑAˆDØ�‰�e—k‘k“m T¨4°°¨9Ð5Õ6ð!7ð" €Lr   c           	      óÚ
  — t        | d«      }d}|j                  dd¬«      }|r%|j                  d«      }|r|j                  d¬«      }|s;|j                  d	d
di¬«      }|r$|j                  d«      r|d   j	                  «       }d}|j                  dd¬«      }|r|j                  d¬«      }d}	|j                  dd¬«      }
|
r;|
j                  d¬«      }t        j                  d|«      }|r|j                  d«      }	|	sT|j                  d	d
di¬«      }|r=|j                  d«      r,t        j                  d|d   «      }|r|j                  d«      }	d}|j                  dd¬«      }|�rg }|}t        d„ |j                  D «       d«      }|r|j                  dk(  r|}|j                  D �]®  }t        |d
d«      sŒ|j                  j                  «       }|dk(  �rˆg }|j                  D �]N  }t        |t        «      r%|j	                  «       }|sŒ'|j!                  |«       Œ9|j                  dk(  rp|j                  dd«      j	                  «       }|j                  d¬«      }|r'|r%t#        ||«      }|j!                  d|› d|› d�«       Œ£|sŒ¦|j!                  |«       Œ¸|j                  dk(  rR|j                  dd«      }|sŒÜ|j                  dd«      }t#        ||«      }|j!                  |rd|› d �nd|› d �«       �Œt%        |d!«      s�Œ'|j                  d"d¬«      }|s�Œ>|j!                  |«       �ŒQ d"j'                  |«      }|s�Œ§|j!                  |«       �Œº|d#k(  r˜g }|j)                  d$«      D ]\  }|j)                  d%d&g«      D � cg c]  } | j                  d"d¬«      ‘Œ }!} |!sŒ7|j!                  d'd(j'                  |!«      z   d)z   «       Œ^ |s�Œ5|j!                  d*j'                  |«      «       �ŒW|dk(  s�Œ^|j                  dd«      }|s�Œt|j                  dd«      }t#        ||«      }|j!                  |rd|› d �nd|› d �«       �Œ± d+j'                  |«      }|xs |}"g }#|"j)                  dd¬,«      D ]‘  }$|$d   j	                  «       j                  «       }t        j                  d-|«      sŒ;t#        ||$d   j	                  «       «      }%|#j!                  |$j                  d¬«      xs |%j+                  d.«      d/   |%d0œ«       Œ“ t-        |j	                  «       «      d1k  r$|#r"d|› d|› d2�}|#D ]  }&|d3|&d4   › d5|&d6   › d7�z  }Œ ||	|||#fS c c} w )8uÇ   
    Parse detail page â€” div.content_p#NewsContent
    Title from div.contentbox > h3
    Source from span.from
    Date from span.date
    Attachments from <a href="...pdf|doc|docx|xls|xlsx">
    r   r'   ÚdivÚ
contentboxr   Úh3Tr$   ÚmetaÚnameÚArticleTitle)ÚattrsÚcontentr&   Úfromr7   z(\d{4}-\d{2}-\d{2})é   ÚPubDateÚ	content_pc              3   ó<   K  — | ]  }t        |d d«      sŒ|–— Œ y­w)r>   N)Úgetattr)Ú.0Úcs     r   ú	<genexpr>zparse_detail.<locals>.<genexpr>w   s   è ø€ ÒX !¼wÀqÈ&ÐRVÕ?WœAÑXùs   ‚•NÚpr    r"   z<p><a href="z">z</a></p>ÚimgÚsrcÚaltu   ">æŸ¥çœ‹å›¾ç‰‡</a></p>r-   ú ÚtableÚtrÚtdÚthz| ú | z |ú
z

r!   z&\.(pdf|doc|docx|xls|xlsx|zip|rar|txt)$r(   éÿÿÿÿ)r#   r   r   u   </a></p>

é™„ä»¶åˆ—è¡¨ï¼š
z  - [r#   z](r   z)
)r   r+   r-   r   r%   ÚreÚsearchÚgroupÚnextÚchildrenr>   rG   ÚlowerÚcontentsÚ
isinstanceÚstrr2   r   ÚhasattrÚjoinr,   ÚsplitÚlen)'r3   r   r4   r#   r;   r<   Ú
meta_titleÚsourceÚ	from_spanÚpub_dater6   Ú	date_textÚmÚ	meta_dateÚcontent_htmlÚcontent_divÚpartsÚinnerÚfirst_childÚchildÚtagÚp_partsÚelemÚtxtÚahrefÚatxtÚ	full_hrefrM   rN   Úfull_srcÚ
table_rowsrQ   rR   ÚcellsÚscopeÚattachmentsr    Úfull_urlÚatts'                                          r   Úparse_detailr   D   su  € ô ˜˜}Ó-€Dð €EØ—‘˜5¨�Ó6€JÙØ�_‰_˜TÓ"ˆÙØ—K‘K d�KÓ+ˆEÙØ—Y‘Y˜v¨f°nÐ-E�YÓFˆ
Ù˜*Ÿ.™.¨Ô3Ø˜yÑ)×/Ñ/Ó1ˆEð €FØ—	‘	˜&¨�	Ó0€IÙØ×#Ñ#¨$Ð#Ó/ˆð €HØ—	‘	˜&¨�	Ó0€IÙØ×&Ñ&¨TÐ&Ó2ˆ	Ü�I‰IÐ,¨iÓ8ˆÙØ—w‘w˜q“zˆHáØ—I‘I˜f¨V°YÐ,?�IÓ@ˆ	Ù˜Ÿ™ yÔ1Ü—	‘	Ð0°)¸IÑ2FÓGˆAÙØŸ7™7 1›:�ð €LØ—)‘)˜E¨+�)Ó6€KÚØˆàˆÜÑX {×';Ñ';ÔXÐZ^Ó_ˆÙ˜;×+Ñ+¨uÒ4ØˆEØ—^‘^ó .	NˆEÜ˜5 &¨$Ô/ØØ—*‘*×"Ñ"Ó$ˆCØ�c‹zØ�Ø!ŸN™Nó 0�DÜ! $¬Ô,Ø"Ÿj™j›l˜ÚØ#ŸN™N¨3Õ/ØŸ™ cÒ)Ø $§¡¨°Ó 4× :Ñ :Ó <˜Ø#Ÿ}™}°4˜}Ó8˜Ù ¡TÜ(/°°UÓ(;˜IØ#ŸN™N¨\¸)¸ÀBÀtÀfÈHÐ+UÕVÚ!Ø#ŸN™N¨4Õ0ØŸ™ eÒ+Ø"Ÿh™h u¨bÓ1˜ÚØ"&§(¡(¨5°"Ó"5˜CÜ'.¨s°CÓ'8˜HØ#ŸN™NÑ^a¨\¸(¸ÐCYÑ+ZÐiuÐv~Ðuð  @Vð  hWö  XÜ   zÖ2Ø"Ÿm™m¨C°t˜mÓ<˜ÛØ#ŸN™N¨3Ö/ð-0ð. —h‘h˜wÓ'�ÛØ—L‘L Ö%Ø˜’à�
ØŸ.™.¨Ó.ò K�BØDFÇKÁKÐQUÐW[ÐP\ÓD]Ö^¸b˜RŸ[™[¨°D˜[Õ9Ð^�EÐ^ÚØ"×)Ñ)¨$°·±¸EÓ1BÑ*BÀTÑ*IÕJðKó Ø—L‘L §¡¨:Ó!6Ö7Ø˜”Ø—i‘i  rÓ*�ÛØŸ)™) E¨2Ó.�CÜ& s¨CÓ0�HØ—L‘LÑTW <°¨zÐ9OÑ!PÐ_kÐltÐkuð  vLð  ^Mö  Nð].	Nð^ —{‘{ 5Ó)ˆð Ò˜4€EØ€KØ�^‰^˜C dˆ^Ó+ò nˆØ�&‘	—‘Ó!×'Ñ'Ó)ˆÜ�9‰9Ð>ÀÕFÜ˜s A f¡I§O¡OÓ$5Ó6ˆHØ×Ñ¨¯©¸$¨Ó)?Ò)ZÀ8Ç>Á>ÐRUÓCVÐWYÑCZÐckÑlÕmð	nô ˆ<×ÑÓÓ  2Ò%©+Ø% c U¨"¨U¨GÐ3PÐQˆØò 	DˆCØ˜e C¨¡L >°°C¸±J°<¸sÐCÑC‰Lð	Dð �(˜F L°+Ð=Ð=ùò9 _s   ÎU(c                 ó  — t        j                  «       t        t        ¬«      z
  }g }| D ]6  \  }}}	 t        j                  |d«      }||k\  r|j                  |||f«       Œ8 |S # t        t        f$ r |j                  |||f«       Y Œ`w xY w)N)Údaysz%Y-%m-%d)r   Únowr   ÚINCREMENTAL_DAYSÚstrptimer2   Ú
ValueErrorÚ
IndexError)r5   ÚcutoffÚfilteredr#   r   Údate_strÚ	item_dates          r   Úincremental_filterr‹   ½   s–   € Ü�\‰\‹^œiÔ-=Ô>Ñ>€FØ€HØ %ò 4Ñˆˆs�Hð	4Ü ×)Ñ)¨(°JÓ?ˆIØ˜FÒ"Ø—‘ ¨¨XÐ 6Ô7øð	4ð €Oøô œJÐ'ò 	4Ø�O‰O˜U C¨Ð2Ö3ð	4ús   ²/A%Á%#BÂ
Bc                  ó¬  — t        d„ dD «       «      } t        g}t        dt        dz   «      D ]%  }|j	                  t
        t        z   d|› d�z   «       Œ' g }t        |«      D ][  \  }}	 t        |«      }t        |«      }t        d|dz   › dt        |«      › d	�t        j                  ¬
«       |j                  |«       Œ] t        dt        |«      › �t        j                  ¬
«       | r2t!        |«      }t        dt        |«      › �t        j                  ¬
«       t#        «       }	g }
|D ]/  }|d   |	vsŒ|	j%                  |d   «       |
j	                  |«       Œ1 t        dt        |
«      › �t        j                  ¬
«       t'        j(                  t*        «      }|j-                  «       }d}d}d}|
D �]^  \  }}}	 |j/                  d|f«       |j1                  «       r|dz  }Œ2t        |«      }t3        ||«      \  }}}}}|xs |}|xs |}|r|s$|dz  }t        d|› �t        j                  ¬
«       Œƒt5        |j7                  dd«      «      }|r|d d nd}t9        j:                  dd|d d «      j=                  «       xs |}|rt?        j@                  |d¬«      nd}|j/                  d|||tB        tD        ||||f	«       |jF                  dkD  r:|jI                  «        |dz  }t        d|d d › d|› �t        j                  ¬
«       n|dz  }�Œa |jM                  «        t        d |› d!|› d"|› d#�t        j                  ¬
«       y # t        $ r2}t        d|dz   › d|› d|› �t        j                  ¬
«       Y d }~�Œd }~ww xY w# t        $ rA}|jK                  «        |dz  }t        d|› d|› �t        j                  ¬
«       Y d }~�Œd }~ww xY w)$Nc              3   ó@   K  — | ]  }|t         j                  v –— Œ y ­w)N)ÚsysÚargv)rH   Úargs     r   rJ   zmain.<locals>.<genexpr>Ë   s   è ø€ Ò\¨S˜¤§¡œÑ\ùs   ‚)z--incrementalÚincrementalÚincé   rC   z/list_z.shtmlzPage z: z items)Úfilez error (z): zTotal: zIncremental: zUnique: r   z'SELECT id FROM gov_raw WHERE page_url=?z  SKIP (no title/date): ú-r'   iPÃ  z\s+rO   éÈ   F)Úensure_asciizÀINSERT OR IGNORE INTO gov_raw
                   (page_url, title, publish_date, site_name, group_name, summary, content, attachments, source_url)
                   VALUES (?,?,?,?,?,?,?,?,?)z  OK: é2   rT   z  ERR z
=== Done: saved=z
, skipped=z	, errors=z ===)'ÚanyÚLIST_URLÚrangeÚ	MAX_PAGESr2   r/   r0   Ú	enumerater   r8   Úprintrc   rŽ   ÚstderrÚextendÚ	Exceptionr‹   ÚsetÚaddÚsqlite3ÚconnectÚDB_PATHÚcursorÚexecuteÚfetchoner   ÚintÚreplacerW   Úsubr%   ÚjsonÚdumpsÚ	SITE_NAMEÚGROUPÚrowcountÚcommitÚrollbackÚclose)Úis_incrementalÚ	page_urlsÚiÚ	all_itemsÚidxr   r3   r5   ÚeÚseenÚunique_itemsÚitemÚconnÚcurÚsavedÚskippedÚerrorsr#   Úitem_urlÚ	list_dateÚ	det_titleÚdet_datere   rA   r|   Úfinal_titleÚ
final_dateÚ	date_rankÚcontent_textÚsummaryÚattachments_jsons                                  r   ÚmainrÍ   Ê   sÆ  € ÜÑ\Ð4[Ô\Ó\€Nô �
€IÜ�1”i !‘mÓ$ò DˆØ×Ñœ¤IÑ-°&¸¸¸6Ð0BÑBÕCðDð €IÜ˜iÓ(ò G‰ˆˆSð	GÜ˜“:ˆDÜ˜tÓ$ˆEÜ�E˜#˜a™%˜ ¤3 u£: ,¨fÐ5¼C¿J¹JÕGØ×Ñ˜UÕ#ðGô 
ˆG”C˜	“NÐ#Ð
$¬3¯:©:Õ6áÜ& yÓ1ˆ	Ü�œc )›nÐ-Ð.´S·Z±ZÕ@ô ‹5€DØ€LØò &ˆØ�‰7˜$ÒØ�H‰H�T˜!‘WÔØ×Ñ Õ%ð&ô 
ˆH”S˜Ó&Ð'Ð
(¬s¯z©zÕ:ô �?‰?œ7Ó#€DØ
�+‰+‹-€CØ€EØ€GØ€Fà&2ó -=Ñ"ˆˆx˜ð,	=à�K‰KÐAÀHÀ;ÔOØ�|‰|Œ~Ø˜1‘�Øä˜“?ˆDÜ@LÈTÐS[Ó@\Ñ=ˆI�x ¨°+à#Ò, uˆKØ!Ò. YˆJá¡jØ˜!‘�ÜÐ0°°
Ð;Ä#Ç*Á*ÕMØä˜J×.Ñ.¨s°BÓ7Ó8ˆIñ /6˜7 6 E™?¸2ˆLÜ—f‘f˜V S¨,°t¸Ð*<Ó=×CÑCÓEÒTÈˆGáNYœtŸz™z¨+ÀEÕJÐ_aÐà�K‰Kð1ð ˜;¨
ÜœE 7¨LØ! 8ð-ô	ð �|‰|˜aÒØ—‘”Ø˜‘
�Ü˜˜{¨3¨BÐ/Ð0°°J°<Ð@ÄsÇzÁzÖRà˜1‘�ùðQ-=ð^ 	‡J�J„LÜ	Ð˜u˜g Z°¨y¸	À&ÀÈÐ
NÔUX×U_ÑU_Ö`øôS ò 	GÜ�E˜#˜a™%˜ ¨¨¨S°°Ð4¼3¿:¹:×FÓFûð	GûôF ò 	=Ø�M‰MŒOØ�a‰KˆFÜ�F˜8˜* B q cÐ*´·±×<Ó<ûð	=ús?   Á)AMÆ<(N	Ç%AN	È6CN	Í	NÍ'NÎNÎ		OÎ6OÏOÚ__main__)"Ú__doc__ÚrequestsrW   r­   rŽ   Úosr¤   r   r   Úbs4r   Úurllib.parser   r/   r0   rš   r¯   r°   rƒ   rœ   Úgetenvr¦   ÚHEADERSr   ÚSessionr   ÚheadersÚupdater   r8   r   r‹   rÍ   Ú__name__© r   r   ú<module>rÛ      sÍ   ðñ÷
 ,× +× +ß (Ý Ý  à$€Ø€	Ø�iÑ -Ñ/€Ø-€	Ø€ØÐ Ø€	Ø
ˆ"�)‰)�KÐ!2Ó
3€ð DØOØ0ñ€ð
 €Ø
ˆ(×
Ñ
Ó
€Ø ‡�× Ñ �wÔ òòò<v>òr
òYaðx ˆzÒÙ…Fð r   