Ë
    ¸¬ujl(  ã                   ó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mZ ddlmZ ddl	Z	ddl
mZ d„ Z eej                  dd «      Z ede› �«        ej                   d	d
«      ZdZdZedz   ZdZdedœZdZdZdZd„ Zd„ 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  
æŠšå·žå¸‚äººæ°‘æ”¿åºœ - col321 é€šçŸ¥å…¬å‘Š
URL: http://www.jxfz.gov.cn/col/col321/index.html
CMS: Hanweb + jpage åŠ¨æ€�åˆ†é¡µ
åˆ—è¡¨: POST /module/web/jpage/dataproxy.jsp  startrecord/endrecord/perpage å�‚æ•°(é�žpage!)
      å�‚æ•°: startrecord=1 endrecord=15 perpage=15 appid=1 webid=1 path=/ columnid=321 unitid=64134 webname=æŠšå·žå¸‚äººæ°‘æ”¿åºœ permissiontype=0
      è¿”å›ž <datastore><totalrecord>98</totalrecord><recordset><record>CDATA(li)</record>
      15æ�¡/é¡µ, 98æ�¡æ€», 7é¡µ
è¯¦æƒ…: /art/YYYY/M/D/art_321_xxx.html  meta ArticleTitle/PubDate + div#zoom

ç”¨æ³•:
  python3 crawl_jxfz_tzgg.py --pages=1     # å¢žé‡�: å‰�1é¡µ(15æ�¡)
  python3 crawl_jxfz_tzgg.py --pages=5     # é¦–æ‰¹å‰�5é¡µ
  python3 crawl_jxfz_tzgg.py --pages=10    # å…¨é‡�(98æ�¡â‰ˆ7é¡µ)
é    N)Údatetime)Úurljoin)ÚBeautifulSoupc                 óL  — d| v ryt        | «      D ]‘  \  }}|dk(  r:|dz   t        | «      k  r)| |dz      j                  «       rt        | |dz      «      c S |j	                  d«      rt        |j                  d«      d   «      c S |j                  «       sŒ†t        |«      c S  y)u1   å…¼å®¹ --pages=N / --pages N / è£¸æ•°å­— / --fullz--fulli'  z--pagesé   z--pages=ú=)Ú	enumerateÚlenÚisdigitÚintÚ
startswithÚsplit)ÚargvÚiÚas      ú$/root/gov_crawler/crawl_jxfz_tzgg.pyÚparse_pagesr      s™   € à�4ÑØÜ˜$“ò ‰ˆˆ1Ø�	Š>˜a !™e¤c¨$£iÒ/°D¸¸1¹±I×4EÑ4EÔ4GÜ�t˜A˜a™C‘y“>Ò!Ø�<‰<˜
Ô#Ü�q—w‘w˜s“| A‘Ó'Ò'Ø�9‰9�;Ü�q“6ŠMðð ó    r   z[jxfz-tzgg] max_pages=Ú	SEARCH_DBz/mnt/data/search.dbzhttps://www.jxfz.gov.cnz-https://www.jxfz.gov.cn/col/col321/index.htmlz/module/web/jpage/dataproxy.jspé   zkMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36)ú
User-AgentÚRefereru"   æŠšå·žå¸‚äººæ°‘æ”¿åºœ-é€šçŸ¥å…¬å‘Šu   é€šçŸ¥å…¬å‘Šu   æ±Ÿè¥¿c                  óª   — t        j                  t        d¬«      } | j                  d«       | j                  d«       t         j                  | _        | S )Né   )ÚtimeoutzPRAGMA journal_mode=WALzPRAGMA busy_timeout=30000)Úsqlite3ÚconnectÚDB_PATHÚexecuteÚRowÚrow_factory)Úconns    r   Úget_connr#   9   s=   € Ü�?‰?œ7¨BÔ/€DØ‡L�LÐ*Ô+Ø‡L�LÐ,Ô-Ü—{‘{€DÔØ€Kr   c                 óÜ   — | s| S | j                  dd«      j                  dd«      j                  dd«      j                  dd«      } t        j                  dd| «      } | j                  «       S )uA   æ¸…ç�†æ ‡é¢˜: å®žä½“å‰�ç¼€ &middot;&nbsp; + é›¶å®½ç©ºæ ¼ + ç©ºç™½z&middot;Ú z&nbsp;z&ensp;z&emsp;z[\u200b\u200c\u200d\ufeff])ÚreplaceÚreÚsubÚstrip)Úts    r   Úclean_titler+   @   sb   € áØˆØ	�	‰	�*˜bÓ!×)Ñ)¨(°BÓ7×?Ñ?ÀÈ"ÓM×UÑUÐV^Ð`bÓc€AÜ
�‰Ð,¨b°!Ó4€AØ�7‰7‹9Ðr   c                 óH   — | j                  d|f«      j                  «       d uS )Nz'SELECT id FROM gov_raw WHERE page_url=?)r   Úfetchone)r"   Úpage_urls     r   Úis_dupr/   H   s%   € Ø�<‰<ÐAÀHÀ;ÓO×XÑXÓZÐbfÐfÐfr   c                 óÜ  — |rd|v rt        |j                  dd«      «      nd}d}|rt        |d«      j                  d¬«      d d }	 | j	                  dt
        |||||t        |d	t        d
|xs dv rdndf«      }|j                  dkD  r	 | j	                  d|t
        |f«       yy# t        $ r}t        d|› �«       Y d }~yd }~ww xY w# t        $ r}t        d|› �«       Y d }~yd }~ww xY w)Nú-r%   r   úhtml.parserT©r)   éÈ   z¼INSERT OR IGNORE INTO gov_raw (site_name, title, page_url, publish_date, content, date_rank, category, summary, script_name, group_name, has_table) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)zcrawl_jxfz_tzgg.pyz<tabler   zCINSERT INTO gov_search (title, site_name, summary) VALUES (?, ?, ?)z    [FTS WARN] Fz    [ERR] insert: )r   r&   r   Úget_textr   Ú	SITE_NAMEÚCATEGORYÚ
GROUP_NAMEÚrowcountÚ	ExceptionÚprint)	r"   Útitler.   Úpublish_dateÚcontentÚ	date_rankÚplainÚcurÚes	            r   Úinsert_itemrC   K   s  € Ù6BÀsÈlÑGZ”�L×(Ñ(¨¨bÓ1Ô2Ð`a€IØ€EÙÜ˜g }Ó5×>Ñ>ÀTÐ>ÓJÈ4ÈCÐPˆðØ�l‰lð7ô ˜˜x¨°wÀ	Ì8ÐUZØ!¤:°HÀÂÈBÑ4O©qÐUVðXó	
ˆð �<‰<˜!Òð-Ø—‘ØYØœI uÐ-ôð Øøô ò -Ü˜¨ sÐ+×,Ð,Øûð-ûô ò ÜÐ" 1 #Ð&Ô'Üûðús=   ÁAC
 ÂB& Â&	CÂ/CÂ=C
 ÃCÃC
 Ã
	C+ÃC&Ã&C+c                 óº   — t        |«      t        |«      t        t        «      ddddddddœ
}| j                  t        |t        d¬	«      }d
|_        |j                  S )NÚ1ú/Ú321Ú64134u   æŠšå·žå¸‚äººæ°‘æ”¿åºœÚ0)
ÚstartrecordÚ	endrecordÚperpageÚappidÚwebidÚpathÚcolumnidÚunitidÚwebnameÚpermissiontyper   )ÚdataÚheadersr   úutf-8)ÚstrÚPER_PAGEÚpostÚ	PROXY_URLÚHEADERSÚencodingÚtext)ÚsessionÚstartÚendrT   Úresps        r   Ú
fetch_listrb   g   s\   € ä˜5“zÜ˜“XÜ”x“=ØØØØØØ*Øñ€Dð �<‰<œ	¨´gÀrˆ<ÓJ€DØ€D„MØ�9‰9Ðr   c                 óü  — g }t        j                  d| t         j                  «      }t        «       }|D ]Å  }t        j                  d|«      }t        j                  d|«      }|sŒ2t        t        |j                  d«      «      }||v rŒV|j                  |«       t        |j                  d«      j                  «       «      }|r|j                  d«      j                  «       nd}	|j                  |||	f«       ŒÇ |S )Nz<li[^>]*>(.*?)</li>z$href='(/art/[^']+)'[^>]*>([^<]+)</a>zbt-data-time\">\[([^\]]+)\]r   é   r%   )r'   ÚfindallÚDOTALLÚsetÚsearchr   ÚBASEÚgroupÚaddr+   r)   Úappend)
Ú	html_textÚitemsÚlisÚseenÚliÚmÚdÚurlr<   Údate_strs
             r   Ú
