Ë
    V_ŠjÐ"  ã                   óX  — 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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 ej&                  dd«      ZdZdZddddœZdZ ej2                  «       Zej6                  j9                  e«       dd„Zd„ Zd„ Zd„ Z d„ Z!e"dk(  r e!«        yy)u{   Crawler for æ�¥å®‰åŽ¿äººæ°‘æ”¿åºœ - é€šçŸ¥å…¬å‘Š
CMS: cz_govc platform, UTF-8, 24æ�¡/é¡µ
Site: www.laian.gov.cn/zwdt/tzgg/
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoup)Úurljoinzhttp://www.laian.gov.cnz
/zwdt/tzggz/index.htmlu"   æ�¥å®‰åŽ¿äººæ°‘æ”¿åºœ-é€šçŸ¥å…¬å‘Šu   å®‰å¾½æ»�å·žÚ	SEARCH_DBz/root/search.dbé   é   zoMozilla/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                 óD  — t        |«      D ]2  }	 t        j                  | t        ¬«      }d|_        |j
                  c S  y# t        $ rT}||dz
  k  r@t        d|dz   ||fz  t        j                  ¬«       t        j                  d|dz   z  «       n|‚Y d }~ŒŽd }~ww xY w)N)Útimeoutzutf-8é   z  Retry %d/%d: %s©Úfileé   Ú )ÚrangeÚsessionÚgetÚTIMEOUTÚencodingÚtextÚ	ExceptionÚprintÚsysÚstderrÚtimeÚsleep)ÚurlÚretriesÚattemptÚrespÚes        ú /root/gov_crawler/crawl_laian.pyÚfetchr%      sž   € Ü˜“>ò 
ˆð		Ü—;‘;˜s¬G�;Ó4ˆDØ#ˆDŒMØ—9‘9Òð	
ð øô ò 	Ø˜ 1™Ò$ÜÐ)¨W°q©[¸'À1Ð,EÑEÌCÏJÉJÕWÜ—
‘
˜1 ¨!¡Ñ,Õ-à�ô .ûð	ús   �-AÁ	BÁA
BÂBc                 ó  — 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d¬«      }|r|j	                  d	¬«      nd}	|j                  d«      st        t        |«      }|j                  |j                  «       ||	dd f«       ŒÆ |S )u;   Parse list â€” ul.doc_list > li > span.date + a(title/href)úhtml.parserÚulc                 ó   — | xr d| v S )NÚdoc_list© ©Úcs    r$   ú<lambda>zparse_list.<locals>.<lambda>1   s   € ¨!Ò*?°
¸a°€ ó    ©Úclass_ÚliF©Ú	recursiveÚaT©ÚhrefÚtitle©Ústripr7   ÚspanÚdater   ÚhttpNé
   )
