Ë
    €Ûµ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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dddœZd„ Zd„ Zdd„Zd„ Zd„ Zd„ Zedk(  r e«        yy)uÆ  
Crawler for èŽ†ç”°å¸‚ç§€å±¿åŒºäººæ°‘æ”¿åºœ - å…¬ç¤ºå…¬å‘Š (ptxy.gov.cn)
CMS: ç¦�å»º21pt CMS (Avalon JS)
List: div.gl_list > ul > li > span.bf-pass(date) + a[href][title]
      å…¨éƒ¨78æ�¡æ¸²æŸ“åœ¨é¦–é¡µé�™æ€�HTMLä¸­ï¼Œæ— éœ€åˆ†é¡µ
Detail: div.xl_con1#detailCont > div.TRS_Editor > p/table
Title: meta ArticleTitle
Date: meta PubDate
Attachments: a[href*=/uploadfiles/] or a[href*=.doc/.pdf/.xls]

Usage:
    python3 /root/gov_crawler/crawl_ptxy_gsgg.py
é    N)Údatetime)ÚBeautifulSoup)Úurljoinz/root/search.dbu   èŽ†ç”°å¸‚ç§€å±¿åŒº-å…¬ç¤ºå…¬å‘Šu   é€šçŸ¥å…¬å‘Šu   ç¦�å»ºz!http://www.ptxy.gov.cn/zwgk/gsgg/zhttp://www.ptxy.gov.cnzoMozilla/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        j                  t        t        d¬«      } d| _        t        | j                  d«      }g }|j                  dd¬	«      D ]·  }|j                  d
«      D ]¡  }|j                  dd¬«      }|sŒ|d   }t        t        |«      }|j                  dd«      j                  «       xs |j                  d¬«      }	|	sŒe|j                  dd¬	«      }
|
r|
j                  d¬«      nd}|j!                  |	||f«       Œ£ Œ¹ |S # t        $ r*}t        d|› �t        j                  ¬«       g cY d }~S d }~ww xY w)Né   ©ÚheadersÚtimeoutúutf-8úhtml.parserz  Error fetching list: ©ÚfileÚdivÚgl_list©Úclass_ÚliÚaT©Úhrefr   ÚtitleÚ ©ÚstripÚspanzbf-pass)ÚrequestsÚgetÚLIST_URLÚHEADERSÚencodingr   ÚtextÚ	ExceptionÚprintÚsysÚstderrÚfind_allÚfindr   r   Úget_textÚappend)ÚrÚsoupÚeÚitemsr   r   r   r   Úpage_urlr   r   Údate_strs               ú$/root/gov_crawler/crawl_ptxy_gsgg.pyÚextract_all_itemsr2   &   s6  € ðÜ�L‰Lœ¬7¸BÔ?ˆØˆŒ
Ü˜QŸV™V ]Ó3ˆð
 €Eà—=‘= ¨y�=Ó9ò 6ˆØ×"Ñ" 4Ó(ò 	6ˆBØ—‘˜ $�Ó'ˆAÙØØ�V‘9ˆDÜœx¨Ó.ˆHØ—E‘E˜' 2Ó&×,Ñ,Ó.ÒH°!·*±*À4°*Ó2HˆEÙØØ—7‘7˜6¨)�7Ó4ˆDÙ48�t—}‘}¨4�}Ô0¸bˆHØ�L‰L˜% ¨8Ð4Õ5ñ	6ð6ð €Løô) ò ÜÐ'¨ sÐ+´#·*±*Õ=Ø�	ûðús   ‚=D Ä	EÄD>Ä8EÄ>Ec                 ó”  — 	 t        j                  | t        d¬«      }d|_        t        |j                  d«      }d}|j                  d	d
di¬«      }|r$|j                  d«      r|d   j                  «       }d}|j                  d	d
di¬«      }|r'|j                  d«      r|d   j                  «       d d }d}|j                  dd¬«      }	|	�rÅ|	j                  dd¬«      }
|
s|	}
|
j                  ddg«      D ]  }|j                  «        Œ g }g }|
j                  D �]/  }|j                  sŒ|j                  dk(  rOdj!                  |«      j                  «       }|r|j#                  |«       g }|j#                  t%        |«      «       Œo|j                  dk(  rrdj!                  |«      j                  «       }|r|j#                  |«       g }|j'                  d«      rŒÄ|j)                  d¬«      }|sŒÙ|dvsŒÞ|j#                  |«       Œð|j'                  d«      r�Œ|j)                  d¬«      }|s�Œ|dvs�Œ|j#                  |«       �Œ2 dj!                  |«      j                  «       }|r|j#                  |«       dj!                  |«      }t+        j,                  dd|«      j                  «       }g }t/        «       }|j                  dd¬ «      D ]«  }|d!   }t+        j0                  d"|t*        j2                  «      xs
 d#|v xs d$|v }|sŒ<t5        | |«      }|j)                  d¬«      xs& |j7                  d%«      d&   j7                  d'«      d(   }||vsŒ‡|j9                  |«       |j#                  ||d)œ«       Œ­ ||||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é   r	   r   z  fetch_detail error z: r   r   r   ÚmetaÚnameÚArticleTitle)ÚattrsÚcontentÚPubDateé
   r   Ú
