Ë
    V_ŠjZ2  ã                   óÒ   — 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 ddl	m
Z
 dZdZdZdZd	Zd
ZdddœZg 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Ê   
è�¥å�£ç»�æµŽæŠ€æœ¯å¼€å�‘åŒºï¼ˆé²…é±¼åœˆåŒºï¼‰- é€šçŸ¥å…¬å‘Š çˆ¬è™«
CMS: webBuilder
List: /003/003006/about.html (P1), /003/003006/{N}.html (P2-P6)
Detail: /003/003006/YYYYMMDD/uuid.html
æ¯�é¡µçº¦16æ�¡
é    N)Údatetime)ÚBeautifulSoupz/root/search.dbu(   è�¥å�£ç»�æµŽæŠ€æœ¯å¼€å�‘åŒº-é€šçŸ¥å…¬å‘Šõ   é€šçŸ¥å…¬å‘Šu   è¾½å®�zhttp://www.ykdz.gov.cné   zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36zzh-CN,zh;q=0.9)z
User-AgentzAccept-Language)
u   ã€�æ‰“å�°æœ¬é¡µã€‘u   ã€�å…³é—­çª—å�£ã€‘u   æ‰“å�°æœ¬é¡µu   å…³é—­çª—å�£u   è½¬è½½åˆ†äº«ï¼šu   æµ�è§ˆé‡�ï¼šu   ç›¸å…³é™„ä»¶ï¼šu   ç›¸å…³ç¨¿ä»¶ï¼šu   æ‰«ä¸€æ‰«åœ¨æ‰‹æœºæ‰“å¼€u	   é™„ä»¶ï¼šc                 ó   — t        | «      S )u'   ä¿�ç•™ HTML è¡¨æ ¼ç»“æž„ï¼ˆä¸�è½¬ mdï¼‰)Ústr)ÚtableÚargsÚkwargss      ú/root/gov_crawler/crawl_ykdz.pyÚtable_to_mdr   #   s   € äˆu‹:Ðó    c                 óÜ  — g }| j                   D �]Ê  }t        |t        «      r%|j                  «       }|sŒ'|j	                  |«       Œ9|j
                  dk(  r¬|j                  dd«      j                  «       }|j                  d¬«      }|rc|ra|j                  d«      r|n4|j                  d«      r	t        |z   nt        dz   |j                  d«      z   }|j	                  d|› d	|› d
�«       Œß|sŒâ|j	                  |«       Œô|j
                  dk(  r’|j                  dd«      }|s�Œ|j                  dd«      }	|j                  d«      r|n4|j                  d«      r	t        |z   nt        dz   |j                  d«      z   }