r   ÚfindÚfind_allr   Úget_textr:   Ú
startswithr   ÚBASE_URLÚappend)
ÚhtmlÚsoupÚitemsr(   r2   r5   r8   r7   r;   r<   s
             r$   Ú
parse_listrH   -   sû   € ä˜˜}Ó-€DØ€EØ	�‰�4Ñ ?ˆÓ	@€BÙØˆØ�k‰k˜$¨%ˆkÓ0ò 7ˆØ�G‰G�C˜dˆGÓ#ˆÙØØ—‘�g“Ò8 !§*¡*°4 *Ó"8ˆØ�‰y�‰Ó ˆÙ™DØØ�w‰w�v fˆwÓ-ˆÙ,0ˆt�}‰} 4ˆ}Ô(°bˆØ�‰˜vÔ&Üœ8 TÓ*ˆDØ�‰�e—k‘k“m T¨4°°¨9Ð5Õ6ð7ð €Lr/   c           	      óv  — t        | d«      }d}|j                  ddt        j                  dt        j                  «      i¬«      }|r$|j                  d«      r|d   j                  «       }|s%|j                  d«      }|r|j                  d	¬
«      }|sJ|j                  d«      }|r7|j                  d	¬
«      }t        j                  dd|«      j                  «       }d}|j                  d«      D ]G  }|j                  d«      xs dj                  «       }	d|	v sd|	v sŒ/|j                  d«      xs ddd } n |s)t        j                  d| «      }
|
r|
j                  d«      }|j                  dd„ ¬«      }g }g }|�rb|j                  dd„ ¬«      xs |}|j                  ddg«      D ]  }|j                  «        Œ |j                  g d¢d	¬«      D �]_  }|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Œˆ|j                  d#j!                  |«      «       Œ©|j                  d$k(  r7|j                  dd	¬
«      }|sŒÎt#        |«      d%kD  sŒÝ|j                  |«       Œï|j                  d&k(  sŒÿ|j                  d'd«      }|j                  d(d«      }|s�Œ'|j%                  d)«      st'        ||«      }|j                  d*|xs d›d+|›d,�«       �Œb |j                  d-d	¬.«      D ]”  }|d/   j                  «       }t        j                  d0|t        j                  «      sŒ<|j%                  d)«      r|nt'        ||«      }|j                  |j                  d	¬
«      xs |j)                  d1«      d2   |d3œ«       Œ– d4j!                  |«      }t#        |j                  «       «      d5k  rd6|›d7|xs |j)                  d1«      d2   ›d8�}||||fS c c}w )9uE   Parse detail â€” div.lmcontent > div.newscontnet > p/table/img + metar'   r   ÚmetaÚnamezArticleTitle|Title)ÚattrsÚcontentÚh1Tr9   r8   z_[^_]+$ÚpubdateÚpublishdateNr>   u,   å�‘å¸ƒæ—¶é—´[ï¼š:]\s*(\d{4}-\d{1,2}-\d{1,2})r   Údivc                 ó,   — | xr d| v xs d| v xs | dk(  S )NÚ	lmcontentÚnewscontnetrM   r+   r,   s    r$   r.   zparse_detail.<locals>.<lambda>d   s'   € °AÒ4t¸;È!Ð;KÒ;sÈ}Ð`aÐOaÒ;sÐefÐjsÑes€ r/   r0   c                 ó   — | xr d| v S )NrT   r+   r,   s    r$   r.   zparse_detail.<locals>.<lambda>j   s   € ¸Ò9Q¸}ÐPQÐ?Q€ r/   ÚscriptÚstyle)ÚpÚtableÚimgr3   rY   ÚtrÚtdÚthú z| z | z |ú
rX   é   rZ   ÚsrcÚaltr=   z![z](ú)r5   r6   r7   z&\.(pdf|doc|docx|xls|xlsx|zip|rar|txt)$ú/éÿÿÿÿ)r8   r   z

