Ë
    G«£jV  ã                   óf  — 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
mZ ddlZddl
ZdZdZdZ ej                   d	d
«      ZdZddddœZej(                  e_        dd„Zd„ Zdd„Zd„ Zd„ Zdd„Zedk(  r5 eej<                  «      dkD  r eej<                  d   «      ndZ  ee «       yy)u	  å»ºå¹³åŽ¿äººæ°‘æ”¿åºœ-çŽ¯ä¿�ä¿¡æ�¯å…¬å¼€ çˆ¬è™«
CMS: æœ�é˜³CMS (cms.chaoyang.gov.cn)
åˆ—è¡¨: /jpxzf/zwgk/hbxxgk/hbxxgk/glist.html (page1), glist{N}.html (page2+ via redirect)
åˆ†é¡µ: 29é¡µ x 15æ�¡
è¯¦æƒ…: /html/JPXZF/YYYYMM/0{objectId}.html, å®¹å™¨ div.center-info
é    N©ÚBeautifulSoup)Úrequest)Úurljoinu(   å»ºå¹³åŽ¿äººæ°‘æ”¿åºœ-çŽ¯ä¿�ä¿¡æ�¯å…¬å¼€zhttps://www.lnjp.gov.cnz/jpxzf/zwgk/hbxxgk/hbxxgk/glistÚ	SEARCH_DBz/root/search.dbé   z[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.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)z
User-AgentÚAcceptzAccept-Languagec                 ó  — t        j                  | t        ¬«      }	 t        j                  ||¬«      }|j	                  «       j                  dd¬«      S # t        $ r+}t        d| ›d|›�t        j                  ¬«       Y d }~y d }~ww xY w)	N)Úheaders©Útimeoutzutf-8Úignore)Úerrorsz
  [ERROR] z: )Úfile)
r   ÚRequestÚHEADERSÚurlopenÚreadÚdecodeÚ	ExceptionÚprintÚsysÚstderr)Úurlr   ÚreqÚrespÚes        úcrawl_jianping_hb.pyÚfetchr      si   € Ü
�/‰/˜#¤wÔ
/€CðÜ�‰˜s¨GÔ4ˆØ�y‰y‹{×!Ñ! '°(Ð!Ó;Ð;øÜò Ý¢C©Ð+´#·*±*Õ=Üûðús   �7A Á	B	Á!BÂB	c                 ó~  — g }t        j                  d| t         j                  «      D ]’  }|j                  d«      j	                  «       }|j                  d«      j	                  «       }|j                  d«      }|rt        |«      dk  rŒc|j                  d«      r|nt        |z   }|j                  |||f«       Œ” |S )u$   æ��å�–åˆ—è¡¨é¡¹: li > a + span(date)zP<li>\s*<a[^>]*href="([^"]+)"[^>]*>([^<]+)</a>\s*<span>(\d{4}-\d{2}-\d{2})</span>é   r   é   é   Úhttp)	ÚreÚfinditerÚDOTALLÚgroupÚstripÚlenÚ
startswithÚBASE_URLÚappend)ÚhtmlÚitemsÚmÚhrefÚtitleÚdateÚfull_urls          r   Ú
parse_listr5   (   s¦   € à€EÜ�[‰[Ø[ØŒb�i‰ióò 
.ˆð �w‰w�q‹z×ÑÓ!ˆØ—‘˜“
× Ñ Ó"ˆØ�w‰w�q‹zˆÙœ˜E›
 QšØØŸ?™?¨6Ô2‘4¼ÀD¹ˆØ�‰�e˜X tÐ,Õ-ð
.ð €Ló    c                 óØ  — ddl m}  |t        | «      d«      }|j                  d«      D ]P  }|j	                  dd«      }|sŒ|j                  d«      rŒ*|r t        j                  j                  ||«      n||d<   ŒR |j                  d«      D ]P  }|j	                  d	d«      }|sŒ|j                  d
«      rŒ*|r t        j                  j                  ||«      n||d	<   ŒR t        |«      S )uA   ä¿�ç•™ HTML è¡¨æ ¼ç»“æž„ï¼Œä»…å°†ç›¸å¯¹é“¾æŽ¥/å›¾ç‰‡è½¬ç»�å¯¹ URLr   r   zhtml.parserÚar1   Ú )r$   Ú
javascriptú#ÚimgÚsrc)r$   z//zdata:)	Úbs4r   ÚstrÚfind_allÚgetr+   ÚurllibÚparser   )ÚtableÚbase_urlr   Útblr8   r1   r<   r=   s           r   Úhtml_table_to_htmlrG   9   sÐ   € å!Ù
œ˜E›
 MÓ