parse_listrv   x   sÑ   € Ø€Eä
�*‰*Ð+¨Y¼¿	¹	Ó
B€CÜ‹5€DØò 
1ˆÜ�I‰IÐ=¸rÓBˆÜ�I‰IÐ4°bÓ9ˆÚÜœ$ §¡¨£
Ó+ˆCØ�d‰{ØØ�H‰H�SŒMÜ §¡¨£
× 0Ñ 0Ó 2Ó3ˆEÙ-.�q—w‘w˜q“z×'Ñ'Ô)°BˆHØ�L‰L˜%  hÐ/Õ0ð
1ð €Lr   c                 óH  — t        | dt        «      }t        |«      }t        j                  d|«      }t        j                  d|«      }|rt        |j                  d«      «      n
t        |«      }|rt        |j                  d«      «      n|t        z   dz
  t        z  }|||fS )Nr   z <totalrecord>(\d+)</totalrecord>z<totalpage>(\d+)</totalpage>)rb   rX   rv   r'   rh   r   rj   r
   )r^   rm   rn   ÚtrÚtpÚtotalÚtotal_pagess          r   Ú	get_totalr|   Š   sˆ   € Ü˜7 A¤xÓ0€IÜ�yÓ!€EÜ	�‰Ð6¸	Ó	B€BÜ	�‰Ð2°IÓ	>€BÙ "ŒC�—‘˜“Ô¬¨E«