|j	                  |	r	d|	› d	|
› d
�nd|
› d
�«       �Œ•t        |d«      s�Œ£|j                  dd¬«      }|s�Œº|j	                  |«       �ŒÍ dj                  |«      S )z8Render a <p> preserving <a> links and <img> as markdown.ÚaÚhrefÚ T©ÚstripÚhttpú/ú[ú](ú)ÚimgÚsrcÚaltú![ú![](Úget_textú )ÚcontentsÚ
isinstancer   r   ÚappendÚnameÚgetr   Ú
startswithÚBASE_URLÚlstripÚhasattrÚjoin)Úp_tagÚ
detail_urlÚpartsÚelemÚtr   ÚtextÚfullr   r   Úfull_srcs              r   Úrender_paragraphr3   '   sÛ  € à€EØ—‘ó  ˆÜ�dœCÔ Ø—
‘
“ˆAÚØ—‘˜Q•Ø�Y‰Y˜#ÒØ—8‘8˜F BÓ'×-Ñ-Ó/ˆDØ—=‘= t�=Ó,ˆDÙ™Ø#Ÿ™¨vÔ6‘tÐPT×P_ÑP_Ð`cÔPd¼XÈº_ÔjrÐuxÑjxÐ{÷  |Gñ  |Gð  HKó  |Lñ  kL�Ø—‘˜q   b¨¨¨aÐ0Õ1ÚØ—‘˜TÕ"Ø�Y‰Y˜%ÒØ—(‘(˜5 "Ó%ˆCÛØ—h‘h˜u bÓ)�Ø"%§.¡.°Ô"8™3ÐQT×Q_ÑQ_Ð`cÔQd¼xÈ#º~ÔjrÐuxÑjxÐ{~÷  |Fñ  |Fð  GJó  |Kñ  kK�Ø—‘¹˜r #  b¨¨
°!Ñ4À4ÈÀzÐQRÐASÖTÜ�T˜:Ö&Ø—‘˜c¨�Ó.ˆAÛØ—‘˜Q–ð- ð. �8‰8�E‹?Ðr   c           	      óN  ‡— g }t        «       }| j                  ddg«      D ]  }|j                  «        Œ | j                  D �]  }|j                  €Œ|j                  j                  «       }|dk(  r!t        ||«      }|sŒ?|j                  |«       ŒQ|dk(  rA|j                  d¬«      }t        |«      dk  rŒwt        |«      }	|	sŒ…|j                  |	«       Œ—|dk(  r¹|j                  d	d
«      }
|
sŒ±t        |«      |vsŒ¿|j                  t        |«      «       |j                  dd
«      }|
j                  d«      r|
n4|
j                  d«      r	t        |
z   nt        dz   |
j!                  d«      z   }|j                  |r	d|› d|› d�nd|› d�«       �ŒU|dv �re|j                  g d¢d¬«      D �]J  }t        |«      |v rŒ|j                  t        |«      «       |j                  dk(  r!t        ||«      }|sŒJ|j                  |«       Œ\|j                  dk(  rA|j                  d¬«      }t        |«      dk  rŒŒt        |«      }	|	sŒš|j                  |	«       Œ¬|j                  dk(  sŒ¼|j                  d	d
«      }
|
sŒÑ|j                  dd
«      }|
j                  d«      r|
n4|
j                  d«      r	t        |
z   nt        dz   |
j!                  d«      z   }|j                  |r	d|› d|› d�nd|› d�«       �ŒM �Œ¿|dv s�ŒÅ|j                  dd¬«      D ],  }|j                  dd¬«      }|sŒ|j                  d|z   «       Œ. �Œ	 g }|D ]C  Št#        ˆfd„t$        D «       «      rŒt'        j(                  d‰«      rŒ3|j                  ‰«       ŒE dj+                  |«      S )z?Extract content from content_div: paragraphs + tables + images.ÚscriptÚstyleÚpr	   Tr   é   r   r   r   r   r   r   r   r   r   r   )ÚdivÚsectionÚcenter)r7   r	   r   )Ú	recursive)ÚulÚolÚliFr    z- c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­w)N© )Ú.0Úskr7   s     €r   ú	<genexpr>z"extract_content.<locals>.<genexpr>ˆ   s   øè ø€ Ò,˜2ˆr�QŒwÑ,ùs   ƒu   ^(æ�¥æº�|å�‘å¸ƒæ—¥æœŸ)[ï¼š:]\s*ú

)ÚsetÚfind_allÚ	decomposeÚchildrenr$   Úlowerr3   r#   r   Úlenr   r%   ÚidÚaddr&   r'   r(   ÚanyÚ
SKIP_TEXTSÚreÚmatchr*   )Úcontent_divr,   r-   Ú	processedÚsÚchildÚtnÚtxtÚall_textÚmdr   r   r2   Úsubr?   Úfilteredr7   s                   @r   Úextract_contentr\   D   s   ø€ à€EÜ“€Ið ×!Ñ! 8¨WÐ"5Ó6ò ˆØ	�‰�ðð ×%Ñ%ó 6-ˆØ�:‰:ÐØØ�Z‰Z×ÑÓˆà�Š9Ü" 5¨*Ó5ˆCÚØ—‘˜SÕ!à�7Š]Ø—~‘~¨D�~Ó1ˆHÜ�8‹}˜rÒ!ØÜ˜UÓ#ˆBÚØ—‘˜RÕ à�5Š[Ø—)‘)˜E 2Ó&ˆCÚ”r˜%“y¨	Ò1Ø—‘œb ›iÔ(Ø—i‘i  rÓ*�Ø"%§.¡.°Ô"8™3ÐQT×Q_ÑQ_Ð`cÔQd¼xÈ#º~ÔjrÐuxÑjxÐ{~÷  |Fñ  |Fð  GJó  |Kñ  kK�Ø—‘¹˜r #  b¨¨
°!Ñ4À4ÈÀzÐQRÐASÖTàÐ/Ò/à—~‘~Ò&;Àt�~ÓLó ]�Ü�c“7˜iÑ'ØØ—‘œb ›gÔ&Ø—8‘8˜s’?Ü*¨3°
Ó;�CÚØŸ™ SÕ)Ø—X‘X Ò(Ø"Ÿ|™|°$˜|Ó7�HÜ˜8“} rÒ)Ø Ü$ SÓ)�BÚØŸ™ RÕ(Ø—X‘X Ó&ØŸ'™' %¨Ó,�CÚØ!Ÿg™g e¨RÓ0˜Ø*-¯.©.¸Ô*@¡3ÐY\×YgÑYgÐhkÔYlÄxÐRUÂ~Ôrzð  ~Añ  sAð  DG÷  DNñ  DNð  ORó  DSñ  sS˜ØŸ™Á r¨#¨¨b°°
¸!Ñ%<È4ÐPXÈzÐYZÐI[Ö\ò)]ð, �<ÓØ—n‘n T°U�nÓ;ò -�Ø—k‘k #¨T�kÓ2�ÚØ—L‘L ¨¡Õ,ò-ðg6-ðr €HØò ˆÜÓ,¤Ô,Ô,ØÜ�8‰8Ð6¸Ô:ØØ�‰˜Õðð �;‰;�xÓ Ð r   c                 óú  — g }t        «       }| j                  dd¬«      D ]Ø  }|d   }t        j                  d|t        j                  «      sŒ.|j                  d«      r
t        |z   }n,|j                  d«      st        dz   |j                  d«      z   }|j                  d¬«      xs& |j                  d«      d	   j                  d
«      d   }||vsŒ´|j                  |«       |j                  ||dœ«       ŒÚ |S )z0Find PDF/doc/xls/xlsx/zip/rar links in the page.r   T)r   r   z&\.(pdf|doc|docx|xls|xlsx|rar|zip|txt)$r   r   r   éÿÿÿÿú?r   )r$   Úurl)rF   rG   rP   ÚsearchÚIr&   r'   r(   r   ÚsplitrM   r#   )ÚsoupÚattsÚseenr   r   r$   s         r   Úextract_attachmentsrg   “   sÝ   € à€DÜ‹5€DØ�]‰]˜3 Tˆ]Ó*ò 
9ˆØ�‰yˆÜ�9‰9Ð>ÀÄbÇdÁdÕKØ�‰˜sÔ#Ü $‘‘Ø—_‘_ VÔ,Ü #‘~¨¯©°CÓ(8Ñ8�Ø—:‘: D�:Ó)ÒN¨T¯Z©Z¸«_¸RÑ-@×-FÑ-FÀsÓ-KÈAÑ-NˆDØ˜4ÒØ—‘˜”Ø—‘ T°$Ñ7Õ8ð
9ð €Kr   c                 óœ  — 	 t        j                  | t        d¬«      }d|_        t        |j                  d«      }d}|j                  d«      }|r(|j                  d¬	«      }|rt        |«      d
kD  rd|vr|}|sL|j                  d«      }|r9|j                  d¬	«      }t        j                  dd|«      j                  «       }|}|sdddg fS d}t        j                  d|j                  «      }	|	r|	j                  d«      }|s<t        j                  d| «      }
|
r$|
j                  d«      }|dd › d|dd › d|dd › �}|j                  dd¬«      }|s|j                  dd¬«      }t        |«      }|rt!        || «      }nd}t        |j                  «       «      dk  rËd| › d|› d�}|j#                  d«      }g }|D ]‘  }|j                  dd«      }|sŒ|j%                  d«      r|n4|j%                  d «      r	t&        |z   nt&        d z   |j)                  d «      z   }|j                  d!d«      }|j+                  |r	d"|› d#|› d$�nd%|› d$�«       Œ“ |r|d&d&j-                  |«      z   z  }|r>g }|D ]   }|j+                  d'|d(   › d#|d)   › d$�«       Œ" |d&d&j-                  |«      z   z  }||||fS # t        $ r}dddg fcY d}~S d}~ww xY w)*z=Fetch detail page: extract content, title, date, attachments.é   ©ÚheadersÚtimeoutúutf-8Núhtml.parserr   Úh3Tr   r   r   ÚtitleuA   -è�¥å�£å¸‚é²…é±¼åœˆåŒºäººæ°‘æ”¿åºœã€�è�¥å�£ç»�æµŽæŠ€æœ¯å¼€å�‘åŒº$u,   å�‘å¸ƒæ—¶é—´[ï¼š:]\s*(\d{4}-\d{1,2}-\d{1,2})é   ú	/(\d{8})/é   ú-é   é   r9   zewb-article-content©Úclass_Úivs_content)rL   z<p><a href="z">z</a></p>r   r   r   r   r   r   r   r   r   rE   u
   é™„ä»¶ï¼š[r$   r`   )Úrequestsr%   ÚHEADERSÚencodingÚ	Exceptionr   r0   Úfindr   rK   rP   rZ   r   ra   Úgrouprg   r\   rG   r&   r'   r(   r#   r*   )r`   ÚrÚerd   rp   ro   r/   Ú	title_tagÚdate_strÚdmÚumÚdrR   ÚattachmentsÚcontentÚimgsÚ	img_linesr   r   r2   r   Ú	att_linesr   s                          r   Úfetch_detailrŒ   §   s   € ð$Ü�L‰L˜¤g°rÔ:ˆØˆŒ
ô ˜Ÿ™ Ó/€Dð €EØ	�‰�4‹€BÙ	Ø�K‰K˜dˆKÓ#ˆÙ”�Q“˜!’ °aÑ 7ØˆEÙØ—I‘I˜gÓ&ˆ	ÙØ×"Ñ"¨Ð"Ó.ˆAä—‘Ð[Ð]_ÐabÓc×iÑiÓkˆAØˆEÙà�T˜4 Ð#Ð#ð €HÜ	�‰ÐBÀAÇFÁFÓ	K€BÙ	Ø—8‘8˜A“;ˆÙä�Y‰Y�| SÓ)ˆÙØ—‘˜“ˆAØ˜B˜Q˜%˜  ! A a & ¨¨1¨Q¨q¨6¨(Ð3ˆHð —)‘)˜EÐ*?�)Ó@€KÙØ—i‘i ¨-�iÓ8ˆä% dÓ+€KáÜ! +¨sÓ3‰àˆô ˆ7�=‰=‹?Ó˜bÒ Ø    R¨ w¨hÐ7ˆØ�}‰}˜UÓ#ˆØˆ	Øò 	YˆCØ—'‘'˜% Ó$ˆCÚØ"%§.¡.°Ô"8™3ÐQT×Q_ÑQ_Ð`cÔQd¼xÈ#º~ÔjrÐuxÑjxÐ{~÷  |Fñ  |Fð  GJó  |Kñ  kK�Ø—g‘g˜e RÓ(�Ø× Ñ ¹C 2 c U¨"¨X¨J°aÑ!8ÀtÈHÈ:ÐUVÐEWÕXð	Yñ Ø�v §¡¨IÓ 6Ñ6Ñ6ˆGáØˆ	Øò 	DˆAØ×Ñ˜z¨!¨F©)¨°B°q¸±x°jÀÐBÕCð	Dà�6˜FŸK™K¨	Ó2Ñ2Ñ2ˆà�(˜G [Ð0Ð0øôI ò $Ø�T˜4 Ð#Õ#ûð$ús   ‚#J2 Ê2	KÊ;KË KËKc           	      óÜ  — | dk(  r
t         › d�}nt         › d| › d�}	 t        j                  |t        d¬«      }d|_        t        |j                  d«      }|j                  dd¬«      }|sg S g }|j                  d«      D �]?  }|j                  dd¬«      }t        |«      dk\  sŒ&|D �]  }	|	j                  d«      }
|
sŒ|
j                  dd«      }t        j                  d|«      sŒA|
j                  dd«      xs |
j                  d¬«      }|rt        |«      dk  rŒx|j                  d«      r
t         |z   }n/|j                  d«      r|}nt         dz   |j!                  d«      z   }d}t        j                  d|«      }|r$|j#                  d«      }|d
d › d|dd  › d|d d! › �}|j%                  |||f«       �Œ  |S  |S # t
        $ r}t        d| › d	|› �«       g cY d
}~S d
}~ww xY w)"z.Extract article list from a given page number.rq   z/003/003006/about.htmlz/003/003006/z.htmlri   rj   rm   ú  Page z error: Nrn   r9   z	ewb-rightrw   r=   r?   zewb-list-nodeé   r   r   r   z#/003/003006/\d{8}/[a-f0-9-]+\.html$rp   Tr   r   r   r   rr   rs   rt   ru   rv   )r'   rz   r%   r{   r|   r}   Úprintr   r0   r~   rG   rK   rP   ra   r   r&   r(   r   r#   )Úpage_numr`   r€   r�   rd   ÚerÚarticlesr=   Úlisr?   r   r   rp   Úfull_urlÚdater„   r†   s                    r   Úextract_list_pager—   õ   s  € à�1‚}Ü�
Ð0Ð1‰ä�
˜, x j°Ð6ˆðÜ�L‰L˜¤g°rÔ:ˆØˆŒ
ô
 ˜Ÿ™ Ó/€Dà	�‰�5 ˆÓ	-€BÙØˆ	à€HØ�k‰k˜$Óó !ˆØ�k‰k˜$ ˆkÓ7ˆÜˆs‹8�q‹=Øó 9�Ø—G‘G˜C“L�ÙØØ—u‘u˜V RÓ(�ä—y‘yÐ!GÈÔNØð Ÿ™˜g rÓ*ÒD¨a¯j©j¸t¨jÓ.D�Ù¤ E£
¨Q¢Øð —?‘? 3Ô'Ü'¨$™‘HØ—_‘_ VÔ,Ø#‘Hä'¨#™~°·±¸CÓ0@Ñ@�Hð �Ü—Y‘Y˜|¨TÓ2�ÙØŸ™ ›�AØ  ˜e˜W A a¨¨! f X¨Q¨q°°1¨v¨hÐ7�Dà—‘ ¨°$Ð 7Ö8ð;9ð< à€OðG!ðF €Oøô] ò Ü�˜�z ¨!¨Ð-Ô.Ø�	ûðús   �#G Ç	G+ÇG&Ç G+Ç&G+c                  ó|   — t        j                  t        «      } | j                  d«       | j                  d«       | S )NzPRAGMA journal_mode=WALzPRAGMA busy_timeout=5000)Úsqlite3ÚconnectÚDB_PATHÚexecute)Úconns    r   Úinit_dbrž   2  s/   € Ü�?‰?œ7Ó#€DØ‡L�LÐ*Ô+Ø‡L�LÐ+Ô,Ø€Kr   c                 óˆ  — |r|d d n|}t        j                  dd|«      j                  «       }|rt        j                  |d¬«      nd}	 | j                  dt        |||j                  «       |||t        |t        f
«       | j                  dkD  S # t        $ r(}t        d	|› �t        j                  ¬
«       Y d }~yd }~ww xY w)NéÈ   z\s+r    F)Úensure_asciiz[]zÍINSERT OR IGNORE INTO gov_raw
               (site_name, source_url, page_url, title, publish_date, summary, content, category, attachments, group_name)
               VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)r   z  DB error: )Úfile)rP   rZ   r   ÚjsonÚdumpsrœ   Ú	SITE_NAMEÚCATEGORYÚGROUPÚtotal_changesr}   r�   ÚsysÚstderr)	r�   rp   Úpage_urlÚpublish_daterˆ   r‡   ÚsummaryÚatt_jsonr�   s	            r   Úsave_articler¯   9  s´   € Ù&ˆg�d�s‰m¨E€GÜ�f‰f�V˜S 'Ó*×0Ñ0Ó2€GÙ>IŒt�z‰z˜+°EÕ:Èt€HðØ�‰ð8ô ˜ (¨E¯K©K«M¸<Ø�gœx¨´5ð:ô		
