Ë
    9JŠ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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)uJ  
Crawler for å¹¿ä¿¡åŒºäººæ°‘æ”¿åºœ - é€šçŸ¥å…¬å‘Š
CMS: PowerCMS + UCAPCONTENT
List: ul.infoList > li > span.date + a[href]
Pagination: list.shtml (page1), list_{N}.shtml (page N, N=2..41), 10/page, ~41 pages

Usage:
    python3 crawl_srx_tzgg.py             # Full crawl
    python3 crawl_srx_tzgg.py --max-pages 1  # Incremental
é    N)Údatetime)ÚBeautifulSoup)Úurljoinz/root/search.dbu"   å¹¿ä¿¡åŒºäººæ°‘æ”¿åºœ-é€šçŸ¥å…¬å‘Šu   é€šçŸ¥å…¬å‘Šu   æ±Ÿè¥¿zhttp://www.srx.gov.cnz)http://www.srx.gov.cn/srx/tzgg/list.shtmlé)   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-Languagec                 ó   — t        | «      S )u'   ä¿�ç•™ HTML è¡¨æ ¼ç»“æž„ï¼ˆä¸�è½¬ mdï¼‰)Ústr)ÚtableÚargsÚkwargss      ú#/root/gov_crawler/crawl_srx_tzgg.pyÚtable_to_mdr   $   s   € äˆu‹:Ðó    c                 ó  — g }t        «       }| j                  D �]\  }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(  r`|j                  d
d«      }	|	sŒÜ|	|v rŒá|j                  |	«       |j                  dd«      }
t        ||	«      }|j                  d|› d�«       �Œ't        |d«      s�Œ5|j                  dd¬«      }|s�ŒL|j                  |«       �Œ_ dj                  |«      S )NÚaÚhrefÚ T©Ústripú	<a href="ú">z</a>ÚimgÚsrcÚaltõ   ">æŸ¥çœ‹å›¾ç‰‡</a>Úget_textú )ÚsetÚcontentsÚ
isinstancer	   r   ÚappendÚnameÚgetr   r   ÚaddÚhasattrÚjoin)Úp_tagÚ
detail_urlÚpartsÚ	seen_imgsÚelemÚtr   ÚtextÚfullr   r   Úfull_srcs               r   Úrender_paragraphr0   (   sV  € Ø€EÜ“€IØ—‘ó  ˆÜ�dœCÔ Ø—
‘
“ˆAÚØ—‘˜Q•Ø�Y‰Y˜#ÒØ—8‘8˜F BÓ'×-Ñ-Ó/ˆDØ—=‘= t�=Ó,ˆDÙ™Ü˜z¨4Ó0�Ø—‘˜y¨¨¨b°°°dÐ;Õ<ÚØ—‘˜TÕ"Ø�Y‰Y˜%ÒØ—(‘(˜5 "Ó%ˆCÚØ˜)Ñ#ØØ—‘˜cÔ"Ø—h‘h˜u bÓ)�Ü" :¨sÓ3�Ø—‘˜y¨¨
Ð2DÐEÖFÜ�T˜:Ö&Ø—‘˜c¨�Ó.ˆAÛØ—‘˜Q–ð3 ð4 �8‰8�E‹?Ðr   c                 ó†  — g }t        «       }t        «       }| j                  ddg«      D ]  }|j                  «        Œ | j                  D �]J  }|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ˆt        |«      |v rŒª|j                  t        |«      «       |j                  d	d
«      }|sŒÙ||v rŒÞ|j                  |«       |j                  dd
«      }t        ||«      }|j                  d|› d�«       �Œ$|dv �r|j                  g d¢d¬«      D �]æ  }t        |«      |v rŒ|j                  t        |«      «       |j                  dk(  r3|j                  d«      rŒMt        ||«      }|sŒ\|j                  |«       Œn|j                  dk(  rA|j                  d¬«      }	t        |	«      dk  rŒžt        |«      }
|
sŒ¬|j                  |
«       Œ¾|j                  dk(  r`|j                  d	d
«      }|sŒâ||v rŒç|j                  |«       |j                  dd
«      }t        ||«      }|j                  d|› d�«       �Œ-|j                  dk(  s�Œ>|j                  d«      s|j                  d«      r�Œb|j                  dd¬«      }|s�Œyd}t!        |«      D ]I  \  }}||v rt        |«      t        |«      k  rd} n'||v sŒ*t        |«      t        |«      k  sŒB|||<   d} n |r�ŒÖ|j                  |«       �Œé �Œ*t        ||«      }|s�Œ:|j                  |«       �ŒM t        «       }g }|D ]†  }t#        j$                  d|«      D ]W  }|j'                  d«      |v r"|j)                  |j'                  d«      d
«      }Œ8|j                  |j'                  d«      «       ŒY |sŒv|j                  |«       Œˆ |}dj+                  |«      S )NÚscriptÚstyleÚpr
   Tr   é   r   r   r   r   r   r   )ÚdivÚsectionÚcenterÚucapcontent)r4   r
   r   Úspan)Ú	recursiver:   r   Fu"   <a href="([^"]+)">æŸ¥çœ‹å›¾ç‰‡</a>é   r   ú

)r   Úfind_allÚ	decomposeÚchildrenr"   Úlowerr0   r!   r   Úlenr   Úidr$   r#   r   Úfind_parentÚ	enumerateÚreÚfinditerÚgroupÚreplacer&   )Úcontent_divr(   r)   Ú	processedÚseen_imgs_globalÚsÚchildÚtnÚtxtÚall_textÚmdr   r   r/   ÚsubÚis_dupÚiÚexistingÚseen_imgs_finalÚdedupedÚpartÚms                         r   Úextract_contentr[   H   sñ  € Ø€EÜ“€IÜ“uÐà×!Ñ! 8¨WÐ"5Ó6ò ˆØ	�‰�ðð ×%Ñ%ó R"ˆØ�:‰:ÐØØ�Z‰Z×ÑÓˆà�Š9Ü" 5¨*Ó5ˆCÚØ—‘˜SÕ!à�7Š]Ø—~‘~¨D�~Ó1ˆHÜ�8‹}˜rÒ!ØÜ˜UÓ#ˆBÚØ—‘˜RÕ à�5Š[Ü�%‹y˜IÑ%ØØ�M‰Mœ"˜U›)Ô$Ø—)‘)˜E 2Ó&ˆCÚØÐ*Ñ*ØØ ×$Ñ$ SÔ)Ø—i‘i  rÓ*�Ü" :¨sÓ3�Ø—‘˜y¨¨
Ð2DÐEÖFàÐ>Ò>Ø—~‘~Ò&CÈt�~ÓTó ,.�Ü�c“7˜iÑ'ØØ—‘œb ›gÔ&Ø—8‘8˜s’?à—‘ wÔ/Ø Ü*¨3°
Ó;�CÚØŸ™ SÕ)Ø—X‘X Ò(Ø"Ÿ|™|°$˜|Ó7�HÜ˜8“} rÒ)Ø Ü$ SÓ)�BÚØŸ™ RÕ(Ø—X‘X Ò&ØŸ'™' %¨Ó,�CÚØÐ"2Ñ2Ø$Ø(×,Ñ,¨SÔ1Ø!Ÿg™g e¨RÓ0˜Ü#*¨:°sÓ#;˜ØŸ™ y°°
Ð:LÐ%MÖNØ—X‘X Ô'à—‘ sÔ+¨s¯©¸wÔ/GÙ ØŸ,™, s°$˜,Ó7�CÛà!&˜Ü+4°UÓ+;ò &™K˜A˜xØ" h™´3°s³8¼sÀ8»}Ò3LØ)- Ù %Ø'¨3š´3°x³=Ä3ÀsÃ8Ó3KØ+.  a¡Ø)- Ù %ð&ó  &Ø!ŸL™L¨Ö-òY,.ô` # 5¨*Ó5ˆCÛØ—‘˜SÖ!ðeR"ôj “e€OØ€GØò !ˆÜ—‘ÐBÀDÓIò 	0ˆAØ�w‰w�q‹z˜_Ñ,Ø—|‘| A§G¡G¨A£J°Ó3‘à×#Ñ# A§G¡G¨A£JÕ/ð		0ò
 Ø�N‰N˜4Õ ð!ð €Eà�;‰;�uÓÐ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   ú/éÿÿÿÿú?r   )r"   Úurl)