r   z<p><a href="z">z</a></p>)r   r?   ÚreÚcompileÚIr   r:   rA   Úsubr@   ÚlowerÚsearchÚgroupÚ	decomposerK   rD   ÚjoinÚlenrB   r   Úsplit)rE   r   rF   r8   Útitle_elrN   Ú	title_tagÚpub_daterJ   rK   ÚmÚcontent_divÚpartsÚattachÚinnerÚnoiseÚchildÚrowsr[   r\   ÚcellsÚtxtra   rb   r5   ÚahrefÚfull_urlrM   s                               r$   Úparse_detailr€   D   sî  € ä˜˜}Ó-€Dð €EØ�y‰y˜¨´·
±
Ð;PÔRT×RVÑRVÓ0WÐ'XˆyÓY€HÙ�H—L‘L Ô+Ø˜Ñ#×)Ñ)Ó+ˆÙØ�Y‰Y�t‹_ˆÙØ—K‘K d�KÓ+ˆEÙØ—I‘I˜gÓ&ˆ	ÙØ×&Ñ&¨TÐ&Ó2ˆEÜ—F‘F˜: r¨5Ó1×7Ñ7Ó9ˆEð €HØ—‘˜fÓ%ò ˆØ—‘˜Ó Ò& B×-Ñ-Ó/ˆØ˜Ñ °Ò 5ØŸ™ Ó+Ò1¨r°3°BÐ7ˆHÙð	ñ
 Ü�I‰IÐEÀtÓLˆÙØ—w‘w˜q“zˆHð —)‘)˜EÑ*t�)Óu€KØ€EØ€Fâà× Ñ  Ñ/QÐ ÓRÒaÐVaˆð —^‘^ X¨wÐ$7Ó8ò 	ˆEØ�O‰OÕð	ð —^‘^Ò$9ÀT�^ÓJó 	AˆEØ�z‰z˜WÒ$Ø�ØŸ.™.¨Ó.ò E�BØDFÇKÁKÐQUÐW[ÐP\ÓD]Ö^¸b˜RŸ[™[¨°D˜[Õ9Ð^�EÐ^ÚØŸ™ D¨5¯:©:°eÓ+<Ñ$<¸tÑ$CÕDðEò Ø—L‘L §¡¨4£Õ1Ø—‘˜sÒ"Ø—n‘n S°�nÓ5�Úœ3˜s›8 a›<Ø—L‘L Õ%Ø—‘˜uÓ$Ø—i‘i  rÓ*�Ø—i‘i  rÓ*�ÛØŸ>™>¨&Ô1Ü% c¨3Ó/˜Ø—L’L°²	°r±	º3Ð!?Ö@ð'	Að, —‘ ¨$�Ó/ò 	mˆAØ�f‘I—O‘OÓ%ˆEÜ�y‰yÐBÀEÌ2Ï4É4ÕPØ$)×$4Ñ$4°VÔ$<™5Ä'È#ÈuÓBU�Ø—‘¨¯
©
¸¨
Ó(>Ò(YÀ(Ç.Á.ÐQTÓBUÐVXÑBYÐbjÑkÕlð		mð �k‰k˜%Ó €GÜ
ˆ7�=‰=‹?Ó˜bÓ Ú25°uÒ7RÀÇ	Á	È#ÃÈrÑ@RÑ7RÐSˆà�(˜G VÐ+Ð+ùò9 _s   ÈP6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ÚstrptimerD   Ú
ValueErrorÚ
IndexError)rG   ÚcutoffÚfilteredr8   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        d|z  z   «       Œ g }t        |«      D ]Y  \  }}	 t        |«      }t        |«      }t        d|dz   t        |«      fz  t        j                  ¬«       |j                  |«       Œ[ t        d	t        |«      z  t        j                  ¬«       | r2t        |«      }t        d
t        |«      z  t        j                  ¬«       t        «       }	g }
|D ]/  }|d   |	vsŒ|	j!                  |d   «       |
j	                  |«       Œ1 t        dt        |
«      z  t        j                  ¬«       g }|
D ]…  \  }}}	 t        |«      }t#        ||«      \  }}}}|xs |}|xs |}|j	                  |||||rt%        j&                  |d¬«      ndt(        dœ«       t        d|d d z  t        j                  ¬«       Œ‡ d}d}d}|D �]  }|j+                  dd«      d d }t-        j.                  dd|d d «      j1                  «       xs |d   }|j+                  dd«      }t3        |t4        «      rnt%        j&                  |d¬«      }	 t7        j8                  t:        «      }|j=                  «       }|j?                  d|d   |d   |d   t(        t@        ||||d   f	«       |jB                  dkD  r|dz  }n|dz  }|jE                  «        |jG                  «        �Œ t        d t(        |||fz  t        j                  ¬«       |D ]"  }t        t%        j&                  |d¬«      «       Œ$ y # t        $ r/}t        d|dz   ||fz  t        j                  ¬«       Y d }~�ŒKd }~ww xY w# t        $ r,}t        d|›d|›�t        j                  ¬«       Y d }~�Œad }~ww xY w# t        $ r.}|dz  }t        d|z  t        j                  ¬«       Y d }~�Œd }~ww xY w)!Nc              3   ó@   K  — | ]  }|t         j                  v –— Œ y ­w)N)r   Úargv)Ú.0Úargs     r$   ú	<genexpr>zmain.<locals>.<genexpr>¡   s   è ø€ Ò\¨S˜¤§¡œÑ\ùs   ‚)z--incrementalÚincrementalÚincr`   r   z?page=%dzPage %d: %d itemsr   zPage %d error (%s): %sz	Total: %dzIncremental: %dz
Unique: %dF)Úensure_asciir   )r8   Úpage_urlÚpublish_daterM   ÚattachmentsÚ	site_namez  OK: %sé2   z  ERR z: r   rM   iPÃ  z\s+r^   éÈ   r8   r˜   zºINSERT OR IGNORE INTO gov_raw
                (page_url, title, publish_date, site_name, group_name, summary, content, attachments, source_url)
                VALUES (?,?,?,?,?,?,?,?,?)r–   r—   z  DB error: %sz-[%s] Done! Saved: %d, Skipped: %d, Errors: %d)$ÚanyÚLIST_URLr   Ú	MAX_PAGESrD   Ú	enumerater%   rH   r   ro   r   r   Úextendr   rŒ   ÚsetÚaddr€   ÚjsonÚdumpsÚ	SITE_NAMEr   rf   ri   r:   Ú
