Ë
    ì¾jH%  ã                   óÜ   — d 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ddœZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zdd„Zedk(  rdej8                  v Z ee¬«       yy)u*   æ¹˜æ½­å¤©æ˜“ç»�æµŽå¼€å�‘åŒº - æ”¿åŠ¡å…¬å¼€é    N)ÚBeautifulSoup)Úurljoinz/root/search.dbu"   æ¹˜æ½­å¤©æ˜“ç»�å¼€åŒº-æ”¿åŠ¡å…¬å¼€u   æ”¿åŠ¡å…¬å¼€z7http://www.xtx.gov.cn/10115/10116/10474/11535/index.htmzbhttp://www.xtx.gov.cn/xtx/10115/10116/10474/11535/index.jsp?pager.offset={offset}&pager.desc=falseé   i,  z<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36zzh-CN,zh;q=0.9)z
User-Agentz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_xtx.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                 óà  — | j                  dd„ ¬«      D ]  }|j                  «        Œ | j                  dd¬«      D ]  }|j                  «        Œ | j                  d«      D ]  }|j                  «        Œ | j                  dd¬«      D ]  }|j                  «        Œ | j                  d«      D ]m  }|j                  d	«      }t        |«      d
k(  sŒ#|d   j                  ddg«      }t        |«      d
k(  sŒH|d   j                  d¬«      rŒ^|j                  «        Œo | j                  d«      D ]  }|j	                  «        Œ | j                  g d¢«      D ]  }|j                  «        Œ y)z+Remove noise elements from the content div.Údivc                 ó$   — | xr dt        | «      v S )NÚdiv_divr    )Úxs    r   ú<lambda>zclean_noise.<locals>.<lambda>3   s   € °1Ò3L¸ÄcÈ!ÃfÐ9L€ r   )ÚidÚqr_containerÚcanvasÚ	xiangguan©Úclass_r"   Útré   r   ÚtdÚthT©ÚstripÚwbr)ÚscriptÚstyleÚiframeN)Úfind_allÚ	decomposeÚlenÚget_textÚunwrap)Úxl_divr'   Úcr"   ÚrowsÚcellsr8   Útags           r   Úclean_noiserF   0   sV  € ð �‰˜uÑ)LˆÓMò ˆØ�‰�ðð �‰˜u¨ˆÓ8ò ˆØ�‰�ðð �_‰_˜XÓ&ò ˆØ	�‰�ðð �‰˜u¨[ˆÓ9ò ˆØ�‰�ðð —‘ Ó)ò "ˆØ�~‰~˜dÓ#ˆÜˆt‹9˜‹>Ø˜‘G×$Ñ$ d¨D \Ó2ˆEÜ�5‹z˜Q‹ u¨Q¡x×'8Ñ'8¸tÐ'8Õ'DØ—‘Õ!ð"ð �‰˜uÓ%ò ˆØ�
‰
�ðð �‰Ò<Ó=ò ˆØ�‰�ñr   c                 óR  ‡— t        | «       g }t        «       }| j                  g d¢d¬«      D �]f  }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(  r©t        j                  d|j                  dd«      t        j                  «      rt|d   j                  «       }
|j                  d¬«      xs |
j!                  d«      d   }|
j                  d	«      st        ||
«      n|
}|j                  d|› d|› d�«       �Œ»|j
                  dk(  r[|j                  dd¬«      Š‰s�Œág d¢}t#        ˆfd„|D «       «      r�Œût        j$                  dd‰«      Š|j                  ‰«       �Œ%|j                  dd¬«      Š‰s�Œ<g d¢}t#        ˆfd„|D «       «      r�ŒV|j                  ‰«       �Œi dj'                  |«      S )N)Úpr"   ÚimgÚaÚh1Úh2Úh3Úh4T)Ú	recursiver"   rI   Úsrcr   ÚaltÚhttpz![ú](ú)z![](rJ   ú"\.(pdf|doc|docx|xls|xlsx|zip|rar)$Úhrefr6   ú/éÿÿÿÿú[rH   ú )õ	   æ‰«ä¸€æ‰«õ   ç›¸å…³è§£è¯»õ   è¯¦ç»†å†…å®¹ï¼šè¯·u   è¯¦ç»†å†…å®¹ï¼šè¯·ä¸‹è½½é™„ä»¶c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­w©N© ©Ú.0rH   Útxts     €r   ú	<genexpr>z"extract_content.<locals>.<genexpr>l   ó   øè ø€ Ò6 A�q˜C”xÑ6ùó   ƒz[^\S\n]+)r[   r\   r]   c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wr_   r`   ra   s     €r   rd   z"extract_content.<locals>.<genexpr>t   re   rf   ú

)rF   Úsetr<   r,   ÚaddÚnamer%   Úappendr   Ú
startswithr   ÚreÚsearchÚIr7   r?   ÚsplitÚanyÚsubÚjoin)rA   Ú
detail_urlÚpartsÚ	processedÚelÚmdrP   rQ   Úfull_srcÚsub_imgrV   rk   Úfull_urlÚskip_phrasesrc   s                 @r   Úextract_contentr~   M   sO  ø€ Ü�ÔØ€EÜ“€Ià�o‰oÒPÐ\`ˆoÓaó $"ˆÜˆ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˜Š^¤§	¡	Ð*OÐQS×QWÑQWÐX^Ð`bÓQcÔeg×eiÑeiÔ jØ�f‘:×#Ñ#Ó%ˆDØ—;‘; T�;Ó*ÒA¨d¯j©j¸«o¸bÑ.AˆDØ8<¿¹ÈÔ8O”w˜z¨4Ô0ÐUYˆHØ�L‰L˜1˜T˜F " X J¨aÐ0Ö1Ø�W‰W˜Š^Ø—+‘+˜c¨�+Ó.ˆCÛÚt�ÜÓ6¨Ô6Ô6ÙÜ—f‘f˜[¨#¨sÓ3�Ø—‘˜SÖ!à—+‘+˜c¨�+Ó.ˆCÛÚR�ÜÓ6¨Ô6Ô6ÙØ—‘˜SÖ!ðI$"ðL �;‰;�uÓÐr   c                 óŠ  ‡— g }| j                  d«      D ]«  }|d   j                  «       }t        j                  d|t        j                  «      sŒ<|j                  d¬«      xs |j                  d«      d   }|j                  d«      st        ||«      n|Št        ˆfd	„|D «       «      rŒ˜|j                  |‰d
œ«       Œ­ |S )Nzdiv.xl-xqnr a[href]rV   rU   Tr6   rW   rX   rR   c              3   ó.   •K  — | ]  }|d    ‰k(  –— Œ y­w)ÚurlNr`   )rb   Úaar|   s     €r   rd   z&extract_attachments.<locals>.<genexpr>ƒ   s   øè ø€ Ò?¨R�2�e‘9 Õ(Ñ?ùs   ƒ)rk   r�   )Úselectr7   rn   ro   rp   r?   rq   rm   r   rr   rl   )Úsoupru   ÚattachmentsrJ   rV   rk   r|   s         @r   Úextract_attachmentsr†   {   s°   ø€ Ø€KØ�[‰[Ð.Ó/ò @ˆØ�‰y�‰Ó ˆÜ�y‰yÐ>ÀÄbÇdÁdÔKØØ�z‰z ˆzÓ%Ò<¨¯©°C«¸Ñ)<ˆØ48·O±OÀFÔ4K”7˜: tÔ,ÐQUˆÜÓ?°;Ô?Õ?Ø×Ñ¨°XÑ>Õ?ð@ð Ðr   c                 ób  — 	 t        j                  | t        d¬«      }|j                  «        t        |«      }t        |d«      }g }|j                  dd¬«      }|sB|j                  d	«      }|st        d
t        j                  ¬«       g S |j                  d«      }n&|j                  d	«      xs |}|j                  d«      }|D ]­  }	|	j                  d«      }
t        |
«      dk  rŒ#|
d   j                  dd¬«      }|sŒ<|d   j                  «       }|j                  dd«      xs |j                  d¬«      }|sŒx|
d   j                  d¬«      }t        | |«      }|j!                  |||dœ«       Œ¯ |S # t        $ r-}t        d| › d|› �t        j                  ¬«       g cY d }~S d }~ww xY w)Né   ©r   Útimeoutz  [ERR] z: ©Úfileúhtml.parserr"   r0   Útbodyz  [WARN] no table/tbody foundr2   r4   é   r3   rJ   T)rV   rV   Útitler   r6   é   )r�   r�   Údate)Úrequestsr   ÚHEADERSÚraise_for_statusÚ	ExceptionÚprintÚsysÚstderrr   r   Úfindr<   r>   r7   r?   r   rl   )r�   r   ÚeÚhtmlr„   Úitemsr"   rŽ   rC   r2   ÚtdsÚa_tagrV   r�   Údate_strr|   s                   r   Úextract_list_pager¡   ˆ   s˜  € ðÜ�L‰L˜¤g°rÔ:ˆØ	×ÑÔô �q‹>€DÜ˜˜}Ó-€DØ€Eà�I‰I�g gˆIÓ.€EÙØ—	‘	˜'Ó"ˆÙÜÐ1¼¿¹ÕDØˆIØ�~‰~˜dÓ#‰à—
‘
˜7Ó#Ò, uˆØ�~‰~˜dÓ#ˆàò JˆØ�k‰k˜$ÓˆÜˆs‹8�aŠ<ØØ�A‘—‘˜C d�Ó+ˆÙØØ�V‰}×"Ñ"Ó$ˆØ—	‘	˜' 2Ó&ÒD¨%¯.©.¸t¨.Ó*DˆÙØØ�q‘6—?‘?¨�?Ó.ˆÜ˜3 Ó%ˆØ�‰˜u¨X¸xÑHÕIðJð €LøôC ò Ü�˜˜˜R ˜sÐ#¬#¯*©*Õ5Ø�	ûðús   ‚,E8 Å8	F.Æ"F)Æ#F.Æ)F.c                 óˆ  — 	 t        j                  | t        d¬«      }|j                  dk(  rd d d g fS |j	                  «        t        |«      }d|d d v sd|v rd d d g fS t        |d«      }|j                  d«      }|r|j                  d	¬
«      nd}d}|j                  d«      }|rU|j                  d«      }	|	D ]?  }
|
j                  d	¬
«      }t        j                  d|«      }|sŒ.|j                  d«      } n |j                  dd¬«      }d}|rt        || «      }t        || «      }t!        |j#                  «       «      dk  rVd|xs | j%                  d«      d   › d| › d�}|r3|D �cg c]  }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c c}w )Nrˆ   r‰   i”  Ú404iô  zPage Not Foundr�   rL   Tr6   r   Úh6Úspanz(\d{4}-\d{2}-\d{2})r3   r'   zxl-xqnrr0   é   rY   rW   rX   rS   rT   u
   é™„ä»¶ï¼š[rk   r�   rh   )r“   r   r”   Ústatus_coder•   r–   r   r   rš   r?   r<   rn   ro   Úgroupr~   r†   r>   r7   rq   rt   )r�   r   r›   rœ   r„   rL   r�   r    r¤   Úspansr¥   rc   ÚmÚxlr   r…   ÚfallbackrJ   Úattach_linkss                      r   Úextract_detailr®   °   sò  € ð$Ü�L‰L˜¤g°rÔ:ˆØ�=‰=˜CÒØ˜˜t RÐ'Ð'Ø	×ÑÔô �q‹>€DØ��T�c�
ÑÐ.°$Ñ6Ø�T˜4 Ð#Ð#ä˜˜}Ó-€Dà	�‰�4‹€BÙ')ˆB�K‰K˜dˆKÔ#¨r€Eà€HØ	�‰�4‹€BÙ	Ø—‘˜FÓ#ˆØò 	ˆDØ—-‘- d�-Ó+ˆCÜ—	‘	Ð0°#Ó6ˆAÚØŸ7™7 1›:�Ùð	ð 
�‰�5 ˆÓ	+€BØ€GÙ	Ü! " cÓ*ˆä% d¨CÓ0€Kä
ˆ7�=‰=‹?Ó˜bÒ Ø�uÒ2 §	¡	¨#£¨rÑ 2Ð3°2°c°U¸!Ð<ˆÙØKVÖWÀa˜j¨¨6©¨°2°a¸±h°Z¸qÒAÐWˆLÐWØ˜ §¡¨\Ó!:Ñ:Ñ:ˆHØˆà�(˜G [Ð0Ð0øôK ò $Ø�T˜4 Ð#Õ#ûð$üòB Xs(   ‚0F# ³F# Å,F?Æ#	F<Æ,F7Æ1F<Æ7F<c                 ó°  — t        «       }|j                  «       }d}d}d}t        «       }dgt        t	        t
        t        dz   t
        «      «      z   }t        |«      D �]„  \  }}	|	dk(  rt        }
nt        j                  |	¬«      }
t        |
«      }|t        |«      z  }t        d|dz   › d|	› dt        |«      › d�«       |s �n |D �]  }|d   }||v rŒ|j                  |«       |j                  d	|f«       |j!                  «       rŒCt#        |«      \  }}}}|s|dz  }Œ[|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
«       |j1                  «        |j2                  dkD  r|dz  }| s�Œ|dk\  s�Œ n | s�Œ~|dk\  s�Œ… n |j;                  «        t        dt,        › �«       t        d|› d|› d|› �«       |S # t4        $ r-}t        d|› �t6        j8                  ¬«       |dz  }Y d }~Œ…d }~ww xY w)Nr   r3   )Úoffsetz  Page z	 (offset=z): z itemsr�   z)SELECT id FROM gov_raw WHERE page_url = ?r�   r’   F)Úensure_asciir   éÈ   z  DB error: r‹   é   z
[DONE] z  New: z
, Errors: z, Listed total: )r   Úcursorri   ÚlistÚrangeÚSTEPÚ
MAX_OFFSETÚ	enumerateÚBASE_URLÚ
OFFSET_URLÚformatr¡   r>   r—   rj   r
   Úfetchoner®   ÚjsonÚdumpsr7   ÚSQLÚ	SITE_NAMEÚCATEGORYÚcommitÚrowcountr–   r˜   r™   Úclose)Ú	test_moder   ÚcurÚtotalr   Útotal_listedÚvisited_urlsÚoffsetsÚidxr°   r�   r�   ÚitemÚur�   r    r   r…   Úfinal_titleÚ
final_dateÚatt_jsonÚsummaryr›   s                          r   ÚcrawlrÓ   Þ   se  € Ü‹9€DØ
�+‰+‹-€CØ€EØ€FØ€LÜ“5€Làˆc”Dœœt¤Z°!¡^´TÓ:Ó;Ñ;€Gä  Ó)ó 1‰ˆˆVØ�QŠ;Ü‰Cä×#Ñ#¨6Ð#Ó2ˆCÜ! #Ó&ˆØœ˜E›
Ñ"ˆÜ�˜˜a™�y 	¨&¨°´S¸³Z°LÀÐGÔHáÚàó #	ˆDØ�U‘ˆAØ�LÑ ØØ×Ñ˜QÔà�K‰KÐCÀaÀTÔJØ�|‰|Œ~Øä4BÀ1Ó4EÑ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Ü˜q ! [×%6Ñ%6Ó%8¸*Ø˜W¤h°¼(ð"ô ð —‘”Ø—<‘< !Ò#Ø˜Q‘J�Eó
 ˜U aœZÙðG#	óH ˜ !œÙðc1ðf 	‡J�J„LÜ	ˆI”i�[Ð
!Ô"Ü	ˆG�E�7˜* V HÐ,<¸\¸NÐ
KÔLØ€Løô ò Ü˜ Q CÐ(¬s¯z©zÕ:Ø˜!‘•ûðús   Å-AHÈ	IÈ(#IÉIÚ__main__z--test)rÆ   )F)Ú__doc__r¾   rn   r˜   r“   Úbs4r   Úurllib.parser   r	   rÁ   rÂ   rº   r»   r·   r¸   r”   rÀ   r   r   r%   rF   r~   r†   r¡   r®   rÓ   Ú__name__ÚargvÚtestr`   r   r   ú<module>rÛ      s¥   ðá 0ß × Ý Ý  à
€Ø0€	Ø€ØD€Øq€
Ø	€Ø€
ð QØ'ñ€ð
-€ò
ò1òòò:+ò\
ò%òP+1ó\@ðF ˆzÒØ�s—x‘xÐ€DÙ	�DÖð r   