r   r>   rF   ÚsearchÚIr   r   Úsplitr$   r!   )Úsoupr(   ÚattsÚseenr   r   Úfull_urlr"   s           r   Úextract_attachmentsrh   ¶   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	d
di¬«      }|r$|j                  d«      r|d   j                  «       }|sL|j                  d«      }|r9|j                  d¬«      }t        j                  dd|«      j                  «       }|}d}|j                  d	d
di¬«      }|r'|j                  d«      r|d   j                  «       d d }|j                  dd¬«      }	|	r|	j                  d«      }
|
r|
}	t        || «      }|	rt!        |	| «      }nd}t#        |j                  «       «      dk  r„d| › d|› d�}|j%                  d«      }g }|D ]J  }|j                  dd«      }|sŒt'        | |«      }|j                  dd«      }|j)                  d|› d�«       ŒL |r|ddj+                  |«      z   z  }|r|D ]  }|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   Úmetar"   ÚArticleTitle)ÚattrsÚcontentÚtitleTr   u6   \s*[-_â€”|].*(?:é€šçŸ¥å…¬å‘Š|å¹¿ä¿¡åŒºäººæ°‘æ”¿åºœ).*$ÚPubDateé
   r6   ÚconTxt©Úclass_ÚUCAPCONTENTú<p><a href="r   ú</a></p>r   r   r   u   ">æŸ¥çœ‹å›¾ç‰‡</a></p>r=   z