isinstanceÚstrÚsqlite3ÚconnectÚDB_PATHÚcursorÚexecuteÚGROUPÚrowcountÚcommitÚclose)Úis_incrementalÚ	page_urlsÚiÚ	all_itemsÚidxr   rE   rG   r#   ÚseenÚunique_itemsÚitemÚresultsr8   Ú	list_dateÚ	det_titleÚdet_daterM   r˜   Úfinal_titleÚ
final_dateÚsavedÚskippedÚerrorsÚrÚcontent_textÚsummaryÚconnr-   s                                r$   ÚmainrÆ       sé  € ÜÑ\Ð4[Ô\Ó\€Nô �
€IÜ�1”i !‘mÓ$ò 4ˆØ×Ñœ J°¡NÑ2Õ3ð4ð €IÜ˜iÓ(ò Q‰ˆˆSð	QÜ˜“:ˆDÜ˜tÓ$ˆEÜÐ%¨¨q©´#°e³*Ð(=Ñ=ÄCÇJÁJÕOØ×Ñ˜UÕ#ðQô 
ˆ+œ˜I›Ñ
&¬S¯Z©ZÕ8áÜ& yÓ1ˆ	ÜÐ¤# i£.Ñ0´s·z±zÕBô ‹5€DØ€LØò &ˆØ�‰7˜$ÒØ�H‰H�T˜!‘WÔØ×Ñ Õ%ð&ô
 
ˆ,œ˜\Ó*Ñ
*´·±Õ<à€GØ!-ò >Ñˆˆs�Ið	>Ü˜“:ˆDÜ8DÀTÈ3Ó8OÑ5ˆI�x ¨+Ø#Ò, uˆKØ!Ò. YˆJØ�N‰NØ$ØØ *Ø"ÙNYœtŸz™z¨+ÀEÕJÐ_aÜ&ñô ô �*˜{¨3¨BÐ/Ñ/´c·j±jÖAð>ð$ €EØ€GØ€FØó 9ˆØ—u‘u˜Y¨Ó+¨F¨UÐ3ˆÜ—&‘&˜  l°4°CÐ&8Ó9×?Ñ?ÓAÒOÀQÀwÁZˆØ—e‘e˜M¨2Ó.ˆÜ�k¤3Ô'ØäŸ*™* [¸uÔEˆKð	9Ü—?‘?¤7Ó+ˆDØ—‘“ˆAØ�I‰Ið .ð �:‘  '¡
¨A¨nÑ,=ÜœE 7¨LØ˜a 
™mð-ô.ð �z‰z˜AŠ~Ø˜‘
‘à˜1‘�Ø�K‰KŒMØ�J‰JŽLð-9ô6 
Ð
9¼YÈÈwÐX^Ð<_Ñ
_Ôfi×fpÑfpÕqð ò 1ˆÜŒd�j‰j˜¨Ô/Õ0ñ1øôO ò 	QÜÐ*¨c°A©g°s¸AÐ->Ñ>ÄSÇZÁZ×PÓPûð	QûôF ò 	>Ý¢C©Ð+´#·*±*×=Ó=ûð	>ûô: ò 	9Ø�a‰KˆFÜÐ" QÑ&¬S¯Z©Z×8Ó8ûð	9úsK   Á!AM2ÆA>N-ÊBO%Í2	N*Í;$N%Î%N*Î-	O"Î6!OÏO"Ï%	PÏ.#PÐPÚ__main__)r   )#Ú__doc__Úrequestsrf   r£   r   Úosr¨   r   r   r   Úbs4r   Úurllib.parser   rC   Ú	LIST_PATHr�   r¥   r­   Úgetenvrª   rž   r„   ÚHEADERSr   ÚSessionr   ÚheadersÚupdater%   rH   r€   rŒ   rÆ   Ú__name__r+   r/   r$   ú<module>rÔ      sÏ   ðñ÷ 2× 1× 1Ó 1ß (Ý Ý  à$€Ø€	Ø�iÑ -Ñ/€Ø0€	Ø€Ø
ˆ"�)‰)�KÐ!2Ó
3€Ø€	ØÐ ð DØOØ0ñ€ð
 €Ø
ˆ(×
Ñ
Ó
€Ø ‡�× Ñ �wÔ óòò.L,ò^
òW1ðt ˆzÒÙ…Fð r/   