Ë
    €Ûµ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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d„Zd„ Zd„ Zd„ Zedk(  r e«        yy)u�  
Crawler for æ”€æž�èŠ±å¸‚è¥¿åŒºäººæ°‘æ”¿åºœ - é€šçŸ¥å…¬å‘Š (pzhsxq.gov.cn)
CMS: æ”€æž�èŠ±å¸‚ç»Ÿä¸€å¹³å�°
List: ul.clearfix.mt-15 > li > a[title] + span(date), 15/page
Pagination: index.shtml (p1), index_N.shtml (pN), max 20 pages
Detail: meta ArticleTitle + meta PubDate, div.cont > div > p content
Attachments: a[href*=./uploadfiles/] or .xls/.pdf/.doc

Usage:
    python3 /root/gov_crawler/crawl_pzhsxq_tzgg.py
é    N)Údatetime)ÚBeautifulSoup)Úurljoinz/root/search.dbu   æ”€æž�èŠ±å¸‚è¥¿åŒº-é€šçŸ¥å…¬å‘Šu   é€šçŸ¥å…¬å‘Šu   å››å·�zhttp://www.pzhsxq.gov.cnz/zfxxgk/fdzdgknr/tzggé   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                 óN   — | dk(  rt         › t        › d�S t         › t        › d| › d�S )Né   z/index.shtmlz/index_ú.shtml)ÚBASE_URLÚLIST_DIR)Úpage_nums    ú&/root/gov_crawler/crawl_pzhsxq_tzgg.pyÚget_list_urlr   %   s1   € Ø�1‚}Ü�œH˜: \Ð2Ð2ÜˆZœ�z ¨¨
°&Ð9Ð9ó    c                 óº  — t        | «      }	 t        j                  |t        d¬«      }d|_        t        |j                  d«      }g }|j                  dd	¬
«      }|sg S |j                  dd¬«      D ]­  }|j                  dd¬«      }|sŒ|d   }	|	j                  d«      sŒ0t        ||	«      }
|j                  dd«      j                  «       xs |j!                  d¬«      }|sŒs|j                  d«      }|r|j!                  d¬«      nd}|j#                  ||
|f«       Œ¯ |S # t        $ r-}t        d|› d|› �t        j                  ¬«       g cY d }~S d }~ww xY w)Nr   ©ÚheadersÚtimeoutúutf-8úhtml.parserz  Error fetching ú: ©ÚfileÚulzclearfix mt-15©Úclass_ÚliF©Ú	recursiveÚaT©Úhrefr"   r
   ÚtitleÚ ©ÚstripÚspan)r   ÚrequestsÚgetÚHEADERSÚencodingr   ÚtextÚ	ExceptionÚprintÚsysÚstderrÚfindÚfind_allÚendswithr   r&   Úget_textÚappend)r   ÚurlÚrÚsoupÚeÚitemsr   r   r    r"   Úpage_urlr#   r'   Údate_strs                 r   Úextract_list_pager=   +   sQ  € Ü
�xÓ
 €CðÜ�L‰L˜¤g°rÔ:ˆØˆŒ
Ü˜QŸV™V ]Ó3ˆð
 €EØ	�‰�4Ð 0ˆÓ	1€BÙØˆ	à�k‰k˜$¨%ˆkÓ0ò 2ˆØ�G‰G�C˜dˆGÓ#ˆÙØØ�‰yˆØ�}‰}˜XÔ&ØÜ˜3 Ó%ˆØ—‘�g˜rÓ"×(Ñ(Ó*ÒD¨a¯j©j¸t¨jÓ.DˆÙØØ�w‰w�v‹ˆÙ04�4—=‘= t�=Ô,¸"ˆØ�‰�e˜X xÐ0Õ1ð2ð €Løô1 ò ÜÐ! #  b¨¨Ð,´3·:±:Õ>Ø�	ûðús   �9D$ Ä$	EÄ-"EÅEÅEc                 óD  — 	 t        j                  | t        d¬«      }d|_        t        |j                  d«      }d}|j                  d	d
di¬«      }|r$|j                  d«      r|d   j                  «       }|s:|j                  dd¬«      }|r%|j                  d«      }|r|j                  d¬«      }|sE|j                  d«      }|r2|j                  d¬«      j                  d«      d   j                  «       }d}	|j                  d	d
di¬«      }
|
r'|
j                  d«      r|
d   j                  «       d d }	d}|j                  dd¬«      }|�r |j                  dt        j                  dt        j                   «      ¬«      }|s)|j                  dd¬«      }|r|j                  d«      snd }|r¾|j#                  ddg«      D ]  }|j%                  «        Œ g }|j#                  d«      D ]-  }|j                  d¬«      }|sŒ|d vsŒ|j'                  |«       Œ/ |j#                  d!«      D ].  }|j)                  d!«      rŒ|j'                  t+        |«      «       Œ0 d"j-                  |«      }t        j.                  d#d"|«      j                  «       }g }t1        «       }|j#                  d$d¬%«      D ]¥  }|d&   }t        j2                  d'|t        j                   «      xs d(|v }|sŒ6t5        | |«      }|j                  d¬«      xs& |j                  d)«      d*   j                  d+«      d   }||vsŒ�|j7                  |«       |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)-Nr   r   r   z  fetch_detail error r   r   r   r$   ÚmetaÚnameÚArticleTitle)ÚattrsÚcontentÚdivÚcontr   Úh3Tr%   r#   ú-r   ÚPubDateé
   z	font-size)ÚstyleFr   ÚscriptrJ   Úp)ú õ   Â z&nbsp;Útablez