<p><a href="r`   )Úrequestsr#   ÚHEADERSÚencodingÚ	ExceptionÚprintÚsysÚstderrr   r-   Úfindr   r   rF   rS   rh   r[   rB   r>   r   r!   r&   )r`   ÚrÚerd   rw   ÚmtÚtagr,   Údate_strrJ   ÚucapÚattachmentsrv   ÚimgsÚ	img_linesr   r   r/   r   r   s                       r   Úfetch_detailr‘   Æ   s�  € ð$Ü�L‰L˜¤g°rÔ:ˆØˆŒ
ô
 ˜Ÿ™ Ó/€Dð €EØ	�‰�6 &¨.Ð!9ˆÓ	:€BÙ	ˆb�f‰f�YÔØ�9‘×#Ñ#Ó%ˆÙØ�i‰i˜Ó ˆÙØ—‘ 4�Ó(ˆAÜ—‘ÐPÐRTÐVWÓX×^Ñ^Ó`ˆAØˆEð €HØ	�‰�6 &¨)Ð!4ˆÓ	5€BÙ	ˆb�f‰f�YÔØ�i‘=×&Ñ&Ó(¨¨"Ð-ˆð —)‘)˜E¨(�)Ó3€KÙØ×Ñ Ó.ˆÙØˆKä% d¨CÓ0€KáÜ! +¨sÓ3‰àˆô ˆ7�=‰=‹?Ó˜bÒ Ø    R¨ w¨hÐ7ˆØ�}‰}˜UÓ#ˆØˆ	Øò 	RˆCØ—'‘'˜% Ó$ˆCÚÜ" 3¨Ó,�Ø—g‘g˜e RÓ(�Ø× Ñ  <°¨zÐ9OÐ!PÕQð	Rñ Ø�v §¡¨IÓ 6Ñ6Ñ6ˆGáØò 	JˆAØÐ)¨!¨E©(¨°2°a¸±i°[ÀÐIÑI‰Gð	Jð �(˜G [Ð0Ð0øôq ò $ÜÐ% c U¨"¨Q¨CÐ0´s·z±zÕBØ�T˜4 Ð#Õ#ûð$ús   ‚#H È	IÈ&IÈ=IÉIc                 ó$   — | dk(  rt         S d| › d�S )Nr<   z$http://www.srx.gov.cn/srx/tzgg/list_z.shtml)ÚLIST_URL)Úpage_nums    r   Úget_list_urlr•     s   € Ø�1‚}ÜˆØ1°(°¸6ÐBÐBr   c                 óN  — t        | «      }	 t        j                  |t        d¬«      }d|_        |j                  dk7  r-t        d| › d	|j                  › �t        j                  ¬«       g S t        |j                  d
«      }|j                  dd¬«      }|sg S g }|j                  d«      D ]½  }|j                  d«      }|j                  dd¬«      }	|r|j                  d«      sŒ;|d   j                  «       }
|j                  dd«      j                  «       xs |j                  d¬«      }t!        ||
«      }|	r|	j                  d¬«      nd}|sŒ§|sŒª|j#                  |||f«       Œ¿ |S # t
        $ r-}t        d|› d|› �t        j                  ¬«       g cY d }~S d }~ww xY w)Nrj   rk   rn   z  Error fetching ro   rp   éÈ   ú  Page z: HTTP rr   ÚulÚinfoListr{   Úlir   r:   Údater   rw   r   Tr   )r•   r€   r#   r�   r‚   rƒ   r„   r…   r†   Ústatus_coder   r-   r‡   r>   r   r   r   r!   )r”   r`   rˆ   r‰   rd   r™   Úitemsr›   r   r:   r   rw   Úpage_urlrŒ   s                 r   Úextract_list_pager      s}  € Ü
