Ë
    ì¾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Z
dZdZdZd	Zd
ZddddœZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zdefd„Zedk(  rpdej6                  v rdndZedk(  rdneZ eej6                  «      dkD  r2ej6                  d   j?                  «       r e ej6                  d   «      Z eedk(  e¬«       yy) u$   èŠ¦å±±åŽ¿äººæ°‘æ”¿åºœ - å…¬ç¤ºå…¬å‘Šé    N)ÚBeautifulSoup)Úurljoinz/root/search.dbu   èŠ¦å±±åŽ¿-å…¬ç¤ºå…¬å‘Šu   å…¬ç¤ºå…¬å‘Šz/http://www.yals.gov.cn/gongkai/jichu/40016.htmlÚ	301144949éd   zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) 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-Languagez·INSERT OR IGNORE INTO gov_raw
    (site_name, source_url, page_url, title, publish_date, summary, content, category, attachments, group_name)
    VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)c                  ó|   — dd l } | j                  t        «      }|j                  d«       |j                  d«       |S )Nr   zPRAGMA journal_mode=WALzPRAGMA busy_timeout=5000)Úsqlite3ÚconnectÚDB_PATHÚexecute)r	   Úconns     ú$/root/gov_crawler/crawl_yals_gggs.pyÚinit_dbr      s2   € ÛØ�?‰?œ7Ó#€DØ‡L�LÐ*Ô+Ø‡L�LÐ+Ô,Ø€Kó    c                 óJ  — | j                   }| j                  j                  dd«      }d|j                  «       v sd|j                  «       v r|j	                  dd¬«      S |d d j                  «       }d|v sd	|v sd
|v r|j	                  dd¬«      S |j	                  dd¬«      S )NzContent-TypeÚ Úgb2312ÚgbkÚreplace)ÚerrorsiÐ  s   gb2312s   gbks
   charset=gbzutf-8)ÚcontentÚheadersÚgetÚlowerÚdecode)ÚrÚrawÚctÚ	raw_lowers       r   Údecode_respr    !   s�   € Ø
