Ë
    ¸¬uj¬)  ã                   ó   — 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	 ddl
mZ dZdZdZdZd	Zd
ZdZdZdZdZdZ ej.                  «       Zde_        ej4                  e_        ddddœZddefd„Zd„ Zd„ Zd„ Z d„ Z!d„ Z"e#dk(  r e"«        yy)uG  å–€å·¦åŽ¿äººæ°‘æ”¿åºœ - çŽ¯è¯„ä¿¡æ�¯ (æ°‘æ„�å¾�é›†/çŽ¯è¯„ä¿¡æ�¯æ �ç›®) çˆ¬è™«
CMS: æœ�é˜³å¸‚æ”¿åºœç½‘ç«™ç¾¤ (cms.chaoyang.gov.cn)
åˆ—è¡¨: /kzxzf/hdjl/myzj/glist.html  (15æ�¡/é¡µ, å…±45é¡µ, å½“å‰�ç¬¬ 1/45 é¡µ)
     ç¬¬1é¡µé�™æ€�HTML, ç¬¬2+é¡µèµ° API:
     GET https://cms.chaoyang.gov.cn/html/page.xhtml?s=KZXZF&o={é¡µ-1}&p=162737070000524&c=162737070000524
     âš ï¸� å¿…é¡» https + Referer=https://www.kazuo.gov.cn/ (http æˆ– æ—  Referer è¿”å›žæœ�é˜³ä¸»ç«™å†…å®¹)
è¯¦æƒ…: /html/KZXZF/{YYYYMM}/{objectId}.html
     meta ArticleTitle/PubDate + div.center-info æ­£æ–‡ (p>span æ®µè�½)
é    N©Úurljoin)ÚBeautifulSoupu"   å–€å·¦åŽ¿äººæ°‘æ”¿åºœ-çŽ¯è¯„ä¿¡æ�¯zcrawl_kazuo_hjxx.pyu   è¾½å®�z3https://www.kazuo.gov.cn/kzxzf/hdjl/myzj/glist.htmlz+https://cms.chaoyang.gov.cn/html/page.xhtmlÚKZXZFÚ162737070000524úhttps://www.kazuo.gov.cn/z/mnt/data/search.dbé   FzkMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.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        |«      D ]‚  }	 t        t        «      }|r||d<   t        j                  j                  | |¬«      }t        j                  j                  ||t        ¬«      }|j                  «       j                  dd¬«      c S  y# t        $ rN}||dz
  k(  r't        d| › d	|› �t        j                  ¬
«       Y d }~ yt        j                  d«       Y d }~ŒØd }~ww xY w)NÚReferer)Úheaders)ÚtimeoutÚcontextzutf-8Úreplace)Úerrorsé   u     [WARN] è¯·æ±‚å¤±è´¥ z: ©ÚfileÚ g333333ó?)ÚrangeÚdictÚHEADERSÚurllibÚrequestÚRequestÚurlopenÚctxÚreadÚdecodeÚ	ExceptionÚprintÚsysÚstderrÚtimeÚsleep)	Úurlr   ÚretriesÚrefererÚiÚhdrsÚreqÚrespÚes	            ú%/root/gov_crawler/crawl_kazuo_hjxx.pyÚhttp_getr1   '   sÎ   € Ü�7‹^ò ˆð	Üœ“=ˆDÙØ")��Y‘Ü—.‘.×(Ñ(¨°dÐ(Ó;ˆCÜ—>‘>×)Ñ)¨#°wÌÐ)ÓLˆDØ—9‘9“;×%Ñ% g°iÐ%Ó@Ò@ðð øô ò 	Ø�G˜a‘KÒÜÐ.¨s¨e°2°a°SÐ9ÄÇ
Á
ÕKÝÜ�J‰J�s�O‰Oûð		ús   �A=BÂ	C)Â)C$Ã
C$Ã$C)c                 ó  — | j                  dd«      j                  dd«      } | j                  dd«      j                  dd«      } t        j                  dd| «      } t        j                  dd| «      } | j                  «       S )u:   strip &middot;&nbsp; å®žä½“å‰�ç¼€ å’Œçœ�ç•¥å�·æˆªæ–­å�Žç¼€z&middot;r   z&nbsp;u   â€‹u   ï»¿u   ^[\s\xa0Â·\u00b7]+z\s*\.{3,}\s*$)r   ÚreÚsubÚstrip)Útitles    r0   Úclean_titler7   8   sn   € à�M‰M˜* bÓ)×1Ñ1°(¸BÓ?€EØ�M‰M˜( BÓ'×/Ñ/°¸"Ó=€EÜ�F‰FÐ(¨"¨eÓ4€EÜ�F‰FÐ# R¨Ó/€EØ�;‰;‹=Ðó    c                 óD  — g }t        j                  d| «      D ]„  }|j                  d«      |j                  d«      |j                  d«      }}}t        d|«      }t	        |j                  «       «      }|sŒ^d|v sŒc|j                  |||j                  «       f«       Œ† |S )u/   ä»Žåˆ—è¡¨é¡µ/APIå“�åº”æ��å�– (url, title, date)zA<li><a\s+[^>]*href="([^"]+)"[^>]*>([^<]*)</a><span>([^<]*)</span>r   é   r   r   z
html/KZXZF)r3   ÚfinditerÚgroupr   r7   r5   Úappend)ÚhtmlÚitemsÚmÚhrefÚtÚdr(   r6   s           r0   Ú
parse_listrD   A   s�   € à€EÜ�[‰[Ð]Ð_cÓdò 2ˆØ—W‘W˜Q“Z §¡¨£¨Q¯W©W°Q«Z�ˆaˆÜÐ1°4Ó8ˆÜ˜AŸG™G›IÓ&ˆÚ�\ SÒ(Ø�L‰L˜#˜u a§g¡g£iÐ0Õ1ð2ð €Lr8   c           	      ó¶   — | dk(  rt        t        d¬«      }t        |«      S t        › dt        › d| dz
  › dt
        › dt        › �	}t        |«      }t        |«      S )u!   ç¬¬pageé¡µ (1-based) åˆ—è¡¨æ�¡ç›®r   N©r*   z?s=z&o=z&p=z&c=)r1   ÚLIST_URLrD   ÚAPI_URLÚ	SITE_CODEÚPAGE_IDÚ	COLUMN_ID)Úpager>   Úapis      r0   Ú