2€CØ�\‰\˜#Óò SˆØ�u‰u�V˜RÓ ˆÚ˜Ÿ™Ð(CÕDÙ@HœŸ™×,Ñ,¨X°tÔ<ÈdˆAˆfŠIðSð �|‰|˜EÓ"ò RˆØ�g‰g�e˜RÓ ˆÚ�s—~‘~Ð&=Õ>Ù@HœŸ™×-Ñ-¨h¸Ô<ÈcˆC�ŠJðRô ˆs‹8€Or6   c                 óÌ  ‡— g }g }d }dD ]<  }t        j                  || t         j                  «      }|sŒ+|j                  d«      } n |�rSt        j                  d|t         j                  «      D ]á  }t        j
                  dd|«      j                  «       }|j                  dd«      }t        j
                  dd|«      }t        j                  d	|t         j                  «      D ]D  \  }	}
t        ||	«      Š|
j                  «       sŒ#|j                  |
j                  «       ‰d
œ«       ŒF |sŒÀ|j                  «       sŒÑ|j                  |«       Œã t        j                  d|t         j                  «      D ]!  }t        |«      }|sŒ|j                  |«       Œ# nÂt        j                  d| t         j                  «      }|r›t        j                  d|j                  d«      t         j                  «      D ]d  }t        j
                  dd|«      j                  «       }|j                  dd«      }t        j
                  dd|«      }|sŒT|j                  |«       Œf t        j                  d| t         j                  «      D ]H  \  }	}
t        ||	«      Št        ˆfd„|D «       «      rŒ'|j                  |
j                  «       ‰d
œ«       ŒJ dj                  |«      }||fS )N)z4<div\s+class="center-info"[^>]*>(.*?)</div>\s*</div>z+<div\s+class="center-info"[^>]*>(.*?)</div>r!   z<p[^>]*>(.*?)</p>z<[^>]+>r9   z&nbsp;ú z\s+zJ<a[^>]*href="([^"]+\.(?:docx?|pdf|xlsx?|rar|zip|wps|et))"[^>]*>([^<]+)</a>)r2   r   z<table[^>]*>.*?</table>z<body[^>]*>(.*?)</body>zC<a[^>]*href="([^"]+\.(?:docx?|pdf|xlsx?|rar|zip))"[^>]*>([^<]+)</a>c              3   ó.   •K  — | ]  }|d    ‰k(  –— Œ y­w)r   N© )Ú.0r8   Úfulls     €r   ú	<genexpr>zparse_detail.<locals>.<genexpr>}   s   øè ø€ Ò9¨�1�U‘8˜tÕ#Ñ9ùs   ƒz

)r%   Úsearchr'   r(   ÚfindallÚsubr)   ÚreplaceÚIr   r-   rG   ÚanyÚjoin)r.   r   Úcontent_partsÚattachmentsÚ	containerÚpatr0   Úp_htmlÚtextÚa_hrefÚa_textÚt_htmlÚtable_mdÚbody_mÚcontentrM   s                  @r   Úparse_detailrb   H   su  ø€ Ø€MØ€Kð €Iðò ˆô �I‰I�c˜4¤§¡Ó+ˆÚØŸ™ ›
ˆIÙðò ä—j‘jÐ!5°yÄ"Ç)Á)ÓLò 	+ˆFÜ—6‘6˜* b¨&Ó1×7Ñ7Ó9ˆDØ—<‘< ¨#Ó.ˆDÜ—6‘6˜& # tÓ,ˆDä"$§*¡*Ø]ØœŸ™ó#ò O‘�˜ô ˜s FÓ+�Ø—<‘<•>Ø×&Ñ&°·±³ÈÑ'MÕNðOò ˜Ÿ
™
�Ø×$Ñ$ TÕ*ð	+ô  —j‘jÐ!;¸YÌÏ	É	ÓRò 	/ˆFÜ)¨&Ó1ˆHÚØ×$Ñ$ XÕ.ñ	/ô
 —‘Ð5°t¼R¿Y¹YÓGˆÙÜŸ*™*Ð%9¸6¿<¹<È»?ÌBÏIÉIÓVò /�Ü—v‘v˜j¨"¨fÓ5×;Ñ;Ó=�Ø—|‘| H¨cÓ2�Ü—v‘v˜f c¨4Ó0�ÚØ!×(Ñ(¨Õ.ð/ô Ÿ*™*ØNØŒb�d‰dóò G‰ˆ�ô �s˜FÓ#ˆÜÓ9¨[Ô9Õ9Ø×Ñ¨¯©«ÀÑEÕFðGð �k‰k˜-Ó(€GØ�KÐÐr6   c                 ór   — t        j                  d| «      }|r|j                  d«      j                  «       S y )Nz)<div\s+class="center-title">([^<]+)</div>r!   )r%   rO   r(   r)   )r.   r0   s     r   Úget_title_from_htmlrd   „   s0   € Ü