�)‰)€CØ	
�‰�‰�~ rÓ	*€BØ�2—8‘8“:Ñ ¨"¯(©(«*Ñ!4Ø�z‰z˜%¨	ˆzÓ2Ð2Ø�E�T�
× Ñ Ó"€IØ�IÑ ¨9Ñ!4¸ÈÑ8RØ�z‰z˜%¨	ˆzÓ2Ð2Ø�:‰:�g iˆ:Ó0Ð0r   c                 ó   — t        | «      S )u'   ä¿�ç•™ HTML è¡¨æ ¼ç»“æž„ï¼ˆä¸�è½¬ mdï¼‰)Ústr)ÚtableÚargsÚkwargss      r   Útable_to_mdr&   ,   s   € äˆu‹:Ðr   c                 ób  — g }t        «       }| j                  g d¢d¬«      D �]z  }t        |«      |v rŒ|j                  t        |«      «       |j                  dk(  r t        |«      }|sŒI|j                  |«       Œ[|j                  dk(  r™|j                  dd«      }|rQ|j                  dd«      }|j                  d	«      st        ||«      n|}|j                  |r	d
|› d|› d�nd|› d�«       |j                  dd¬«      D ]  }	|j                  t        |	«      «       Œ �Œ|j                  dk(  rA|j                  dd¬«      }
|
s�Œ)t        j                  dd|
«      }
|j                  |
«       �ŒS|j                  dd¬«      }
|
s�Œj|j                  |
«       �Œ} dj                  |«      S )z'Extract content from xqing-web-box div.)Úpr#   ÚimgÚh1Úh2Úh3Úh4T©Ú	recursiver#   r)   Úsrcr   ÚaltÚhttpz![ú](ú)z![](r(   ú ©Ústripz[^\S\n]+ú

)ÚsetÚfind_allÚidÚaddÚnamer&   Úappendr   Ú
startswithr   Úget_textÚreÚsubÚjoin)Ú	xqing_divÚ
detail_urlÚpartsÚ	processedÚelÚmdr0   r1   Úfull_srcÚsub_imgÚtxts              r   Úextract_contentrM   0   s…  € à€EÜ“€Ià× Ñ Ò!NÐZ^Ð Ó_ó "ˆÜˆb‹6�YÑØØ�‰”b˜“fÔà�7‰7�gÒÜ˜R“ˆBÚØ—‘˜RÕ à�W‰W˜ÒØ—&‘&˜ Ó#ˆCÙØ—f‘f˜U BÓ'�Ø;>¿>¹>È&Ô;Qœ7 :¨sÔ3ÐWZ�Ø—‘¹˜r #  b¨¨
°!Ñ4À4ÈÀzÐQRÐASÔTàŸ;™; u¸˜;Ó=ò +�Ø—‘œb ›kÕ*ò+ð �W‰W˜Š^Ø—+‘+˜c¨�+Ó.ˆCÛä—f‘f˜[¨#¨sÓ3�Ø—‘˜SÖ!ð —+‘+˜c¨�+Ó.ˆCÛØ—‘˜SÖ!ð?"ðB �;‰;�uÓÐr   c                 óD  — | j                  dd¬«      }|sg S g }|j                  dd¬«      D ]p  }|d   j                  «       }|j                  d¬«      }|s|j	                  d	«      d
   }|j                  d«      st        ||«      n|}|j                  ||dœ«       Œr |S )z1Extract attachment links from xqing-web-file div.Údivzxqing-web-file©Úclass_ÚaT)ÚhrefrS   r6   ú/éÿÿÿÿr2   )r=   Úurl)Úfindr:   r7   r@   Úsplitr?   r   r>   )ÚsouprE   Úfile_divÚattachmentsÚa_tagrS   r=   Úfull_urls           r   Úextract_attachmentsr^   Y   s­   € à�y‰y˜Ð'7ˆyÓ8€HÙØˆ	Ø€KØ×"Ñ" 3¨TÐ"Ó2ò <ˆØ�V‰}×"Ñ"Ó$ˆØ�~‰~ Dˆ~Ó)ˆÙØ—:‘:˜c“? 2Ñ&ˆDØ48·O±OÀFÔ4K”7˜: tÔ,ÐQUˆØ×Ñ D°Ñ:Õ;ð<ð Ðr   c                 óZ  — | dk(  rt         }nt         › d| › �}	 t        j                  |t        d¬«      }|j	                  «        t        |«      }t        |d	«      }g }|j                  d
«      }|s!t        d| › d�t        j                  ¬«       g S |j                  dd¬«      D ]¯  }|j                  d«      }	|	r|	j                  d«      sŒ(|	d   j                  «       }
|	j                  dd«      xs |	j                  d¬«      }|sŒd|j                  d«      }|r|j                  d¬«      nd}t!        t         |
«      }|j#                  |||dœ«       Œ± t        d| › dt%        |«      › d�«       |S # t
        $ r-}t        d| › d|› �t        j                  ¬«       g cY d}~S d}~ww xY w)z,Extract list items from a given page number.é   z?page=é   ©r   Útimeoutz  [ERR] page z: ©ÚfileNúhtml.parserzdiv.data-list > ul.content-listz  [WARN] page z: no content-list foundÚliFr.   rR   rS   Útitler   Tr6   Úspan)rh   rV   Údatez  Page z items)ÚBASE_URLÚrequestsr   ÚHEADERSÚraise_for_statusÚ	ExceptionÚprintÚsysÚstderrr    r   Ú
