Ë
    ÉÚµj2  ã                   óð   — 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dlmZ dZdZdZd	Zd
ZdZdZd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d„ Zd„ Z e!dk(  r e «        yy)uš  
Crawler for çŸ³å¤§èƒœå�Žæ–°æ��æ–™é›†å›¢ - ä¿¡æ�¯å…¬å¼€ (Enterprise)
CMS: Custom PHP (Yunyou Network)
List: div.newslist > h3 > a[href], p.newslisttime (YYYY.MM.DD)
Pagination: list.php?catid=65&page=N, 6/page, ~29 pages
Detail: div.newsshowc content, title from div.newsshowt h3

Usage:
    python3 crawl_sinodmc_xxgk.py             # Full crawl
    python3 crawl_sinodmc_xxgk.py --max-pages 1  # Incremental
é    N)Údatetime)ÚBeautifulSoup)Úurljoinz/root/search.dbu(   çŸ³å¤§èƒœå�Žæ–°æ��æ–™é›†å›¢-ä¿¡æ�¯å…¬å¼€u   ä¿¡æ�¯å…¬å¼€u   ä¼�ä¸š-å±±ä¸œzhttps://www.sinodmc.comz)https://www.sinodmc.com/list.php?catid=65é   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,en;q=0.8)z
User-AgentÚAcceptzAccept-Language)u   ã€�æ‰“å�°æœ¬é¡µã€‘u   ã€�å…³é—­çª—å�£ã€‘u   æ‰“å�°æœ¬é¡µu   å…³é—­çª—å�£u   è½¬è½½åˆ†äº«ï¼šu   æµ�è§ˆé‡�ï¼šu   ç›¸å…³é™„ä»¶ï¼šu   ç›¸å…³ç¨¿ä»¶ï¼šu   æ‰«ä¸€æ‰«åœ¨æ‰‹æœºæ‰“å¼€u	   é™„ä»¶ï¼šu   ç´¯è®¡æ¬¡æ•°ï¼šc                 óD  — g }| j                   D �]p  }t        |t        «      r%|j                  «       }|sŒ'|j	                  |«       Œ9|j
                  dk(  rp|j                  dd«      j                  «       }|j                  d¬«      }|r'|r%t        ||«      }|j	                  d|› d|› d�«       Œ£|sŒ¦|j	                  |«       Œ¸|j
                  d	k(  rR|j                  d
d«      }|sŒÜ|j                  dd«      }	t        ||«      }
|j	                  |	rd|
› d�nd|
› d�«       �Œ|j
                  dk(  r|j	                  d«       �Œ;t        |d«      s�ŒI|j                  dd¬«      }|s�Œ`|j	                  |«       �Œs dj                  |«      j                  «       S )NÚaÚhrefÚ T©Ústripú<p><a href="ú">ú</a></p>ÚimgÚsrcÚaltõ   ">æŸ¥çœ‹å›¾ç‰‡</a></p>Úbrú
Úget_textú )ÚchildrenÚ
isinstanceÚstrr   ÚappendÚnameÚgetr   r   ÚhasattrÚjoin)Úp_tagÚ
detail_urlÚpartsÚelemÚtr
   ÚtextÚfullr   r   Úfull_srcs              ú'/root/gov_crawler/crawl_sinodmc_xxgk.pyÚrender_paragraphr*   ,   sv  € Ø€EØ—‘ó  ˆÜ�dœCÔ Ø—
‘
“ˆAÚØ—‘˜Q•Ø�Y‰Y˜#ÒØ—8‘8˜F BÓ'×-Ñ-Ó/ˆDØ—=‘= t�=Ó,ˆDÙ™Ü˜z¨4Ó0�Ø—‘˜|¨D¨6°°D°6¸ÐBÕCÚØ—‘˜TÕ"Ø�Y‰Y˜%ÒØ—(‘(˜5 "Ó%ˆCÚØ—h‘h˜u bÓ)�Ü" :¨sÓ3�Ø—‘ÑPS˜|¨H¨:Ð5KÑLÐ[gÐhpÐgqð  rHð  ZIö  JØ�Y‰Y˜$ÒØ�L‰L˜ÖÜ�T˜:Ö&Ø—‘˜c¨�Ó.ˆAÛØ—‘˜Q–ð1 ð2 �8‰8�E‹?× Ñ Ó"Ð"ó    c                 óÊ   — g }| j                  d«      D ]L  }t        |«      }t        |j                  d¬«      «      dk\  r|j	                  |«       |j                  «        ŒN |S )z>Extract <table> elements as raw HTML. Remove from content_div.ÚtableTr   é   )Úfind_allr   Úlenr   r   Ú	decompose)Úcontent_divr"   Útablesr-   Ú
table_htmls        r)   Úextract_tables_as_htmlr5   J   s_   € à€FØ×%Ñ% gÓ.ò ˆÜ˜“Zˆ
Üˆu�~‰~ Dˆ~Ó)Ó*¨bÒ0Ø�M‰M˜*Ô%Ø�‰Õð	ð
 €Mr+   c                 óö   — g }| j                  d«      D ]b  }|j                  dd«      }|sŒt        ||«      }|j                  dd«      }|j                  |rd|› d�nd|› d�«       |j	                  «        Œd |S )Nr   r   r   r   r   r   )r/   r   r   r   r1   )r2   r"   Úimgsr   r   r(   r   s          r)   Úextract_imagesr8   U   s’   € Ø€DØ×#Ñ# EÓ*ò ˆØ�g‰g�e˜RÓ ˆÚÜ˜z¨3Ó/ˆHØ—'‘'˜% Ó$ˆCØ�K‰KÉ3˜, x jÐ0FÑGÐVbÐckÐblð  mCð  UDô  EØ�M‰M�Oðð €Kr+   c                 óJ  ‡— g }| j                  ddg«      D ]  }|j                  «        Œ t        | |«      }t        | |«      }t	        | j
                  «      D �]u  }|j                  €Œ|j                  j                  «       }|dk(  �rÛ|j                  d«      rŒCdŠ|j
                  D �]U  }t        |t        «      r|j                  «       }	|	sŒ'‰|	dz   z  ŠŒ0|j                  dk(  r1|j                  d«      rŒQ|j                  dd¬	«      }	|	sŒg‰|	dz   z  ŠŒp|j                  d
k(  r‰dz  ŠŒ…|j                  dk(  rM|j                  dd«      }
|j                  d¬	«      }|
r|rt        ||
«      }‰d|› d|› d�z  ŠŒÕ|sŒØ‰|dz   z  ŠŒá|j                  dk(  rG|j                  dd«      }|s�Œ|j                  dd«      }t        ||«      }‰|rd|› d�nd|› d�z  Š�Œ7|j                  dd¬	«      }	|	s�ŒN‰|	dz   z  Š�ŒX t!        j"                  dd‰«      j                  «       Š‰s�ŒÓt%        ˆfd„t&        D «       «      r�Œí|r
‰|d   k7  s�Œù|j)                  ‰«       �Œ|dk(  s�Œ|j                  dd¬«      D ]M  }|j                  dd¬	«      Š‰sŒt%        ˆfd„t&        D «       «      rŒ2|r	‰|d   k7  sŒ=|j)                  ‰«       ŒO �Œx dj+                  |«      }|r|ddj+                  |«      z   z  }|r|ddj+                  |«      z   z  }|j                  «       S )NÚscriptÚstyleÚpr-   r   r   ÚspanTr   r   r   r	   r
   r   r   z	</a></p> r   r   r   u   ">æŸ¥çœ‹å›¾ç‰‡</a></p> ú\s+c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­w©N© ©Ú.0ÚskÚtxts     €r)   ú	<genexpr>z"extract_content.<locals>.<genexpr>—   s   øè ø€ Ò>¨R˜r SœyÑ>ùó   ƒéÿÿÿÿÚdivF)Ú	recursivec              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wr@   rA   rB   s     €r)   rF   z"extract_content.<locals>.<genexpr>ž   s   øè ø€ Ò"B° 2¨¤9Ñ"BùrG   ú

)r/   r1   r5   r8   Úlistr   r   ÚlowerÚfind_parentr   r   r   Úfindr   r   r   ÚreÚsubÚanyÚ
SKIP_TEXTSr   r    )r2   r"   r#   ÚsÚtable_htmlsÚ	img_linesÚchildÚtnrR   r%   r
   r&   r'   r   r   r(   ÚresultrE   s                    @r)   Úextract_contentr[   a   s  ø€ Ø€Eà×!Ñ! 8¨WÐ"5Ó6ò ˆØ	�‰�ðô )¨°jÓA€KÜ˜{¨JÓ7€Iä�k×*Ñ*Ó+ó 6*ˆØ�:‰:ÐØØ�Z‰Z×ÑÓˆà�‹9à× Ñ  Ô)ØØˆCà—~‘~ó '�Ü˜c¤3Ô'ØŸ	™	›�AÚØ˜q 3™w™™Ø—X‘X Ò'à—x‘x Ô(Ø ØŸ™ S°˜Ó5�AÚØ˜q 3™w™™Ø—X‘X Ò%Ø˜4‘K‘CØ—X‘X ’_ØŸ7™7 6¨2Ó.�DØŸ<™<¨d˜<Ó3�DÙ¡Ü& z°4Ó8˜Ø ¨d¨V°2°d°V¸9ÐEÑE™ÚØ˜t c™zÑ)™Ø—X‘X Ò&ØŸ'™' %¨Ó,�CÛØ!Ÿg™g e¨RÓ0˜Ü#*¨:°sÓ#;˜ØÑSV ¨h¨ZÐ7NÑOÐ^jÐksÐjtð  uLð  ]Mñ  MšàŸ™ S°˜Ó5�AÛØ˜q 3™w™šð?'ôB —&‘&˜  cÓ*×0Ñ0Ó2ˆCÛœ3Ó>´:Ô>Ö>Ù  u¨R¡yÔ 0Ø—L‘L Ö%à�5Œ[Ø—~‘~ c°U�~Ó;ò *�Ø—l‘l 3¨d�lÓ3�ÚœsÓ"B´zÔ"BÕBÙ  C¨5°©9Ó$4ØŸ™ SÕ)ò	*ðe6*ðp �[‰[˜Ó€FÙØ�&˜6Ÿ;™; {Ó3Ñ3Ñ3ˆÙØ�&˜6Ÿ;™; yÓ1Ñ1Ñ1ˆà�<‰<‹>Ðr+   c                 ó„  — g }t        «       }| j                  dd¬«      D ]�  }|d   }t        j                  d|t        j                  «      sŒ.t        ||«      }|j                  d¬«      xs& |j                  d«      d   j                  d	«      d
   }||vsŒy|j                  |«       |j                  ||dœ«       ŒŸ |S )Nr	   T)r
   r
   z&\.(pdf|doc|docx|xls|xlsx|rar|zip|txt)$r   ú/rH   ú?r   )r   Úurl)
Úsetr/   rQ   ÚsearchÚIr   r   ÚsplitÚaddr   )Úsoupr"   ÚattsÚseenr	   r
   Úfull_urlr   s           r)   Úextract_attachmentsri   ­   s²   € Ø€DÜ‹5€DØ�]‰]˜3 Tˆ]Ó*ò =ˆØ�‰yˆÜ�9‰9Ð>ÀÄbÇdÁdÕKÜ˜z¨4Ó0ˆHØ—:‘: D�:Ó)ÒN¨T¯Z©Z¸«_¸RÑ-@×-FÑ-FÀsÓ-KÈAÑ-NˆDØ˜tÒ#Ø—‘˜Ô"Ø—‘ T°(Ñ;Õ<ð=ð €Kr+   c                 óð  — 	 t        j                  | t        d¬«      }d|_        t        |j                  d«      }d}|j                  d	«      }|r|j                  d
¬«      }d}|j                  d«      }|r7t        j                  d|j                  «       «      }|r|j                  d«      }|j                  dd¬«      }	t!        || «      }
|	rt#        |	| «      }nd}t%        |j'                  «       «      dk  rŒd| › d|› d�}|j)                  d«      }g }|D ]R  }|j                  dd«      }|sŒt+        | |«      }|j                  dd«      }|j-                  |rd|› d�nd|› d�«       ŒT |r|ddj/                  |«      z   z  }|
r-|
D ](  }d|d   › d|d   › d�}||vsŒ|d|d   › d|d   › d�z  }Œ* ||||
fS # t        $ r1}t        d| › d|› �t        j                  ¬«       d d d g fcY d }~S d }~ww xY w) Né   ©ÚheadersÚtimeoutúutf-8z  fetch_detail error ú: ©Úfileúhtml.parserr   zdiv.newsshowt h3Tr   zdiv.newsshowt pu"   æ—¶é—´[ï¼š:]\s*(\d{4}-\d{2}-\d{2})é   rI   Ú	newsshowc©Úclass_r   r   r   r   r   r   r   rL   ú[r   z](r_   ú)u   

é™„ä»¶ï¼š[)Úrequestsr   ÚHEADERSÚencodingÚ	ExceptionÚprintÚsysÚstderrr   r&   Ú
select_oner   rQ   ra   ÚgrouprP   ri   r[   r0   r   r/   r   r   r    )r_   ÚrÚere   ÚtitleÚh3Údate_strÚp_timeÚmr2   ÚattachmentsÚcontentr7   rW   r   r   r(   r   r	   Úinline_markers                       r)   Úfetch_detailr�   ½   sH  € ð$Ü�L‰L˜¤g°rÔ:ˆØˆŒ
ô
 ˜Ÿ™ Ó/€Dð €EØ	�‰Ð+Ó	,€BÙ	Ø—‘ $�Ó'ˆð €HØ�_‰_Ð.Ó/€FÙÜ�I‰IÐ;¸V¿_¹_Ó=NÓOˆÙØ—w‘w˜q“zˆHð —)‘)˜E¨+�)Ó6€Kä% d¨CÓ0€KáÜ! +¨sÓ3‰àˆô ˆ7�=‰=‹?Ó˜bÒ Ø    R¨ w¨hÐ7ˆØ�}‰}˜UÓ#ˆØˆ	Øò 	NˆCØ—'‘'˜% Ó$ˆCÚÜ" 3¨Ó,�Ø—g‘g˜e RÓ(�Ø× Ñ ÑTW <°¨zÐ9OÑ!PÐ_kÐltÐkuð  vLð  ^Mõ  Nð	Nñ Ø�v §¡¨IÓ 6Ñ6Ñ6ˆGñ Øò 	EˆAØ  &¡	˜{¨"¨Q¨u©X¨J°aÐ8ˆMØ GÒ+Ø˜^¨A¨f©I¨;°b¸¸5¹¸
À!ÐDÑD‘ð	Eð
 �(˜G [Ð0Ð0øôg ò $ÜÐ% c U¨"¨Q¨CÐ0´s·z±zÕBØ�T˜4 Ð#Õ#ûð$ús   ‚#F; Æ;	G5Ç&G0Ç*G5Ç0G5c                 ó   — t         › d| › �S )Nz&page=)ÚLIST_URL)Úpage_nums    r)   Úget_list_urlr‘   ù   s   € ÜˆZ�v˜h˜ZÐ(Ð(r+   c                 óH  — t        | «      }	 t        j                  |t        d¬«      }d|_        |j                  dk7  r-t        d| › d	|j                  › �t        j                  ¬«       g S t        |j                  d
«      }g }|j                  dd¬«      D ]Ï  }|j                  d«      }|r|j                  d«      sŒ(|d   j                  «       }|j                  dd«      j                  «       xs |j                  d¬«      }	t!        ||«      }
|j                  dd¬«      }|r|j                  d¬«      nd}|j#                  dd«      }|	sŒ¹|
sŒ¼|j%                  |	|
|f«       ŒÑ |S # t
        $ r-}t        d|› d|› �t        j                  ¬«       g cY d }~S d }~ww xY w)Nrk   rl   ro   z  Error fetching rp   rq   éÈ   ú  Page z: HTTP rs   rI   Únewslistrv   r	   r
   r…   r   Tr   r<   Únewslisttimeú.ú-)r‘   rz   r   r{   r|   r}   r~   r   r€   Ústatus_coder   r&   r/   rP   r   r   r   Úreplacer   )r�   r_   rƒ   r„   re   ÚitemsÚnewsdivr	   r
   r…   Úpage_urlÚtime_pr‡   s                r)   Úextract_list_pagerŸ   ý   s|  € Ü
�xÓ
 €CðÜ�L‰L˜¤g°rÔ:ˆØˆŒ
ð
 	‡}�}˜ÒÜ�˜�z ¨¯©¨Ð8¼s¿z¹zÕJØˆ	ä˜Ÿ™ Ó/€DØ€Eà—=‘= ¨z�=Ó:ò 6ˆØ�L‰L˜ÓˆÙ˜Ÿ™˜fœØà�‰y�‰Ó ˆØ—‘�g˜rÓ"×(Ñ(Ó*ÒD¨a¯j©j¸t¨jÓ.DˆÜ˜3 Ó%ˆð —‘˜c¨.�Ó9ˆÙ28�6—?‘?¨�?Ô.¸bˆà×#Ñ# C¨Ó-ˆâ’XØ�L‰L˜% ¨8Ð4Õ5ð!6ð$ €Løô; ò ÜÐ! #  b¨¨Ð,´3·:±:Õ>Ø�	ûðús   �#E+ Å+	F!Å4"FÆF!ÆF!c                  ó€   — t        j                  t        d¬«      } | j                  d«       | j                  d«       | S )Né<   )rn   zPRAGMA journal_mode=WALzPRAGMA busy_timeout=5000)Úsqlite3ÚconnectÚDB_PATHÚexecute)Úconns    r)   Úinit_dbr§   $  s1   € Ü�?‰?œ7¨BÔ/€DØ‡L�LÐ*Ô+Ø‡L�LÐ+Ô,Ø€Kr+   c                 ó‚  — |r|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)
Nr>   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: rq   )rQ   rR   r   ÚjsonÚdumpsr¥   Ú	SITE_NAMEÚCATEGORYÚGROUPÚrowcountr}   r~   r   r€   )
r¦   r…   r�   Úpublish_dater‹   rŠ   ÚsummaryÚatt_jsonÚcurr„   s
             r)   Úsave_articler´   +  s®   € Ù ‰g e€GÜ�f‰f�V˜S 'Ó*×0Ñ0Ó2€GÙ>IŒt�z‰z˜+°EÕ:Èt€HðØ�l‰lð8ô ˜ (¨E¯K©K«M¸<Ø�gœx¨´5ð:ó	
ˆð �|‰|˜aÑÐøÜò Ü�˜Q˜CÐ ¤s§z¡zÕ2Üûðús   ÁAB Â	B>ÂB9Â9B>c            
      óf  — t         } t        t        j                  «      dkD  r	 t	        t        j                  d   «      } t        dt        › d| › �t        j                  ¬«       t        «       }d}d}|j                  «        t        dt        › �t        j                  ¬«       t        d| dz   «      D �]K  }t        |«      }|s"t        d	|› d
�t        j                  ¬«        �n|t        |«      z  }|D ]Ø  \  }}}|r*|dk  r%t        d|› d|d d › �t        j                  ¬«       Œ3|j                  d|f«      }	|	j                  «       rŒWt        |«      \  }
}}}|
xs |}|xs |}|xs	 d|› d|› d�}|xs g }t!        ||||||«      r.|dz  }|dk  r$t        d|› d|d d › �t        j                  ¬«       t#        j$                  d«       ŒÚ t        d	|› dt        |«      › d|› d�t        j                  ¬«       �ŒN |j                  «        |j'                  «        t        d|› d|› �t        j                  ¬«       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 �Œow xY w)Nrt   )z--max-pagesé   z	Scraping z, max pages: rq   r   z  Cleared old data for r”   z: 0 articles (end)z
2020-01-01z  Skip old: r   é(   z)SELECT id FROM gov_raw WHERE page_url = ?r   r   r   é   z  + é2   g333333Ó?rp   z found, z totalz
Done! Found: z, New: )Ú	MAX_PAGESr0   r   ÚargvÚintÚ
ValueErrorr~   r¬   r€   r§   ÚcommitÚrangerŸ   r¥   Úfetchoner�   r´   ÚtimeÚsleepÚclose)Ú	max_pagesr¦   Ú	total_newÚtotal_foundÚpnÚarticlesr…   r�   Údater³   Ú	det_titleÚdet_dateÚdet_contentÚdet_attsÚfinal_titleÚ
final_dateÚfinal_contentÚ
final_attss                     r)   ÚmainrÒ   ?  sƒ  € Ü€IÜ
Œ3�8‰8ƒ}�qÒð	ÜœCŸH™H Q™KÓ(ˆIô 
ˆI”i�[ ¨i¨[Ð
9ÄÇ
Á
ÕKÜ‹9€DØ€IØ€Kð 	‡K�K„MÜ	Ð#¤I ;Ð
/´c·j±jÕAä�A�y 1‘}Ó%ó YˆÜ$ RÓ(ˆÙÜ�G˜B˜4Ð1Ð2¼¿¹ÕDÚà”s˜8“}Ñ$ˆà%-ò 	Ñ!ˆE�8˜TÙ˜˜|Ò+Ü˜ T F¨!¨E°#°2¨J¨<Ð8¼s¿z¹zÕJØð —,‘,ÐJÈXÈKÓXˆCØ�|‰|Œ~Øä9EÀhÓ9OÑ6ˆI�x ¨hØ#Ò, uˆKØ!Ò) TˆJØ'Ò[¨\¸(¸À2ÀkÀ]ÐRZÐ+[ˆMØ!š RˆJä˜D +¨x¸À]ÐT^Ô_Ø˜Q‘�	Ø ’>Ü˜D  ¨A¨k¸#¸2Ð.>Ð-?Ð@ÄsÇzÁzÕRä�J‰J�s�Oð+	ô. 	�˜�t˜2œc (›m˜_¨H°Y°K¸vÐFÌSÏZÉZ×Xð?YðB 	‡K�K„MØ‡J�J„LÜ	ˆO˜K˜=¨°	¨{Ð
;Ä#Ç*Á*ÖMøôi ò 	Ü�x‰x˜‰{Ð.Ñ.´3´s·x±x³=À1Ò3DðÜ #¤C§H¡H¨Q¡KÓ 0‘IøÜ!ò Ùðýð		ús5   ¤I É:J0Ê JÊJ0Ê	J)Ê&J0Ê(J)Ê)J0Ê/J0Ú__main__)"Ú__doc__rz   rQ   rª   r¢   rÁ   Úosr   r   Úbs4r   Úurllib.parser   r¤   r¬   r­   r®   ÚBASE_URLr�   rº   r{   rT   r*   r5   r8   r[   ri   r�   r‘   rŸ   r§   r´   rÒ   Ú__name__rA   r+   r)   ú<module>rÚ      s¯   ðñ
÷ 2× 1× 1Ó 1Ý Ý Ý  à
€Ø6€	Ø€Ø€Ø$€Ø6€Ø€	ð DØOØ0ñ€ò€
ò#ò<ò	òGòXò 71òx)ò"òNòò(9Nðx ˆzÒÙ…Fð r+   