�	‰	Ð>ÀÓE€AÙØ�w‰w�q‹z×ÑÓ!Ð!Ør6   r#   c                 ó¦  — dd l }|j                  t        d¬«      }|j                  «       }d}d}d}t	        d| dz   «      D �]e  }|dk(  rt
        t        z   dz   }nt
        t        z   t        |dz
  «      z   dz   }t        d||fz  d¬«       t        j                  t        «       t        |«      }	|	st        d	|z  d¬«        �nåt        |	«      }
|
st        d
|z  d¬«        �nÅt        dt        |
«      z  d¬«       |
D �]“  \  }}}|j                  d|t         f«       |j#                  «       }|r|d   rt        |d   «      dkD  r|dz  }ŒNt        j                  t        «       t        |«      }|sNt        d|d d z  d¬«       t        j                  d«       t        |«      }|st        d|d d z  d¬«       |dz  }ŒÂt%        ||«      \  }}t'        j(                  |d¬«      }t+        |«      }|r|}|r.|d d }t        d|d d t        |«      t        |«      fz  d¬«       n|}t        d|d d z  d¬«       |r|j                  d|||||d   f«       n|j                  dt         ||||||f«       |j,                  dkD  s|r	 |dz  }�Œ�|dz  }�Œ– |j/                  «        �Œh |j1                  «        t        dt         |||fz  d¬«       y )Nr   é<   r   r!   z.htmlu   [åˆ†é¡µ] ç¬¬%dé¡µ: %sT)Úflushu     [å®Œæˆ�] ç¬¬%dé¡µæ— æ³•èŽ·å�–u     [å®Œæˆ�] ç¬¬%dé¡µæ— æ•°æ�®u     æ‰¾åˆ° %d æ�¡z@SELECT id, content FROM gov_raw WHERE page_url=? AND site_name=?é
   u     [ç­‰å¾…5sé‡�è¯•] %sé   r#   u     [è·³è¿‡] è¯¦æƒ…é¡µ: %sF)Úensure_asciiéÈ   u#     [æ­£æ–‡] %s -> %d chars, %dé™„ä»¶u     [æ— æ–‡æœ¬] %s (æ‰«æ��ä»¶)zJUPDATE gov_raw SET content=?, title=?, attachments=?, summary=? WHERE id=?z²INSERT OR IGNORE INTO gov_raw
                       (site_name, page_url, title, content, publish_date, attachments, summary)
                       VALUES (?, ?, ?, ?, ?, ?, ?)u+   