select_oner:   rW   r7   r@   r   r>   Úlen)Úpage_numrV   r   ÚeÚhtmlrY   ÚitemsÚulrg   r\   rS   rh   Ú	date_spanÚdate_strrE   s                  r   Úextract_list_pager|   i   s—  € à�1‚}Ü‰ä�
˜&  
Ð+ˆðÜ�L‰L˜¤g°rÔ:ˆØ	×ÑÔô
 �q‹>€DÜ˜˜}Ó-€DØ€Eà	�‰Ð:Ó	;€BÙÜ�˜x˜jÐ(?Ð@ÄsÇzÁzÕRØˆ	à�k‰k˜$¨%ˆkÓ0ò LˆØ—‘˜“ˆÙ˜EŸI™I fÔ-ØØ�V‰}×"Ñ"Ó$ˆØ—	‘	˜' 2Ó&ÒD¨%¯.©.¸t¨.Ó*DˆÙØà—G‘G˜F“Oˆ	Ù5>�9×%Ñ%¨DÐ%Ô1ÀBˆäœX tÓ,ˆ
Ø�‰˜u¨ZÀÑJÕKðLô 
ˆG�H�:˜R¤ E£
˜|¨6Ð
2Ô3Ø€Løô; ò Ü�˜h˜Z r¨!¨Ð-´C·J±JÕ?Ø�	ûðús   ™,E4 Å4	F*Å="F%ÆF*Æ%F*c                 óH  — 	 t        j                  | t        d¬«      }|j                  «        t        |«      }t        |d«      }|j                  d«      }|r|j                  d¬«      nd}d}|j                  d	d
¬«      }|rS|j                  d«      D ]?  }	|	j                  d¬«      }
t        j                  d|
«      }|sŒ.|j                  d«      } n |j                  d	d¬«      }d}|rt        || «      }t        || «      }t        |j!                  «       «      dk  rad|xs | j#                  d«      d   › d| › d�}|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Extract detail page content.ra   rb   Nrf   r*   Tr6   r   rO   ÚintrorP   ri   u%   å�‘å¸ƒæ—¶é—´ï¼š\s*(\d{4}-\d{2}-\d{2})r`   zxqing-web-boxé   ú[rT   rU   r3   r4   u
   é™„ä»¶ï¼š[r=   rV   r8   )rl   r   rm   rn   ro   r    r   rW   r@   r:   rA   ÚsearchÚgrouprM   r^   rt   r7   rX   r>   rC   )rV   r   rv   rw   rY   r*   rh   r{   r~   ri   rL   ÚmÚxqingr   r[   ÚfallbackÚattach_linksrR   s                     r   Úextract_detailr‡   “   sÅ  € ð$Ü�L‰L˜¤g°rÔ:ˆØ	×ÑÔô �q‹>€DÜ˜˜}Ó-€Dð 
�‰�4‹€BÙ')ˆB�K‰K˜dˆKÔ#¨r€Eð €HØ�I‰I�e GˆIÓ,€EÙØ—N‘N 6Ó*ò 	ˆDØ—-‘- d�-Ó+ˆCÜ—	‘	ÐBÀCÓHˆAÚØŸ7™7 1›:�Ùð	ð �I‰I�e OˆIÓ4€EØ€GÙÜ! %¨Ó-ˆô & d¨CÓ0€Kô ˆ7�=‰=‹?Ó˜bÒ Ø�uÒ2 §	¡	¨#£¨rÑ 2Ð3°2°c°U¸!Ð<ˆÙØˆLØ ò K�Ø×#Ñ# j°°6±°¸2¸aÀ¹h¸ZÀqÐ$IÕJðKà˜ §¡¨\Ó!:Ñ:Ñ:ˆHØˆà�(˜G [Ð0Ð0øôQ ò $Ø�T˜4 Ð#Õ#ûð$ús   ‚,F Æ	F!ÆFÆF!ÆF!Fc                 ó¸  — t        «       }|j                  «       }d}d}d}t        d|dz   «      D �]%  }t        |«      }|t	        |«      z  }|s �n|D ]ô  }	|	d   }
|j                  d|
f«       |j                  «       rŒ,t        |
«      \  }}}}|s|dz  }ŒD|xs |	d   }|xs |	d   }|rt        j                  |d¬«      nd	}|r|d d
 n|j                  «       }|s|}	 |j                  t        t        |