detailCont)ÚidÚ
TRS_Editorr   ÚscriptÚstyleÚtableÚpÚtdTr   )ú õ   Â z&nbsp;z

z\n{3,}r   r   r   z&\.(pdf|doc|docx|xls|xlsx|rar|zip|txt)$z/uploadfiles/z/upload/ú/éÿÿÿÿú?r   )r6   Úurl)r   r   r    r!   r#   r$   r%   r&   r   r"   r(   r   r'   Ú	decomposeÚchildrenr6   Újoinr*   ÚstrÚfind_parentr)   ÚreÚsubÚsetÚsearchÚIr   ÚsplitÚadd)rI   r+   r-   r,   r   Ú
meta_titler0   Ú	meta_dater9   Údetail_contÚeditorÚsÚpartsÚtext_bufferÚchildÚtext_joinedÚtÚattachmentsÚseenÚa_tagr   Úis_attachmentÚfull_urlr6   s                           r1   Úfetch_detailre   D   s¢  € ð$Ü�L‰L˜¤g°rÔ:ˆØˆŒ
ô
 ˜Ÿ™ Ó/€Dð €EØ—‘˜6¨&°.Ð)A�ÓB€JÙ�j—n‘n YÔ/Ø˜9Ñ%×+Ñ+Ó-ˆð €HØ—	‘	˜&¨°Ð(;�	Ó<€IÙ�Y—]‘] 9Ô-Ø˜YÑ'×-Ñ-Ó/°°Ð4ˆð €GØ—)‘)˜E l�)Ó3€KÚà×!Ñ! %°Ð!Ó=ˆÙØ ˆFØ—‘ (¨GÐ!4Ó5ò 	ˆAØ�K‰K�Mð	àˆàˆØ—_‘_ó 	*ˆEØ—:’:ØØ�z‰z˜WÒ$Ø Ÿg™g kÓ2×8Ñ8Ó:�ÙØ—L‘L Ô-Ø �Ø—‘œS ›ZÕ(Ø—‘˜sÒ"à Ÿg™g kÓ2×8Ñ8Ó:�ÙØ—L‘L Ô-Ø"$�Kà×$Ñ$ TÔ*ØØ—N‘N¨�NÓ.�Ú˜Ð"9Ò9Ø—L‘L •Oð ×$Ñ$ TÔ*ÙØ—N‘N¨�NÓ.�Û˜Ð"9Ó9Ø×&Ñ& qÖ)ð7	*ð: —g‘g˜kÓ*×0Ñ0Ó2ˆÙØ�L‰L˜Ô%Ø—+‘+˜eÓ$ˆÜ�f‰f�Y ¨Ó0×6Ñ6Ó8€Gð €KÜ‹5€DØ—‘˜s¨�Ó.ò DˆØ�V‰}ˆä�I‰IÐ?ÀÄrÇtÁtÓLò Ø˜tÐ#òà˜$Ðð 	ò
 Ü˜s DÓ)ˆHØ—>‘>¨�>Ó-ÒR°·±¸C³ÀÑ1D×1JÑ1JÈ3Ó1OÐPQÑ1RˆDØ˜tÒ#Ø—‘˜Ô"Ø×"Ñ"¨D¸Ñ#BÕCðDð �(˜G [Ð0Ð0øôg ò $ÜÐ% c U¨"¨Q¨CÐ0´s·z±zÕBØ�T˜4 Ð#Õ#ûð$ús   ‚#N Î	OÎ&OÎ<OÏOc                 ól  — t        d|dz   «      D ]  }	  | «       c S  y
# t        j                  $ r�}dt        |«      v rC||k  r>t	        d|› d|› d|› d|› d�	t
        j                  ¬«       t        j                  |«       n't	        d|› d	|› �t
        j                  ¬«       Y d }~ y
