Ë
    íþƒjE  ã                   ó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m	Z	 ddl
mZ ddlZ ej                  «        dZdZdZ ej"                  «        e	d¬	«      z
  j%                  d
«      ZdZdZdZdZg d¢Zd„ Zd„ Zd„ Zdd„Zd„ Zd„ Zd„ Zd„ Z e!dk(  r e «        yy)ua  crawl_lixin_jcsd.py - åˆ©è¾›åŽ¿-åŸºå±‚æ”¿åŠ¡å…¬å¼€ä¸“é¢˜ (www.lixin.gov.cn)
ç«™ç‚¹: é�™æ€�HTML, æ— WAF
åˆ—è¡¨: /Jcsd/showList/{subId}/page_{N}.html (21ä¸ªçŽ¯ä¿�å­�æ �ç›®, ä¸“é¢˜é¦–é¡µ 111000000)
  å­�æ �ç›®: 111001001çŽ¯è¯„å®¡æ‰¹ 111001002å›ºåºŸè®¸å�¯ 111001003å�±åºŸè®¸å�¯ 111001004æŽ’æ±¡è®¸å�¯
          111001005å¤œé—´æ–½å·¥ 111001006æŽ’æ±¡å�£å®¡æ‰¹ 111002000è¡Œæ”¿å¤„ç½š 111003000è¡Œæ”¿å¼ºåˆ¶
          111004000è¡Œæ”¿è§„åˆ’ 111006000çŽ¯å¢ƒä¿¡è®¿ 111007000å…¶ä»–æ�ƒåŠ› 111007001çŽ°åœºæ£€æŸ¥
          111007002æ¸…æ´�ç”Ÿäº§ 111007003ä¸“é¡¹èµ„é‡‘ 111008000å…¬å…±æœ�åŠ¡ 111008001çŽ¯ä¿�å®£ä¼ 
          111008002çŽ¯å¢ƒè´¨é‡� 111008003é‡�æ±¡æŸ“å¤©æ°” 111008004å›ºåºŸå�±åºŸ 111009000æ±¡æŸ“ç»¼å�ˆé˜²æ²»
è¯¦æƒ…: /Jcsd/show/{id}.html â†’ div#zoom.j-fontContent + meta ArticleTitle/PubDate
è¿�è¡Œ: python3 crawl_lixin_jcsd.py [--pages=N] [--sub=111001001,...] [--dryrun]
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoupu   åˆ©è¾›åŽ¿-åŸºå±‚æ”¿åŠ¡å…¬å¼€zhttps://www.lixin.gov.cné   iG  )Údaysz%Y-%m-%dzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36z/tmp/lixin_jcsd.jsonlz/root/search.dbzcrawl_lixin_jcsd.py)Ú	111001001Ú	111001002Ú	111001003Ú	111001004Ú	111001005Ú	111001006Ú	111002000Ú	111003000Ú	111004000Ú	111006000Ú	111007000Ú	111007001Ú	111007002Ú	111007003Ú	111008000Ú	111008001Ú	111008002Ú	111008003Ú	111008004Ú	111009000c                  óž   — t         j                  dd  D ]2  } | j                  d«      sŒt        | j	                  d«      d   «      c S  t
        S )Né   z--pages=ú=)ÚsysÚargvÚ