ð ×!Ñ! AÑ%Ð%øÜò Ü�˜Q˜CÐ ¤s§z¡zÕ2Üûðús   ÁAB Â	CÂB<Â<Cc            
      óâ  — t         } t        t        j                  «      dkD  r	 t	        t        j                  d   «      } t        dt        › d| › �«       t        «       }d}d}t        d| dz   «      D ]Ü  }t        |«      }|st        d|› d�«        n¾|t        |«      z  }|D ]‹  \  }}}|r|d	k  rŒ|j                  d
|f«      }	|	j                  «       rŒ3t        |«      \  }
}}}|
xs |}|xs |}|xs	 d|› d|› d�}|xs g }t        ||||||«      r|dz  }t        j                   d«       Œ� t        d|› dt        |«      › d|› d�«       ŒÞ |j#                  «        |j%                  «        t        d|› d|› �«       y # t
        $ rb t        j                  d   dv rIt        t        j                  «      dkD  r-	 t	        t        j                  d   «      } n# t
        $ r Y nw xY wY �Œ­w xY w)Nrq   )z--max-pagesé   z	Scraping z, max pages: r   rŽ   z: 0 articles (end)z
2020-01-01z)SELECT id FROM gov_raw WHERE page_url = ?r   r   r   g333333Ó?z: z found, z new so farz
Done! Total found: z, New: )Ú	MAX_PAGESrK   r©   ÚargvÚintÚ
ValueErrorr�   r¥   rž   Úranger—   rœ   ÚfetchonerŒ   r¯   ÚtimeÚsleepÚcommitÚclose)Ú	max_pagesr�   Ú	total_newÚtotal_foundÚpnr“   rp   r«   r–   ÚcurÚ	det_titleÚdet_dateÚdet_contentÚdet_attsÚfinal_titleÚ
final_dateÚfinal_contentÚ
final_attss                     r   ÚmainrÉ   M  s  € Ü€IÜ
Œ3�8‰8ƒ}�qÒð	ÜœCŸH™H Q™KÓ(ˆIô 
ˆI”i�[ ¨i¨[Ð
9Ô:ä‹9€DØ€IØ€Kä�A�y 1‘}Ó%ò MˆÜ$ RÓ(ˆÙÜ�G˜B˜4Ð1Ð2Ô3Ùà”s˜8“}Ñ$ˆà%-ò 	Ñ!ˆE�8˜Tá˜˜|Ò+Øð —,‘,ÐJÈXÈKÓXˆCØ�|‰|Œ~Øä9EÀhÓ9OÑ6ˆI�x ¨hØ#Ò, uˆKØ!Ò) TˆJØ'ÒI¨Q¨{¨m¸2¸h¸ZÀqÐ+IˆMØ!š RˆJä˜D +¨x¸À]ÐT^Ô_Ø˜Q‘�	ô �J‰J�s�Oð)	ô, 	�˜�t˜2œc (›m˜_¨H°Y°K¸{ÐKÕLð=Mð@ 	‡K�K„MØ‡J�J„LÜ	Ð! + ¨g°i°[Ð
AÕBøôa ò 	Ü�x‰x˜‰{Ð.Ñ.Ü”s—x‘x“= 1Ò$ðÜ$'¬¯©°©Ó$4™	øÜ%ò Ùðýð	ús5   ¤F Æ:G.Æ>GÇG.Ç	G'Ç$G.Ç&G'Ç'G.Ç-G.Ú__main__)Ú__doc__rz   rP   r£   r™   r¸   Úosr©   r   Úbs4r   r›   r¥   r¦   r§   r'   r²   r{   rO   r   r3   r\   rg   rŒ   r—   rž   r¯   rÉ   Ú__name__rA   r   r   ú<module>rÏ      s›   ðñ÷ 2× 1× 1Ó 1Ý Ý à
€Ø6€	Ø€Ø€Ø#€Ø€	ð DØ'ñ€ò
€
òòò:J!ò^ò(I1ò\8òzòò(5Cðp ˆzÒÙ…Fð r   