[DONE] %s: æ–°å¢ž=%d, è·³è¿‡=%d, é”™è¯¯=%d)Úsqlite3ÚconnectÚDB_PATHÚcursorÚranger,   Ú	LIST_PATHr?   r   ÚtimeÚsleepÚDELAYr   r5   r*   ÚexecuteÚ	SITE_NAMEÚfetchonerb   ÚjsonÚdumpsrd   ÚrowcountÚcommitÚclose)Ú	max_pagesrl   ÚconnÚcurÚ	new_countÚ
skip_countÚerror_countÚpageÚlist_urlr.   r/   r2   Ú
detail_urlr3   ÚrowÚdetail_htmlra   rW   Úattachments_jsonÚdetail_titleÚsummarys                        r   Úcrawlr‹   ‹   sò  € ÛØ�?‰?œ7¨Bˆ?Ó/€DØ
�+‰+‹-€Cà€IØ€JØ€Kä�a˜ Q™Ó'ó KˆØ�1Š9Ü¤)Ñ+¨gÑ5‰Hä¤)Ñ+¬c°$¸±(«mÑ;¸gÑEˆHäÐ%¨¨xÐ(8Ñ8ÀÕEä�
‰
”5ÔÜ�X‹ˆÙÜÐ3°dÑ:À$ÕGÚä˜4Ó ˆÙÜÐ0°4Ñ7¸tÕDÚäÐ¤# e£*Ñ,°DÕ9à',ó 4	 Ñ#ˆE�:˜tØ�K‰KÐZØ"¤IÐ.ô0à—,‘,“.ˆCá�s˜1’v¤# c¨!¡f£+°Ò"2Ø˜a‘�
Øä�J‰J”uÔä 
Ó+ˆKÙÜÐ-°°c°r°
Ñ:À$ÕGÜ—
‘
˜1”Ü# JÓ/�Ù"ÜÐ4°u¸S¸b°zÑAÈÕNØ 1Ñ$�KØä#/°¸ZÓ#HÑ ˆG�[Ü#Ÿz™z¨+ÀEÔJÐä.¨{Ó;ˆLÙØ$�áØ! $ 3˜-�ÜÐ;Ø˜S˜b�z¤3 w£<´°[Ó1AÐBñCØJNöPð  �ÜÐ4°u¸S¸b°zÑAÈÕNáØ—‘Ø`Ø˜eÐ%5°wÀÀAÁÐGõð
 —‘ð7ô  
¨E°7¸DÐBRÐT[Ð\ô	ð �|‰|˜aÒ¡C¨DØ˜Q‘’	à˜a‘’
ði4	 ðl 	�‰ŽðWKðZ 	‡J�J„LÜ	Ð
8Ü�i ¨[Ð
9ñ:ØAEöGr6   Ú__main__r!   )ri   )r9   )r#   )!Ú__doc__Úosr%   r   rx   rr   r>   r   rB   r   Úurllib.parser   Ússlrv   r,   rq   Úgetenvrn   rt   r   Ú_create_unverified_contextÚ_create_default_https_contextr   r5   rG   rb   rd   r‹   Ú__name__r*   ÚargvÚintÚmax_prK   r6   r   ú<module>r˜      sÉ   ðñ÷ × Ó Ý Ý Ý  Û 
Û à6€	Ø$€Ø-€	Ø
ˆ"�)‰)�KÐ!2Ó
3€Ø	€ð pØOØ'ñ€ð %(×$BÑ$B€Ô !óòó"ò9 òxóXGðv ˆzÒÙ # C§H¡H£°Ò 1‰C�—‘˜‘Ô°q€EÙ	ˆ%…Lð r6   