�xÓ
 €CðÜ�L‰L˜¤g°rÔ:ˆØˆŒ
ð
 	‡}�}˜ÒÜ�˜�z ¨¯©¨Ð8¼s¿z¹zÕJØˆ	ä˜Ÿ™ Ó/€DØ	�‰�4 
ˆÓ	+€BÙØˆ	à€EØ�k‰k˜$Óò 6ˆØ�G‰G�C‹LˆØ�w‰w�v fˆwÓ-ˆÙ˜Ÿ™˜fœØà�‰y�‰Ó ˆØ—‘�g˜rÓ"×(Ñ(Ó*ÒD¨a¯j©j¸t¨jÓ.DˆÜ˜3 Ó%ˆÙ04�4—=‘= t�=Ô,¸"ˆâ’XØ�L‰L˜% ¨8Ð4Õ5ð6ð €Løô9 ò ÜÐ! #  b¨¨Ð,´3·:±:Õ>Ø�	ûðús   �#E. Å.	F$Å7"FÆF$ÆF$c                  ó€   — t        j                  t        d¬«      } | j                  d«       | j                  d«       | S )Né<   )rm   zPRAGMA journal_mode=WALzPRAGMA busy_timeout=5000)Úsqlite3ÚconnectÚDB_PATHÚexecute)Úconns    r   Úinit_dbr¨   3  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)
Nz\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: rp   )rF   rS   r   ÚjsonÚdumpsr¦   Ú	SITE_NAMEÚCATEGORYÚGROUPÚrowcountrƒ   r„   r…   r†   )
r§   rw   rŸ   Úpublish_daterv   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            
      ó  — t         } t        t        j                  «      dkD  r	 t	        t        j                  d   «      } t        dt        › d| › �t        j                  ¬«       t        «       }d}d}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 �Œ=w xY w)Nr<   )z--max-pagesé   z	Scraping z, max pages: rp   r   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Ó?ro   z found, z newz
Done! Found: z, New: )Ú	MAX_PAGESrB   r…   ÚargvÚintÚ
ValueErrorr„   r­   r†   r¨   Úranger    r¦   Úfetchoner‘   rµ   ÚtimeÚsleepÚcommitÚclose)Ú	max_pagesr§   Ú	total_newÚtotal_foundÚpnÚarticlesrw   rŸ   rœ   r´   Ú	det_titleÚdet_dateÚdet_contentÚdet_attsÚfinal_titleÚ
final_dateÚfinal_contentÚ
final_attss                     r   ÚmainrÒ   N  s`  € Ü€IÜ
Œ3�8‰8ƒ}�qÒð	ÜœCŸH™H Q™KÓ(ˆIô 
ˆI”i�[ ¨i¨[Ð
9ÄÇ
Á
ÕKÜ‹9€DØ€IØ€Kä�A�y 1‘}Ó%ó WˆÜ$ 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¸tÐDÌ3Ï:É:×Vð=Wð@ 	‡K�K„MØ‡J�J„LÜ	ˆO˜K˜=¨°	¨{Ð
;Ä#Ç*Á*ÖMøô] ò 	Ü�x‰x˜‰{Ð.Ñ.´3´s·x±x³=À1Ò3DðÜ #¤C§H¡H¨Q¡KÓ 0‘IøÜ!ò Ùðýð		ús5   ¤H È:I>ÉI+É*I>É+	I7É4I>É6I7É7I>É=I>Ú__main__) Ú__doc__r€   rF   r«   r£   rÁ   Úosr…   r   Úbs4r   Úurllib.parser   r¥   r­   r®   r¯   ÚBASE_URLr“   r»   r�   r   r0   r[   rh   r‘   r•   r    r¨   rµ   rÒ   Ú__name__© r   r   ú<module>rÛ      s¥   ðñ	÷ 2× 1× 1Ó 1Ý Ý Ý  à
€Ø0€	Ø€Ø€Ø"€Ø6€Ø€	ð DØOØ0ñ€òòò@iò\ò <1òBCò!òLòò(3Nðl ˆzÒÙ…Fð r   