€EÙ&(”#�b—h‘h˜q“kÔ"¨u´xÑ/?À!Ñ/CÌÑ.P€KØ�+˜uÐ$Ð$r   c                 óþ  — t        | d«      }d}|j                  dddi¬«      }|r|j                  d«      rt        |d   «      }d}|j                  dddi¬«      }|rK|j                  d«      r:t	        j
                  d	|d   j                  «       «      }|r|j                  d
«      }d}|j                  dd¬«      }	|	rt        |	«      }|s)dD ]$  }
|j                  d|
¬«      }|sŒt        |«      } n |s|}|||fS )Nr2   r%   ÚmetaÚnameÚArticleTitle©Úattrsr>   ÚPubDatez(\d{4}-\d{1,2}-\d{1,2})r   ÚdivÚzoom)Úid)r>   Úarticler]   ÚmainTextÚzoomcon)	r   ÚfindÚgetr+   r'   Úmatchr)   rj   Úextract_content)rm   Úfallback_titleÚsoupr<   r~   Úpub_dateÚmeta_dÚm2r>   r…   Úcidr„   s               r   Úparse_detailr”   ”   s  € Ü˜ MÓ2€Dà€EØ�9‰9�V F¨NÐ#;ˆ9Ó<€DÙ�—‘˜Ô#Ü˜D ™OÓ,ˆà€HØ�Y‰Y�v f¨iÐ%8ˆYÓ9€FÙ�&—*‘*˜YÔ'Ü�X‰XÐ0°&¸Ñ2C×2IÑ2IÓ2KÓLˆÙØ—x‘x “{ˆHà€GØ�9‰9�U˜vˆ9Ó&€DÙÜ! $Ó'ˆÙØHò 	ˆCØ—)‘)˜E c�)Ó*ˆCÚÜ)¨#Ó.�Ùð		ñ ØˆØ�'˜8Ð#Ð#r   c                 óò  — t        t        | «      d«      }|j                  g d¢«      D ]  }|j                  «        Œ |j                  dt	        j
                  dt        j                  «      i¬«      D ]  }|j                  «        Œ |j                  d«      D ]L  }|j                  d«      }|rt        t        |«      |d<   |j                  d«      }|sŒ=|j                  «        ŒN g }|j                  g d	¢«      D ]’  }|j                  }|d