startswithÚintÚsplitÚMAX_PAGES_DEFAULT©Úas    ú%/root/gov_crawler/crawl_lixin_jcsd.pyÚparse_pages_argr(   %   sF   € Ü�X‰X�a�bˆ\ò (ˆØ�<‰<˜
Õ#Ü�q—w‘w˜s“| A‘Ó'Ò'ð(ô Ðó    c                  ó    — t         j                  dd  D ]8  } | j                  d«      sŒ| j                  d«      d   j                  d«      c S  y )Nr   z--sub=r   ú,)r   r    r!   r#   r%   s    r'   Úget_sub_filterr,   ,   sI   € Ü�X‰X�a�bˆ\ò .ˆØ�<‰<˜Õ!Ø—7‘7˜3“< ‘?×(Ñ(¨Ó-Ò-ð.ð r)   c                 ó”   — t        j                  dd| xs d«      j                  «       j                  dd«      j                  dd«      S )Nu   ^[â€¢Â·\s]+Ú u   â€‹u   ï»¿)ÚreÚsubÚstripÚreplace)Úts    r'   Úclean_titler4   3   s>   € Ü�6‰6�. " a¢g¨2Ó.×4Ñ4Ó6×>Ñ>¸xÈÓL×TÑTÐU]Ð_aÓbÐbr)   c                 óÔ   — t        |«      D ]6  }	 t        j                  | dt        idd¬«      }d|_        |j
                  c S  y# t        $ r t        j                  d«       Y ŒZw xY w)Nz
User-Agenté   F)ÚheadersÚtimeoutÚverifyúutf-8é   r.   )	ÚrangeÚrequestsÚgetÚUAÚencodingÚtextÚ	ExceptionÚtimeÚsleep)ÚurlÚretriesÚiÚrs       r'   ÚfetchrI   7   se   € Ü�7‹^ò ˆð	Ü—‘˜S¨<¼Ð*<ÀbÐQVÔWˆAØ ˆAŒJØ—6‘6ŠMð	ð øô ò 	Ü�J‰J�qŽMð	ús   �1AÁA'Á&A'c                 ó*  — t         › d| › d|› d�}t        |«      }|sg S g }t        j                  d|«      D ]Y  }|j	                  d«      |j	                  d«      t        |j	                  d«      «      }}}|j                  |t         |z   dœ«       Œ[ |S )	u   è¿”å›ž [(title, url, date)]z/Jcsd/showList/z/page_z.htmlz5href="(/Jcsd/show/(\d+)\.html)"[^>]*>\s*([^<]{8,100})r   r;   é   )ÚtitlerE   )ÚBASErI   r/   ÚfinditerÚgroupr4   Úappend)	Úsub_idÚpagerE   ÚhtmlÚitemsÚmÚhrefÚid_rL   s	            r'   Ú
list_itemsrX   B   s’   € äˆF�/ & ¨°¨v°UÐ
;€CÜ�‹:€DÙØˆ	Ø€Eä�[‰[ÐQÐSWÓXò ;ˆØŸ7™7 1›: q§w¡w¨q£z´;¸q¿w¹wÀq»zÓ3J�5ˆcˆØ�‰˜u¬T°D©[Ñ9Õ:ð;ð €Lr)   c                 ó  — | j                   dk(  rt        | «      gS | j                   dv ro| j                  d«      rg S | j                  dd¬«      }|rt	        j
                  d|«      rg S t	        j                  ddt        | «      «      j                  «       gS | j                   dk(  rdg }| j                  g d	¢d
¬«      D ]  }|j                  t        |«      «       Œ |s*| j                  dd¬«      }|r|j                  d|› d�«       |S g S )uV   é€’å½’æ��å�– HTML å�— (ä¿�æŒ�é¡ºåº�): p/pre ä¿�ç•™å†…éƒ¨HTML, table ä¿�ç•™, div é€’å½’Útable)ÚpÚpreú T©r1   uJ   ^(è´£ä»»ç¼–è¾‘|åˆ�å®¡|å¤�å®¡|ç»ˆå®¡|\[çº é”™\]|æµ�è§ˆæ¬¡æ•°|å­—å�·|åˆ†äº«)z\s+Údiv©r[   r\   rZ   r_   F©Ú	recursivez<p>z</p>)ÚnameÚstrÚfind_parentÚget_textr/   Úmatchr0   r1   Úfind_allÚextendÚextract_blockrP   )ÚelÚtxtÚblocksÚcs       r'   rj   rj   P   sø   € à	‡w�w�'ÒÜ�B“ˆyÐØ	‡w�w�,ÑØ�>‰>˜'Ô"ØˆIØ�k‰k˜# TˆkÓ*ˆÙ”b—h‘hÐlÐnqÔrØˆIÜ—‘�v˜s¤C¨£GÓ,×2Ñ2Ó4Ð5Ð5Ø	‡w�w�%ÒØˆØ—‘Ò9ÀU�ÓKò 	,ˆAØ�M‰Mœ-¨Ó*Õ+ð	,áØ—+‘+˜c¨�+Ó.ˆCÙØ—‘  C 5¨˜oÔ.ØˆØ€Ir)   c                 óî  — t        | «      }|syd}t        j                  d|«      }|r|j                  d«      j	                  «       }|s[t        j                  d|t        j
                  «      }|r4t        j                  dd|j                  d«      «      j	                  «       }d}t        j                  d|«      }|r|j                  d«      }d}t        |d«      }|j                  d	d