fetch_pagerN   M   sZ   € àˆq‚yÜœ¨$Ô/ˆÜ˜$ÓÐÜˆI�Sœ˜ 3 t¨a¡x j°´G°9¸CÄ	¸{Ð
K€CÜ�C‹=€DÜ�dÓÐr8   c           
      ó^  ‡‡— d}t        j                  d| «      }|rt        |j                  d«      «      }d}t        j                  d| «      }|r|j                  d«      }t	        | d«      }|j                  dd¬«      }|s||dg fS g }|j                  d	d
¬«      D ]Æ  }	|	d   }
|	j                  d
¬«      }t        j                  d|
«      s6d|
j                  «       v s$d|
j                  «       v s|j                  d«      sŒft        ‰|
«      }|j                  d«      s|j                  d«      rd|z   n|}|r|n|j                  d«      d   }|j                  |	||f«       ŒÈ |D ]±  \  }	}}|j                  d	|d¬«      }||_        |	j                  �s|	j                  }d}t!        |j"                  «      D ]  \  }}||	u sŒ|} n |�>t%        |j"                  d| «      D ]#  }t'        |dd«      dk(  sŒ|j)                  «        Œ% |	j+                  |«       Œ³ |D ��ch c]  \  }}}|’Œ
 c}}Šg }|j                  d¬«      D ]ð  }|j,                  dk(  r|j                  t/        |«      «       Œ-|j,                  dv r�|j                  dd
¬«      }|s|j                  d«      sŒb|j                  d«      }t1        ˆˆfd „|j                  d	d
¬«      D «       «      }|s|r|j                  t/        |«      «       Œ¸|j                  |«       ŒÊ|j                  dd
¬«      }|sŒà|j                  |«       Œò t3        «       }g }|D ]X  }t        j4                  d!dt        j4                  d"d|«      «      }|sŒ2||vsŒ7|j7                  |«       |j                  |«       ŒZ d#j9                  |«      }|j;                  d$d%«      }|D ]  \  }}}||vsŒ||vsŒ|d&|› d'|› d(�z  }Œ t        j4                  d)d|«      }t        j4                  d*d#|«      j=                  «       }||||fS c c}}w )+u/   æ��å�– (title, date, content_html, attachments)r   z/<meta\s+name="ArticleTitle"\s+content="([^"]+)"r   z5<meta\s+name="PubDate"\s+content="(\d{4}-\d{2}-\d{2})zhtml.parserÚdivzcenter-info)Úclass_ÚaT)rA   rA   )r5   z6(?i)\.(pdf|doc|docx|xls|xlsx|zip|rar|wps|et|ofd)(\?|$)ÚdownloadÚattachu   é™„ä»¶)zhttp://zhttps://z//zhttp:ú/éÿÿÿÿÚ_blank)rA   ÚtargetNÚnameÚimgF)Ú	recursiveÚtable)	ÚprP   Úh1Úh2Úh3ÚulÚolÚliÚ
blockquotec              3   óR   •K  — | ]  }t        ‰|d    «      ‰v xs |d    ‰v –— Œ  y­w)rA   Nr   )Ú.0ÚxÚattached_hrefsÚpage_urls     €€r0   ú	<genexpr>z!extract_detail.<locals>.<genexpr>�   s:   øè ø€ ò  6àô ˜ ! F¡)Ó,°Ð>Ò]À!ÀFÁ)È~ÐB]Ó]ñ 6ùs   ƒ$'ú\s+ú<[^>]+>z