k(  r|j                  d«      rŒ&|j                  d¬«      }|sŒ;|dk(  r|j                  t        |«      «       Œ[|dv sŒ`|dk(  r|j                  d
dg«      rŒy|j                  t        |«      «       Œ” dj                  |«      }	|	j!                  d«      }
g }|
D ]  }|r	||d   k7  sŒ|j                  |«       Œ  dj                  |«      j#                  «       S )uU   æ��å�–æ­£æ–‡: ä¿�ç•™è¡¨æ ¼HTMLã€�é™„ä»¶é“¾æŽ¥ç»�å¯¹åŒ–ã€�\n\nåˆ†æ®µã€�åŽ»é‡�å¤�å†…å®¹r2   )ÚscriptÚstyleÚnoscriptr—   zdisplay\s*:\s*noner�   r   ÚhrefÚimg)ÚpÚtabler„   rq   Úh1Úh2Úh3Úh4r›   rœ   Tr3   )r›   r„   rq   r�   rž   rŸ   r    r„   z

éÿÿÿÿ)r   rW   Úfind_allÚ	decomposer'   ÚcompileÚIr‹   r   ri   rŠ   r   Úfind_parentr5   rl   Újoinr   r)   )Únoder�   Útagr   r™   rš   ÚpartsÚelr]   r>   ÚsegsÚdedupedÚss                r   r�   r�   ²   sÂ  € äœ˜T› MÓ2€Dà�}‰}Ò<Ó=ò ˆØ�‰�ðà�}‰} G¬R¯Z©ZÐ8MÌrÏtÉtÓ-TÐ#Uˆ}ÓVò ˆØ�‰�ðð �]‰]˜3Óò ˆØ�u‰u�V‹}ˆÙÜ¤ dÓ+ˆAˆf‰IØ�f‰f�U‹mˆÚØ�M‰M�Oðð €EØ�m‰mÒOÓPò "ˆØ�g‰gˆØ�#Š:˜"Ÿ.™.¨Ô1ØØ�{‰{ ˆ{Ó&ˆÙØØ�'Š>Ø�L‰Lœ˜R›Õ!ØÐ>Ò>Ø�eŠ| §¡¨¨g¨Ô 7ØØ�L‰Lœ˜R›Õ!ð"ð �k‰k˜%Ó €Gà�=‰=˜Ó €DØ€GØò ˆÙ˜!˜w r™{Ó*Ø�N‰N˜1Õðð �;‰;�wÓ×%Ñ%Ó'Ð'r   c                  ó  — t        «       } t        j                  «       }t        |«      \  }}}t	        t
        |«      }t        d|› d|› d|› �«       t        |«      }t        d|dz   «      D ]t  }	 |dz
  t        z  dz   }|t        z  }	t        |||	«      }
t        |
«      }|j                  |«       t        d|› dt        |«      › d�«       t        j                   d«       Œv t        dt        |«      › d�«       dx}x}}t#        |d«      D ]Ó  \  }\  }}}	 d|vr|dz  }Œt%        | |«      r|dz  }Œ'|j'                  |dt(        d   id¬«      }d|_        t-        |j.                  |«      \  }}}|s|}t1        | ||||«      r|dz  }n|dz  }| j3                  «        t        j                   d«       |dz  dk(  sŒ±t        d|› dt        |«      › d|› d|› d|› �
«       ŒÕ | j5                  «        t        d|› d|› d |› d!�«       t        d"|› �«       y # t        $ r1}t        d	|› d
|› �«       t        j                   d«       Y d }~�Œ€d }~ww xY w# t        $ r#}|dz  }t        d|d d › d
|› �«       Y d }~Œëd }~ww xY w)#Nz[jxfz-tzgg] total=z
 records, z pages, scanning rd   r   z  page z: +z itemsz  [WARN] page z: é   gš™™™™™Ù?z[jxfz-tzgg] collected z list itemsr   zjxfz.gov.cnr   r   )rU   r   rV   z  [ERR] é(   g333333Ó?é   z  [rF   z] new=z dup=z err=z[jxfz-tzgg] DONE: +z new, z dup, z erru   æ–°å¢ž: )r#   ÚrequestsÚSessionr|   ÚminÚ	MAX_PAGESr;   ÚlistÚrangerX   rb   rv   Úextendr
   r:   ÚtimeÚsleepr	   r/   r‹   r[   r\   r”   r]   rC   ÚcommitÚclose)r"   r^   rz   r{   Úpage1_itemsÚpagesÚ	all_itemsÚpgr_   r`   rm   rn   rB   Ú	new_countÚ	dup_countÚ	err_countÚidxr<   rt   ru   ra   Úd_titler>   r�   s                           r   ÚmainrÇ   Û   sº  € Ü‹:€DÜ×ÑÓ €Gä&/°Ó&8Ñ#€Eˆ;˜Ü”	˜;Ó'€EÜ	Ð˜u˜g Z°¨}Ð<MÈeÈWÐ
UÔVä�[Ó!€IÜ�A�u˜q‘yÓ!ò ˆð		Ø˜!‘VœxÑ'¨!Ñ+ˆEØ”x‘-ˆCÜ" 7¨E°3Ó7ˆIÜ˜yÓ)ˆEØ×Ñ˜UÔ#Ü�G˜B˜4˜s¤3 u£: ,¨fÐ5Ô6ô 	�
‰
�3�ðô 
Ð"¤3 y£>Ð"2°+Ð
>Ô?à()Ð)€IÐ)�	˜IÜ'0°¸AÓ'>ò aÑ#ˆÑ#ˆe�S˜(ð	0Ø CÑ'Ø˜Q‘�	ØÜ�d˜CÔ Ø˜Q‘�	ØØ—;‘;˜s¨\¼7À<Ñ;PÐ,QÐ[]�;Ó^ˆDØ#ˆDŒMÜ)5°d·i±iÀÓ)GÑ&ˆG�W˜hÙØ#�Ü˜4 ¨#¨x¸ÔAØ˜Q‘‘	à˜Q‘�	ð 	�‰ŒÜ�
‰
�3ŒØ�‰8�q‹=Ü�C˜�u˜Aœc )›nÐ-¨V°I°;¸eÀIÀ;ÈeÐT]ÐS^Ð_Õ`ð/að2 	‡J�J„LÜ	Ð 	˜{¨&°°¸6À)ÀÈDÐ
QÔRÜ	ˆH�Y�KÐ
 Õ!øôG ò 	Ü�N 2 $ b¨¨Ð,Ô-Ü�J‰J�q�MŠMûð	ûô2 ò 	0Ø˜‰NˆIÜ�H˜U 3 B˜Z˜L¨¨1¨#Ð.×/Ñ/ûð	0ús>   Á0AHÄ	IÄ"IÄ4AIÈ	IÈ &IÉIÉ	J ÉI;É;J Ú__main__)%Ú__doc__Úosr'   Úsysr   rº   r   Úurllib.parser   r³   Úbs4r   r   r   r¶   r;   Úgetenvr   ri   ÚLIST_URLrZ   rX   r[   r6   r7   r8   r#   r+   r/   rC   rb   rv   r|   r”   r�   rÇ   Ú__name__© r   r   ú<module>rÒ      sã   ðñ÷ "× !Ó !Ý Ý  Û Ý òñ ˜Ÿ™  ˜Ó%€	Ù Ð˜y˜kÐ*Ô +à
ˆ"�)‰)�KÐ!6Ó
7€Ø €Ø:€ØÐ4Ñ4€	Ø€ð @Øñ€ð
 1€	Ø€Ø€
òòògòò8ò"ò$%ò$ò<&(òR4"ðl ˆzÒÙ…Fð r   