Y d }~Œžd }~ww xY w)Né   Úlockedz  z: locked (attempt rF   z), retry in zs...r   z	 failed: F)	ÚrangeÚsqlite3ÚOperationalErrorrM   r$   r%   r&   ÚtimeÚsleep)ÚfnÚdescÚmax_attemptsÚdelayÚattemptr-   s         r1   Ú
with_retryrs       s¸   € Ü˜˜L¨1Ñ,Ó-ò 	ˆð	Ù“4ŠKð	ð øô ×'Ñ'ò 	Øœ3˜q›6Ñ! g°Ò&<Ü˜˜4˜&Ð 2°7°)¸1¸\¸NÈ,ÐW\ÐV]Ð]aÐbÔil×isÑisÕtÜ—
‘
˜5Õ!ä˜˜4˜& 	¨!¨Ð-´C·J±JÕ?Ýô "ûð	ús   ”ŸB3²A1B.Â.B3c                  ó€   — t        j                  t        d¬«      } | j                  d«       | j                  d«       | S )Nr   )r   zPRAGMA journal_mode=WALzPRAGMA busy_timeout=30000)rj   ÚconnectÚDB_PATHÚexecute©Úconns    r1   Úinit_dbrz   ®   s1   € Ü�?‰?œ7¨BÔ/€DØ‡L�LÐ*Ô+Ø‡L�LÐ,Ô-Ø€Kó    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+rD   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: r   )rO   rP   r   ÚjsonÚdumpsrw   Ú	SITE_NAMEÚCATEGORYÚGROUPÚrowcountr#   r$   r%   r&   )
ry   r   r/   Úpublish_dater9   r`   ÚsummaryÚatt_jsonÚcurr-   s
             r1   Úsave_articler‰   µ   s´   € Ù&ˆg�d�s‰m¨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 Â	CÂB<Â<Cc                  óŒ  ‡— t        dt        › �t        j                  ¬«       t	        «       Šˆfd„} t        dt        j                  ¬«       t        | dt        › �¬«       t        dt        › �t        j                  ¬«       t        «       }t        |«      }d}t        j                  «       }t        d	|› d
�t        j                  ¬«       |D ]ƒ  \  }}}‰j                  d|f«      }|j                  «       rŒ+t        |«      \  }	}
}}|	xs |}|
xs |}|xs	 d|› d|› d�}|xs g }t        ‰|||||«      r|dz  }t        j                  d«       Œ… ‰j                  «        t        t        j                  «       |z
  «      }‰j!                  «        t        d|› d|› d|dz  › d|dz  d›d�	t        j                  ¬«       y )Nz	Scraping r   c                  ó&   •— ‰ j                  «        y )N)Úcommitrx   s   €r1   Údo_cleanzmain.<locals>.do_cleanÍ   s   ø€ à�‰�r{   z  Cleaning old data...zClean )ro   z  Cleaned old data for r   z  Found z items totalz)SELECT id FROM gov_raw WHERE page_url = ?ú[z](ú)rg   g333333Ó?z
Done! Found: z, New: z, Time: é<   ÚmÚ02drZ   )r$   r�   r%   r&   rz   rs   r2   Úlenrl   rw   Úfetchonere   r‰   rm   rŒ   ÚintÚclose)r�   Ú	all_itemsÚtotal_foundÚ	total_newÚ
start_timer   r/   Údaterˆ   Ú	det_titleÚdet_dateÚdet_contentÚdet_attsÚfinal_titleÚ
final_dateÚfinal_contentÚ
final_attsÚelapsedry   s                     @r1   Úmainr¥   É   sž  ø€ Ü	ˆI”i�[Ð
!¬¯
©
Õ3Ü‹9€Dôô 
Ð
"¬¯©Õ4Üˆx ¤y kÐ2Õ3Ü	Ð#¤I ;Ð
/´c·j±jÕAä!Ó#€IÜ�i“.€KØ€IÜ—‘“€Jä	ˆH�[�M Ð
.´S·Z±ZÕ@à!*ò Ñˆˆx˜Ø�l‰lÐFÈÈÓTˆØ�<‰<Œ>Øä5AÀ(Ó5KÑ2ˆ	�8˜[¨(ØÒ( 5ˆØÒ% ˆ
Ø#ÒE¨¨;¨-°r¸(¸À1Ð'EˆØ’^ ˆ
ä˜˜k¨8°ZÀÐPZÔ[Ø˜‰NˆIä�
‰
�3�ðð  	‡K�K„MÜ”$—)‘)“+ 
Ñ*Ó+€GØ‡J�J„LÜ	ˆO˜K˜=¨°	¨{¸(À7ÈBÁ;À-ÈqÐQXÐY[ÑQ[Ð\_ÐP`Ð`aÐ
bÔil×isÑisÖtr{   Ú__main__)zDB opr;   é   )Ú__doc__r   rO   r   rj   rl   Úosr%   r   Úbs4r   Úurllib.parser   rv   r�   r‚   rƒ   r   ÚBASE_URLr    r2   re   rs   rz   r‰   r¥   Ú__name__© r{   r1   ú<module>r¯      sˆ   ðñ÷ 2× 1× 1Ó 1Ý Ý Ý  à
€Ø-€	Ø€Ø€Ø.€Ø#€ð DØOØ0ñ€òò<W1óxòòò(%uðP ˆzÒÙ…Fð r{   