z&amp;ú&z

<p><a href="z" target="_blank">z</a></p>u   æ‰“å�°æœ¬é¡µ[^\n]*z\n{3,})r3   Úsearchr7   r<   r   ÚfindÚfind_allÚget_textÚlowerÚ
startswithr   Úsplitr=   Únew_tagÚstringÚparentÚ	enumerateÚcontentsÚlistÚgetattrÚ	decomposeÚreplace_withrY   ÚstrÚanyÚsetr4   ÚaddÚjoinr   r5   )r>   ri   r6   ÚmtÚdateÚmpÚsoupÚcmÚattachmentsrR   rA   ÚtxtÚabs_urlrY   Únew_ar]   Úidx_aÚciÚchildÚ_ÚpartsÚelÚinner_tablesÚel_has_attachÚseenÚfinal_partsÚkeyÚcontentÚcontent_unescapedrh   s    `                           @r0   Úextract_detailr™   W   s%  ù€ à€EÜ	�‰ÐEÀtÓ	L€BÙ	Ü˜BŸH™H Q›KÓ(ˆØ€DÜ	�‰ÐKÈTÓ	R€BÙ	Ø�x‰x˜‹{ˆä˜˜}Ó-€DØ	�‰�5 ˆÓ	/€BÙØ�d˜B Ð"Ð"ð €KØ�[‰[˜ 4ˆ[Ó(ò 	3ˆØ�‰yˆØ�j‰j˜tˆjÓ$ˆÜ�I‰IÐOÐQUÔVØ §¡£Ñ-°¸T¿Z¹Z»\Ñ1IÈSÏ^É^Ð\dÕMeÜ˜h¨Ó-ˆGØ×%Ñ%Ð&=Ô>Ø/6×/AÑ/AÀ$Ô/G˜' GÒ+ÈW�Ù‘3 7§=¡=°Ó#5°bÑ#9ˆDØ×Ñ  4¨Ð1Õ2ð	3ð (ò Ñˆˆ4�Ø—‘˜S w°x�Ó@ˆØˆŒØ�8‰8ÐØ—‘ˆAØˆEÜ& q§z¡zÓ2ò ‘	��EØ˜A’:Ø�EÙðð Ð Ü! !§*¡*¨V¨eÐ"4Ó5ò *�EÜ˜u f¨dÓ3°uÓ<ØŸ™Õ)ð*ð 	
�‰�uÕðð 4?×?¡- ! Q¨’gÓ?€Nð €EØ�k‰k EˆkÓ*ò "ˆØ�7‰7�gÒØ�L‰Lœ˜R›Ô!ØØ�7‰7ÐTÑTØ—+‘+˜b¨�+Ó-ˆCÙ˜rŸw™w uœ~ØØŸ;™; wÓ/ˆLÜô  6àŸ™ S¨t˜Ó4ô 6ó 6ˆMñ ™}Ø—‘œS ›WÔ%ØØ�L‰L˜Õà—+‘+˜b¨�+Ó-ˆCÚØ—‘˜SÕ!ð'"ô, ‹5€DØ€KØò "ˆÜ�f‰f�V˜R¤§¡¨
°B¸Ó!:Ó;ˆÚ�3˜d’?Ø�H‰H�SŒMØ×Ñ˜qÕ!ð	"ð �k‰k˜+Ó&€GØŸ™¨°Ó5ÐØ'ò TÑˆˆ4�Ø˜'Ò! gÐ5FÒ&FØÐ)¨'¨Ð2DÀTÀFÈ(ÐSÑS‰GðTô �f‰fÐ*¨B°Ó8€GÜ�f‰f�Y ¨Ó0×6Ñ6Ó8€GØ�$˜ Ð,Ð,ùóU @s   È"P)c                  ó–  — d} t         j                  dd  }d}|t        |«      k  ru||   }|j                  d«      rt	        |j                  dd«      d   «      } n,|dk(  r'|dz   t        |«      k  rt	        ||dz      «      } |dz  }|dz  }|t        |«      k  rŒut        j                  t        d¬«      }|j                  d«       |j                  d	«       |j                  «       }d}d}d}d}	t        d| dz   «      D �]Ú  }
t        |
«      }|s5|	dz  }	t        d
|
› d|	› d�t         j                  ¬«       |	dk\  r|
dkD  r �n™ŒFd}	t        d|
› dt        |«      › d�«       |D �]r  \  }}}	 |j                  d|f«       |j                  «       r|dz  }Œ2	 t'        |t(        ¬«      }|s|dz  }ŒLt+        ||«      \  }}}}|r1t        t-        j.                  dd|«      j1                  «       «      dk  r|dz  }Œ–|s|}|s|}t-        j.                  dd|«      d d }t-        j.                  dd|«      j1                  «       }d|v rdnd}	 |j                  d||||||t2        t4        t6        |df«      }|j8                  }|j                  d||t2        |f«       |j;                  «        |dz  }t        d|› d|d d  › �«       t#        j$                  d$«       �Œu �ŒÝ |jE                  «        t        d%|› d&|› d'|› d(||z   |z   › �«       y # t        j                   $ r t#        j$                  d«       Y �ŒÒw xY w# t        j                   $ rá}d!t=        |«      v rÄ|j?                  «        t#        j$                  d"«       	 |j                  d||||||t2        t4        t6        |df«      }|j8                  }|j                  d||t2        |f«       |j;                  «        |dz  }t        d|› d|d d  › d#�«       n)# t@        $ r |j?                  «        |dz  }Y n	w xY w|dz  }Y d }~�Œgd }~wt        jB                  $ r	 |dz  }Y �Œ…w xY w))Nr   r   z--pages=ú=z--pagesé<   )r   zPRAGMA busy_timeout=60000zPRAGMA journal_mode=WALu     [WARN] ç¬¬u   é¡µæ— æ•°æ�® (fail_streak=ú)r   r:   u     ç¬¬u   é¡µ: æ‰¾åˆ° u    æ�¡z'SELECT id FROM gov_raw WHERE page_url=?r   rF   rl   r   é
   éÈ   rk   ú z<tablezªINSERT INTO gov_raw (title, summary, content, page_url, source_url, publish_date, site_name, script_name, group_name, has_table, date_rank) VALUES (?,?,?,?,?,?,?,?,?,?,?)zTINSERT OR IGNORE INTO gov_search (rowid, title, site_name, summary) VALUES (?,?,?,?)z    [z] é-   Úlockedé   u    (é‡�è¯•æˆ�åŠŸ)gš™™™™™Ù?u	   
æ–°å¢ž: u
     é‡�å¤�: u     è¿‡çŸ­/404: u
     æ€»è®¡: )#r$   ÚargvÚlenrs   Úintrt   Úsqlite3ÚconnectÚDB_PATHÚexecuteÚcursorr   rN   r#   r%   ÚfetchoneÚOperationalErrorr&   r'   r1   ÚREFERERr™   r3   r4   r5   Ú	SITE_NAMEÚSCRIPT_NAMEÚ
GROUP_NAMEÚ	lastrowidÚcommitr~   Úrollbackr"   ÚIntegrityErrorÚclose)Ú	max_pagesÚargsr+   rR   ÚconnÚcÚ	total_newÚ	total_dupÚ
total_skipÚfail_streakrL   r?   r(   r6   r„   ÚdhtmlÚd_titleÚd_dater—   rˆ   ÚsummaryÚ	has_tableÚcurÚridr/   s                            r0   ÚmainrÆ   ¯   sl  € Ø€IÜ�8‰8�A�Bˆ<€DØ	€AØ
Œc�$‹iŠ-Ø�‰GˆØ�<‰<˜
Ô#Ü˜AŸG™G C¨›O¨AÑ.Ó/‰IØ�)Š^  A¡¬¨D«	Ò 1Ü˜D  Q¡™KÓ(ˆIØ�‰FˆAØ	ˆQ‰ˆð Œc�$‹i‹-ô �?‰?œ7¨BÔ/€DØ‡L�LÐ,Ô-Ø‡L�LÐ*Ô+Ø�‰‹€AØ€IØ€IØ€Jà€KÜ�a˜ Q™Ó'ó AˆÜ˜4Ó ˆÙØ˜1ÑˆKÜ�L  Ð&@ÀÀÈQÐOÔVY×V`ÑV`ÕaØ˜aÒ D¨1¢HÚØØˆÜ��d�V˜<¬¨E«
 |°4Ð8Ô9Ø %ó 7	ÑˆC�˜ðØ—	‘	ÐCÀcÀVÔLØ—:‘:”<Ø ‘N�IØð  ô ˜S¬'Ô2ˆEÙØ˜a‘�
ØÜ4BÀ5È#Ó4NÑ1ˆG�V˜W kÙœc¤"§&¡&¨°R¸Ó"A×"GÑ"GÓ"IÓJÈRÒOØ˜a‘�
ØÙØ�ÙØ�Ü—f‘f˜Z¨¨WÓ5°d°sÐ;ˆGÜ—f‘f˜V S¨'Ó2×8Ñ8Ó:ˆGØ%¨Ñ0™°aˆIðØ—i‘ið AØ˜g w°°S¸&Ä)Ì[ÔZdÐfoÐqrÐsóu�ð —m‘m�Ø—	‘	ÐpØ ¬°GÐ<ô>à—‘”Ø˜Q‘�	Ü˜˜f˜X R¨°°¨ ~Ð6Ô7ô, �J‰J�sŽOòo7	ðAðF 	‡J�J„LÜ	ˆJ�y�k ¨I¨;°nÀZÀLÐPZÐ[dÐenÑ[nÐoyÑ[yÐZzÐ
{Õ|øôi ×+Ñ+ò Ü—
‘
˜1”Úðûô8 ×+Ñ+ò $Øœs 1›vÑ%Ø—M‘M”OÜ—J‘J˜q”Mð(ØŸi™ið IØ$ g¨w¸¸SÀ&Ì)ÔU`ÔblÐnwÐyzÐ{ó}˜ð "Ÿm™m˜ØŸ	™	Ð"xØ#&¨´¸GÐ"DôFàŸ™œØ! Q™˜	Ü  f X¨R°¸¸°¨~¸_ÐMÕNøÜ$ò (ØŸ™œØ" a™š
ð(úð  !‘O�JÿùÜ×)Ñ)ò Ø˜Q‘“	ðúsV   Å-(LÉ
A8L:Ì(L7Ì6L7Ì:QÍ2P)Î A9O:Ï9P)Ï:P	ÐP)ÐP	ÐP)Ð)QÑQÚ__main__)$Ú__doc__r$   r3   r&   r§   ÚsslÚurllib.requestr   Úurllib.parser   Úbs4r   r¯   r°   r±   rG   rH   rI   rJ   rK   r®   r©   ÚPER_PAGEÚcreate_default_contextr   Úcheck_hostnameÚ	CERT_NONEÚverify_moder   r1   r7   rD   rN   r™   rÆ   Ú__name__© r8   r0   ú<module>rÔ      sÈ   ðñ÷ 3× 2× 2Ý  Ý à0€	Ø#€Ø€
Ø@€Ø
7€Ø€	Ø
€Ø€	Ø
%€Ø
€Ø€à €c× Ñ Ó"€Ø€Ô Ø—-‘-€„ð @ØOØ0ñ€ð  a°ó ò"ò	òòU-òpZ}ðz ˆzÒÙ…Fð r8   