|
|j                  «       |||t        |t        f
«       |j                  «        |j                  dkD  r|dz  }| sŒî|dk\  sŒô n | s�Œ|dk\  s�Œ& n |j)                  «        t#        dt        › �«       t#        d|› d|› d|› �«       t#        d|› d|› d�«       |S # t         $ r-}t#        d|› �t$        j&                  ¬«       |dz  }Y d }~Œ•d }~ww xY w)Nr   r`   rV   z)SELECT id FROM gov_raw WHERE page_url = ?rh   rj   F)Úensure_asciir   éÈ   z  DB error: rd   é   z
[DONE] z  New: z
, Errors: z, Listed total: u     (åˆ—è¡¨å…± u    æ�¡, å…¶ä¸­ u    æ�¡è¯¦æƒ…å¤„ç�†å¼‚å¸¸))r   ÚcursorÚranger|   rt   r   Úfetchoner‡   ÚjsonÚdumpsr7   ÚSQLÚ	SITE_NAMEÚCATEGORYÚcommitÚrowcountro   rp   rq   rr   Úclose)Ú	test_modeÚ	max_pagesr   ÚcurÚtotalr   Útotal_listedÚpnrx   ÚitemrV   rh   r{   r   r[   Úfinal_titleÚ
final_dateÚatt_jsonÚsummaryrv   s                       r   Úcrawlr¢   Ã   sþ  € Ü‹9€DØ
�+‰+‹-€CØ€EØ€FØ€Lä�A�y 1‘}Ó%ó ,ˆÜ! "Ó%ˆØœ˜E›
Ñ"ˆáÚàò "	ˆDØ�u‘+ˆCà�K‰KÐCÀcÀVÔLØ�|‰|Œ~Øä4BÀ3Ó4GÑ1ˆE�8˜W kÙØ˜!‘�ØàÒ0 4¨¡=ˆKØ!Ò1 T¨&¡\ˆJÙFQ”t—z‘z +¸EÕBÐWYˆHÙ(/�w˜t ‘}°[×GÑGÓIˆGÙØ%�ð
Ø—‘œCÜ˜s C¨×):Ñ):Ó)<¸jØ˜W¤h°¼(ð"ô ð —‘”Ø—<‘< !Ò#Ø˜Q‘J�Eò
 à˜A“:ÙðE"	óH ˜ !œÙðY,ð\ 	‡J�J„LÜ	ˆI”i�[Ð
!Ô"Ü	ˆG�E�7˜* V HÐ,<¸\¸NÐ
KÔLÜ	ˆM˜,˜ }°V°HÐ<SÐ
TÔUØ€Løô! ò Ü˜ Q CÐ(¬s¯z©zÕ:Ø˜!‘•ûðús   Ã!AF#Æ#	GÆ,#GÇGÚ__main__z--testÚtestÚfullr‹   r`   )r—   r˜   )!Ú__doc__r�   rA   rq   Útimerl   Úbs4r   Úurllib.parser   r   r’   r“   rk   ÚSITE_IDÚ	MAX_PAGESrm   r‘   r   r    r&   rM   r^   r|   r‡   r¢   Ú__name__ÚargvÚmodeÚmax_prt   ÚisdigitÚint© r   r   ú<module>r³      só   ðá *ß $× $Ó $Ý Ý  à
€Ø$€	Ø€Ø<€Ø
€Ø€	ð DØOØ'ñ€ð-€ò
ò1òò&òRò 'òT-1ð`  Yó 9ðx ˆzÒØ §¡Ñ)‰6¨v€DØ˜’‰A Y€EÙ
ˆ3�8‰8ƒ}�qÒ˜SŸX™X a™[×0Ñ0Ô2Ù�C—H‘H˜Q‘KÓ ˆÙ	�T˜V‘^°Ö6ð r   