¬«      }g }|rm|j                  g d¢d¬«      D ]  }	|j                  t        |	«      «       Œ g }
|D ]!  }|sŒ|
r	|
d   |k7  sŒ|
j                  |«       Œ# dj                  |
«      }g }|j                  dd¬«      D ]Õ  }|j                  dd«      }t        j                  d|t        j                  «      sd|v sŒ?t        j                  dd|j!                  d¬«      «      j	                  «       xs |j#                  d«      d   }|j%                  d«      r
t&        |z   }n|j%                  d«      st&        dz   |z   }|j                  ||dœ«       Œ× |D ]  }d|d   › d|d   › d �}||vsŒ|d!|z   z  }Œ  |||fS )"N)r.   r.   r.   r.   z+<meta name="ArticleTitle" content="([^"]*)"r   z<title>([^<]*)</title>u   \s*_?åˆ©è¾›åŽ¿äººæ°‘æ”¿åºœ.*$z1<meta name="PubDate" content="(\d{4}-\d{2}-\d{2})zhtml.parserr_   Úzoom)Úidr`   Fra   éÿÿÿÿz

r&   T)rV   rV   z,\.(docx?|pdf|xlsx?|rar|zip|wps|et|dps)(\?|$)z/upload_bz/downloadu	   ã€�.*?ã€‘r^   ú/Úhttp)rc   rE   z<p><a href="rE   z" target="_blank">rc   z</a></p>ú
)rI   r/   ÚsearchrO   r1   ÚSr0   r   Úfindrh   ri   rj   rP   Újoinr>   ÚIrf   r#   r!   rM   )rE   rS   rL   rU   Ú	date_textÚcontentÚsouprp   Úpartsrk   Údedupr[   Úattsr&   Úhrc   Úlinks                    r'   Úparse_detailrƒ   g   sY  € Ü�‹:€DÙØØ€EÜ
�	‰	Ð@À$ÓG€AÙØ—‘˜“
× Ñ Ó"ˆÙÜ�I‰IÐ/°´r·t±tÓ<ˆÙÜ—F‘FÐ;¸RÀÇÁÈÃÓL×RÑRÓTˆEØ€IÜ
�	‰	ÐFÈÓM€AÙØ—G‘G˜A“Jˆ	Ø€GÜ˜˜}Ó-€DØ�9‰9�U˜vˆ9Ó&€DØ€EÙØ—-‘-Ò <È�-ÓNò 	,ˆBØ�L‰Lœ rÓ*Õ+ð	,àˆØò 	 ˆAÚ™% 5¨¡9°£>Ø—‘˜Q•ð	 ð —+‘+˜eÓ$ˆà€DØ�]‰]˜3 Tˆ]Ó*ò 2ˆØ�E‰E�&˜"ÓˆÜ�9‰9ÐDÀaÌÏÉÔNÐRgÐklÒRlÜ—6‘6˜,¨¨A¯J©J¸T¨JÓ,BÓC×IÑIÓKÒ_ÈqÏwÉwÐWZË|Ð\^ÑO_ˆDØ�|‰|˜CÔ Ü˜1‘H‘Ø—\‘\ &Ô)Ü˜3‘J ‘N�Ø�K‰K ¨aÑ0Õ1ð2ð ò #ˆØ˜a ™h˜ZÐ'9¸!¸F¹)¸ÀHÐMˆØ�wÒØ�t˜d‘{Ñ"‰Gð#ð �)˜WÐ$Ð$r)   c                  óv  — t        «       } t        «       }dt        j                  v }t	        d| › d|rt        |«      nt        t        «      › dt        › �d¬«       g }|r|nt        }|D ]¾  }t        d| dz   «      D ]ª  }t        ||«      }|s Œ%t	        d|› d	|› d
t        |«      › d�d¬«       |D ]s  }	 t        |d   «      \  }	}
}|
r
|
t        k  rŒ"|j                  |d   |	xs |d   |
||dœ«       t	        d|d   d   d d › d|
› �d¬«       t        j                  d«       Œu Œ¬ ŒÀ t	        dt        |«      › d�d¬«       |r.|d d D ]%  }t	        t!        j"                  |d¬«      d d «       Œ' y t%        t&        dd¬«      5 }|D ]+  }|j)                  t!        j"                  |d¬«      dz   «       Œ- 	 d d d «       t*        j,                  j/                  t0        «      �rt3        j4                  t0        d¬ «      }|j7                  d!«       |j9                  «       }d"}|D ]¢  }|j7                  d#|d   f«       |j;                  «       rŒ*|j7                  d$|d   t<        d%|d   |d&   |d'   d(d(t?        j@                  d)|d&   «      rtC        |d&   jE                  d*d(«      «      nd"tF        f
«       |jH                  sŒž|dz  }Œ¤ |jK                  «        |jM                  «        t	        d+|› �d¬«       y y # t        $ r'}t	        dt        |«      d d › �d¬«       Y d }~�Œd }~ww xY w# 1 sw Y   �ŒxxY w),Nz--dryrunz[lixin_jcsd] pages=z subs=z cutoff=T)Úflushr   z  [sub=z] pagez: u    æ�¡rE   rL   )rE   rL   Údater|   r0   u       âœ“ rr   é(   z | u       âœ— é<   g      à?u	   [å®Œæˆ�] r   F)Úensure_asciiéÈ   Úwr:   )r@   ru   éx   )r8   zPRAGMA busy_timeout=120000r   z'SELECT id FROM gov_raw WHERE page_url=?z¨INSERT OR IGNORE INTO gov_raw (title, site_name, group_name, page_url, publish_date, content, summary, attachments, date_rank, script_name) VALUES (?,?,?,?,?,?,?,?,?,?)u   å®‰å¾½r†   r|   r.   z\d{4}-\d{2}-\d{2}ú-u   [å…¥åº“] æ–°å¢ž )'r(   r,   r   r    ÚprintÚlenÚSUB_IDSÚCUTOFFr<   rX   rƒ   rP   rB   rd   rC   rD   ÚjsonÚdumpsÚopenÚOUTÚwriteÚosÚpathÚexistsÚDB_PATHÚsqlite3ÚconnectÚexecuteÚcursorÚfetchoneÚ	SITE_NAMEr/   rg   r"   r2   ÚSCRIPT_NAMEÚrowcountÚcommitÚclose)Ú	max_pagesÚ
sub_filterÚdryrunÚresultsÚsubsrQ   ÚpnrT   ÚitrL   r{   r|   ÚerH   ÚfÚconnrn   Úaddeds                     r'   Úmainr°   •   sB  € ÜÓ!€IÜÓ!€JØœ3Ÿ8™8Ð#€FÜ	Ð 	˜{¨&ÁJ´°Z´ÔTWÔX_ÓT`Ð0aÐaiÔjpÐiqÐ
rÐz~ÕØ€GÙ#‰:¬€DØò  ˆÜ˜˜9 q™=Ó)ò 	 ˆBÜ˜v rÓ*ˆEÙÙÜ�G˜F˜8 6¨"¨¨R´°E³
¨|¸4Ð@ÈÕMØò  �ð@Ü0<¸RÀ¹YÓ0GÑ-�E˜9 gÙ  Y´Ò%7Ø Ø—N‘NØ! %™y°5Ò3G¸B¸w¹KØ )°gØ%ñ$ô ô
 ˜H W¨R¡[°Ñ%9¸#¸2Ð%>Ð$?¸sÀ9À+ÐNÐVZÕ[ô —
‘
˜3•ñ ñ	 ð ô( 
ˆI”c˜'“l�^ 4Ð
(°Õ5ÙØ˜˜!�ò 	;ˆAÜ”$—*‘*˜Q¨UÔ3°D°SÐ9Õ:ð	;àÜ	Œc�3 Ô	)ð >¨QØò 	>ˆAØ�G‰G”D—J‘J˜q¨uÔ5¸Ñ<Õ=ñ	>÷>ô 
‡w�w‡~�~”gÕÜ�‰œw°Ô4ˆØ�‰Ð1Ô2Ø�K‰K‹MˆØˆØò 		ˆAØ�I‰IÐ?À!ÀEÁ(ÀÔMØ�z‰zŒ|ØØ�I‰Ið {Ø�7‘œY¨°!°E±(¸A¸f¹IÀqÈÁ|ÐUWÐY[Ü46·H±HÐ=QÐSTÐU[ÑS\Ô4]”�Q�v‘Y×&Ñ& s¨BÓ/Ô0ÐcdÔfqðsôtð �z‹zØ˜‘
‘ð		ð 	�‰ŒØ�
‰
ŒÜÐ   Ð(°Ö5ð# øô !ò @Ü˜H¤S¨£V¨C¨R [ MÐ2¸$×?Ó?ûð@ú÷>ñ >ús*   Â4K;Ã=K;Æ1L.Ë;	L+	ÌL&	Ì&L+	Ì.L8Ú__main__)r;   )"Ú__doc__r   r—   r/   r’   rC   r=   r›   r   r   Úbs4r   Úurllib3Údisable_warningsr    rM   r$   ÚnowÚstrftimer‘   r?   r•   rš   r¡   r�   r(   r,   r4   rI   rX   rj   rƒ   r°   Ú__name__© r)   r'   ú<module>rº      s»   ðñ
÷ 2× 1× 1Ó 1ß (Ý Û Ø €× Ñ Ô à*€	Ø!€ØÐ Ø
ˆ(�,‰,‹.™9¨%Ô0Ñ
0×	:Ñ	:¸:Ó	F€Øv€Ø€Ø
€Ø#€ò€òòòcóòòò.+%ò\46ðn ˆzÒÙ…Fð r)   