z\n{3,}r    r!   r"   z&\.(xls|xlsx|pdf|doc|docx|rar|zip|txt)$z/uploadfiles/ú/éÿÿÿÿú?)r@   r6   )r(   r)   r*   r+   r-   r.   r/   r0   r   r,   r1   r&   r4   ÚsplitÚreÚcompileÚIr2   Ú	decomposer5   Úfind_parentÚstrÚjoinÚsubÚsetÚsearchr   Úadd)r6   r7   r9   r8   r#   Ú
meta_titlerF   ÚhÚtr<   Ú	meta_daterC   Úcont_divÚcontent_divÚsÚpartsrL   ÚtblÚattachmentsÚseenÚa_tagr"   Úis_attachmentÚfull_urlr@   s                            r   Úfetch_detailrm   N   s  € ð$Ü�L‰L˜¤g°rÔ:ˆØˆŒ
ô
 ˜Ÿ™ Ó/€Dð €EØ—‘˜6¨&°.Ð)A�ÓB€JÙ�j—n‘n YÔ/Ø˜9Ñ%×+Ñ+Ó-ˆÙØ�Y‰Y�u VˆYÓ,ˆÙØ—‘˜“ˆAÙØŸ
™
¨˜
Ó.�ÙØ�I‰I�gÓˆÙØ—J‘J T�JÓ*×0Ñ0°Ó5°aÑ8×>Ñ>Ó@ˆEð €HØ—	‘	˜&¨°Ð(;�	Ó<€IÙ�Y—]‘] 9Ô-Ø˜YÑ'×-Ñ-Ó/°°Ð4ˆð €GØ�y‰y˜ vˆyÓ.€HÚØ—m‘m E´·±¸LÌ"Ï$É$Ó1O�mÓPˆÙà"Ÿ-™-¨¸˜-Ó?ˆKÙ ;×#3Ñ#3°DÔ#9Øà"�ÙØ ×)Ñ)¨8°WÐ*=Ó>ò �Ø—‘•ðàˆEØ ×)Ñ)¨#Ó.ò $�Ø—J‘J T�JÓ*�Ú˜Ð"9Ò9Ø—L‘L •Oð$ð
 #×+Ñ+¨GÓ4ò +�Ø—‘ wÕ/Ø—L‘L¤ S£Õ*ð+ð —k‘k %Ó(ˆGÜ�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øôO ò $ÜÐ% c U¨"¨Q¨CÐ0´s·z±zÕBØ�T˜4 Ð#Õ#ûð$ús   ‚#M% Í%	NÍ.&NÎNÎN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)Nr	   Úlockedz  z: locked (attempt rP   z), retry in zs...r   z	 failed: F)	ÚrangeÚsqlite3ÚOperationalErrorrY   r.   r/   r0   ÚtimeÚsleep)ÚfnÚdescÚmax_attemptsÚdelayÚattemptr9   s         r   Ú
with_retryrz   ž   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 )Né   )r   zPRAGMA journal_mode=WALzPRAGMA busy_timeout=30000)rq   ÚconnectÚDB_PATHÚexecute©Úconns    r   Úinit_dbr‚   ¬   s1   € Ü�?‰?œ7¨BÔ/€DØ‡L�LÐ*Ô+Ø‡L�LÐ,Ô-Ø€Kr   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+rM   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   )rT   r[   r&   ÚjsonÚdumpsr   Ú	SITE_NAMEÚCATEGORYÚGROUPÚrowcountr-   r.   r/   r0   )
r�   r#   r;   Úpublish_daterC   rh   ÚsummaryÚatt_jsonÚcurr9   s
             r   Ú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         } t        t        j                  «      dkD  r	 t	        t        j                  d   «      } t        dt        › d| › �t        j                  ¬«       t        «       Šd}d}t        j                  «       }ˆfd„}t        dt        j                  ¬«       t        |dt        › �¬	«       t        d
t        › �t        j                  ¬«       t        d| dz   «      D �]}  }t        |«      }|s"t        d|› d�t        j                  ¬«        �nN|t        |«      z  }d}|D ]ˆ  \  }}	}
‰j                  d|	f«      }|j                  «       rŒ+t        |	«      \  }}}}|xs |}|xs |
}|xs	 d|› d|	› d�}|xs g }t!        ‰||	|||«      r
|dz  }|dz  }t        j"                  d«       ŒŠ t	        t        j                  «       |z
  «      }| |z
  }|dkD  r-|dkD  r(t	        |t%        d|t%        d|«      z  «      z  dz  «      nd}t        d|› d| › d|› d|› d|› d|dz  › d|dz  d›d|› d�t        j                  ¬«       |dz  dk(  s�Œn‰j'                  «        �Œ€ ‰j'                  «        t	        t        j                  «       |z
  «      }‰j)                  «        t        d|› d|› d|dz  › d|dz  d›d �	t        j                  ¬«       y #  Y �Œ¢xY w)!Nr	   z	Scraping z, max pages: r   r   c                  ó&   •— ‰ j                  «        y )N)Úcommitr€   s   €r   Údo_cleanzmain.<locals>.do_cleanÕ   s   ø€ à�‰�r   z  Cleaning old data...zClean )rv   z  Cleaned old data for z  Page z: 0 items (end)z)SELECT id FROM gov_raw WHERE page_url = ?ú[z](ú)g333333Ó?é<   rP   z: +z new, z total, ú:Ú02dz elapsed, ETA ÚminrI   z
Done! Found: z, New: z, Time: Úmre   )Ú	MAX_PAGESÚlenr/   ÚargvÚintr.   rˆ   r0   r‚   rs   rz   rp   r=   r   Úfetchonerm   r�   rt   Úmaxr“   Úclose)Ú	max_pagesÚ	total_newÚtotal_foundÚ
start_timer”   ÚpnÚarticlesÚ	batch_newr#   r;   Údater�   Ú	det_titleÚdet_dateÚdet_contentÚdet_attsÚfinal_titleÚ
final_dateÚfinal_contentÚ
final_attsÚelapsedÚ
pages_leftÚetar�   s                          @r   Úmainr¶   Ç   sà  ø€ Ü€IÜ
Œ3�8‰8ƒ}�qÒð	ÜœCŸH™H Q™KÓ(ˆIô 
ˆI”i�[ ¨i¨[Ð
9ÄÇ
Á
ÕKÜ‹9€DØ€IØ€KÜ—‘“€Jôô 
Ð
"¬¯©Õ4Üˆx ¤y kÐ2Õ3Ü	Ð#¤I ;Ð
/´c·j±jÕAä�A�y 1‘}Ó%ó $ˆÜ$ RÓ(ˆÙÜ�G˜B˜4˜Ð/´c·j±jÕAÚà”s˜8“}Ñ$ˆØˆ	à%-ò 	Ñ!ˆE�8˜TØ—,‘,ÐJÈXÈKÓXˆCØ�|‰|Œ~Øä9EÀhÓ9OÑ6ˆI�x ¨hØ#Ò, uˆKØ!Ò) TˆJØ'ÒI¨Q¨{¨m¸2¸h¸ZÀqÐ+IˆMØ!š RˆJä˜D +¨x¸À]ÐT^Ô_Ø˜Q‘�	Ø˜Q‘�	ä�J‰J�s�Oð	ô" ”d—i‘i“k JÑ.Ó/ˆØ ‘^ˆ
ØELÈqÂ[ÐUWÐZ[ÒU[Œc�*œs 1 b¬3¨q°'«?Ñ&:Ó;Ñ;¸bÑ@ÔAÐabˆä�˜�t˜1˜Y˜K s¨9¨+°VØ�˜1˜[˜M¨Ø˜"‘�˜Q˜w r™z¨#Ð.ð /Ø�E˜ðô %(§J¡Jõ	0ð
 �‰7�aŒ<Ø�K‰KŽMðI$ðL 	‡K�K„MÜ”$—)‘)“+ 
Ñ*Ó+€GØ‡J�J„LÜ	ˆO˜K˜=¨°	¨{¸(À7ÈBÁ;À-ÈqÐQXÐY[ÑQ[Ð\_ÐP`Ð`aÐ
bÔil×isÑisÖtøðs	Úús   ¥K ËK#Ú__main__)zDB oprI   é   )Ú__doc__r(   rT   r†   rq   rs   Úosr/   Úurllib.parseÚurllibr   Úbs4r   r   r~   rˆ   r‰   rŠ   r   r   rœ   r*   r   r=   rm   rz   r‚   r�   r¶   Ú__name__© r   r   ú<module>rÀ      s”   ðñ
÷ @× ?× ?× ?Ý Ý Ý  à
€Ø-€	Ø€Ø€Ø%€Ø"€Ø€	ð DØOØ0ñ€ò:òòFK1ó`òòò(>uðB ˆzÒÙ…Fð r   