Ë
    €Ûµ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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 é’¦åŒ—åŒºäººæ°‘æ”¿åºœ - æ„�è§�å¾�é›† (qinbei.gov.cn)
CMS: TRS/Hanweb
List: div#morelist > ul.more-list > li > span (date) + a[href][title]
Pagination: index.shtml (p1), index_1.shtml (p2), 30/page, 2 pages ~58 items
Detail: div.article > h1 (title), div.article-inf-left (date), div.article > div.article-content (or plain text after h1+inf)
         Table support: extract <table> as HTML for search_app

Usage:
    python3 /root/gov_crawler/crawl_qinbei_yjzj.py
é    N)Údatetime)ÚBeautifulSoup)Úurljoinz/root/search.dbu"   é’¦åŒ—åŒºäººæ°‘æ”¿åºœ-æ„�è§�å¾�é›†u   æ„�è§�å¾�é›†u   å¹¿è¥¿zhttp://www.qinbei.gov.cnz
/zmhd/yjzjé   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   — | dk(  rt         › t        › d�S t         › t        › d| dz
  › d�S )Né   z/index.shtmlz/index_z.shtml)ÚBASE_URLÚ	LIST_PATH)Úpage_nums    ú&/root/gov_crawler/crawl_qinbei_yjzj.pyÚget_list_urlr   %   s5   € Ø�1‚}Ü�œI˜; lÐ3Ð3ÜˆZœ	�{ '¨(°Q©,¨°vÐ>Ð>ó    c                 ó  — t        | «      }	 t        j                  |t        d¬«      }d|_        t        |j                  d«      }|j                  d«      }|sg S g }|j                  d	«      D ]ß  }|j                  d
«      }|j                  d«      }	|r|j                  d«      sŒ9|d   j                  «       }
|j                  dd«      j                  «       xs |j                  d¬«      }|j!                  d«      r|d d j                  «       }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)Né   ©ÚheadersÚtimeoutúutf-8z  Error fetching ú: ©Úfileúhtml.parserzdiv#morelist ul.more-listÚliÚaÚspanÚhrefÚtitleÚ T©Ústripz...éýÿÿÿ)r   ÚrequestsÚgetÚHEADERSÚencodingÚ	ExceptionÚprintÚsysÚstderrr   ÚtextÚ
select_oneÚfind_allÚfindr!   Úget_textÚendswithr   Úappend)r   ÚurlÚrÚeÚsoupÚmoreÚitemsr   r   r   r   r   Úpage_urlÚdate_strs                 r   Úextract_list_pager:   +   se  € Ü
�xÓ
 €CðÜ�L‰L˜¤g°rÔ:ˆØˆŒ
ô
 ˜Ÿ™ Ó/€DØ�?‰?Ð6Ó7€DÙØˆ	à€EØ�m‰m˜DÓ!ò 6ˆØ�G‰G�C‹LˆØ�w‰w�v‹ˆÙ˜Ÿ™˜fœØà�‰y�‰Ó ˆØ—‘�g˜rÓ"×(Ñ(Ó*ÒD¨a¯j©j¸t¨jÓ.Dˆà�>‰>˜%Ô Ø˜#˜2�J×$Ñ$Ó&ˆEÜ˜3 Ó%ˆÙ04�4—=‘= t�=Ô,¸"ˆâ’XØ�L‰L˜% ¨8Ð4Õ5ð6ð" €Løô7 ò ÜÐ! #  b¨¨Ð,´3·:±:Õ>Ø�	ûðús   �#E Å	FÅ"FÅ=FÆFc                 ó|  — 	 t        j                  | t        d¬«      }d|_        t        |j                  d«      }d}|j                  d	«      }|r|j                  d
¬«      }|sb|j                  d«      }|rO|j                  d
¬«      j                  dd«      j                  dd«      j                  «       j                  d«      }d}|j                  d«      }|r;|j                  d
¬«      }	t!        j"                  d|	«      }
|
r|
j%                  d«      }|j                  dd¬«      }d}|�r|j'                  ddg«      D ]  }|j)                  «        Œ |j                  dg d¢¬«      }|rŽg }|j'                  ddg«      D ]d  }|j*                  dk(  r|j-                  t/        |«      «       Œ-|j1                  d«      rŒ?|j                  d
¬«      }|sŒT|j-                  |«       Œf dj3                  |«      }n²g }|j'                  ddg«      D ]‰  }|j1                  d«      s|j1                  dd¬«      rŒ(|j*                  dk(  r|j-                  t/        |«      «       ŒR|j1                  d«      rŒd|j                  d
¬«      }|sŒy|j-                  |«       Œ‹ dj3                  |«      }g }t5        «       }|j'                  dd
¬«      D ]¬  }|d    }t!        j"                  d!|t         j6                  «      sŒ.t9        | |«      }|j                  d
¬«      xs& |j;                  d"«      d#   j;                  d$«      d%   }||vsŒy|j=                  |«       |j-                  ||d&œ«       |sŒ¡|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)*Nr   r   r   z  fetch_detail error r   r   r   r   zdiv.article h1Tr    r   u   é’¦åŒ—åŒºäººæ°‘æ”¿åºœu   - æ„�è§�å¾�é›†z_- zdiv.article-inf-leftz(\d{4}-\d{2}-\d{2})r	   ÚdivÚarticle)Úclass_ÚscriptÚstyle)zarticle-contentÚcontentÚ
TRS_EditorÚpÚtablez

Úh1zarticle-infr   )r   r   z&\.(pdf|doc|docx|xls|xlsx|rar|zip|txt)$ú/éÿÿÿÿú?r   )Únamer2   u   

é™„ä»¶ï¼š<p><a href="z">z</a></p>)r#   r$   r%   r&   r'   r(   r)   r*   r   r+   r,   r/   r.   Úreplacer!   ÚrstripÚreÚsearchÚgroupr-   Ú	decomposerI   r1   ÚstrÚfind_parentÚjoinÚsetÚIr   ÚsplitÚadd)r2   r3   r4   r5   r   rE   Útr9   ÚinfoÚtxtÚmr=   rA   ÚsÚcontent_divÚpartsÚelÚattachmentsÚseenÚa_tagr   Úfull_urlrI   s                          r   Úfetch_detailrc   P   sŒ  € ð$Ü�L‰L˜¤g°rÔ:ˆØˆŒ
ô
 ˜Ÿ™ Ó/€Dð €EØ	�‰Ð)Ó	*€BÙ	Ø—‘ $�Ó'ˆÙØ�I‰I�gÓˆÙØ—J‘J T�JÓ*×2Ñ2Ð3JÈBÓO×WÑWÐXhÐjlÓm×sÑsÓu×|Ñ|ð  ~Có  DˆEð €HØ�?‰?Ð1Ó2€DÙØ�m‰m $ˆmÓ'ˆÜ�I‰IÐ,¨cÓ2ˆÙØ—w‘w˜q“zˆHð �i‰i˜ iˆiÓ0€GØ€GÚà×!Ñ! 8¨WÐ"5Ó6ò 	ˆAØ�K‰K�Mð	ð —l‘l 5Ò1]�lÓ^ˆÙØˆEØ!×*Ñ*¨C°¨>Ó:ò (�Ø—7‘7˜gÒ%Ø—L‘L¤ R£Õ)ØŸ™¨Õ0ØŸ™¨$˜Ó/�AÚØŸ™ Q�ð(ð —k‘k %Ó(‰Gð ˆEØ×&Ñ&¨¨W ~Ó6ò 	(�à—>‘> $Ô'¨2¯>©>¸%È¨>Ô+VØØ—7‘7˜gÒ%Ø—L‘L¤ R£Õ)ØŸ™¨Õ0ØŸ™¨$˜Ó/�AÚØŸ™ Q�ð	(ð —k‘k %Ó(ˆGð €KÜ‹5€DØ—‘˜s¨�Ó.ò 	VˆØ�V‰}ˆÜ�9‰9Ð>ÀÄbÇdÁdÕKÜ˜s DÓ)ˆHØ—>‘>¨�>Ó-ÒR°·±¸C³ÀÑ1D×1JÑ1JÈ3Ó1OÐPQÑ1RˆDØ˜tÒ#Ø—‘˜Ô"Ø×"Ñ"¨D¸Ñ#BÔCÚØÐ!:¸8¸*ÀBÀtÀfÈHÐUÑU‘Gð	Vð �(˜G [Ð0Ð0øôS ò $ÜÐ% c U¨"¨Q¨CÐ0´s·z±zÕBØ�T˜4 Ð#Õ#ûð$ús   ‚#N Î	N;Î
&N6Î0N;Î6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 rF   z), retry in zs...r   z	 failed: F)	ÚrangeÚsqlite3ÚOperationalErrorrP   r(   r)   r*   ÚtimeÚsleep)ÚfnÚdescÚmax_attemptsÚdelayÚattemptr4   s         r   Ú
with_retryrp   ¢   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)rg   ÚconnectÚDB_PATHÚexecute©Úconns    r   Úinit_dbrx   °   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+ú 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   )rL   Úsubr!   ÚjsonÚdumpsru   Ú	SITE_NAMEÚCATEGORYÚGROUPÚrowcountr'   r(   r)   r*   )
rw   r   r8   Úpublish_daterA   r_   ÚsummaryÚatt_jsonÚcurr4   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            
      óR  ‡— t         } t        t        j                  «      dkD  r	 t	        t        j                  d   «      } t        dt        › d| › �t        j                  ¬«       t        «       Šd}d}ˆfd„}t        |d	t        › �¬
«       t        dt        › �t        j                  ¬«       t        d| dz   «      D �]7  }t        |«      }|s"t        d|› d�t        j                  ¬«        �n|t        |«      z  }|D ]´  \  }}}|r|dk  rŒ‰j                  d|f«      }	|	j                  «       rŒ3t        |«      \  }
}}}|
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                  ¬«       ‰j'                  «        �Œ: ‰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 �Œdw xY w)Nr	   )z--max-pagesr   z	Scraping z, max pages: r   r   c                  ó&   •— ‰ j                  «        y )N)Úcommitrv   s   €r   Údo_cleanzmain.<locals>.do_cleanÜ   s   ø€ à�‰�r   zClean )rl   z  Cleaned old data for z  Page z: 0 items (end)z
2016-01-01z)SELECT id FROM gov_raw WHERE page_url = ?ú[z](ú)é   z  + r{   é2   g      à?r   z found, z totalz
Done! Found: z, New: )ÚTOTAL_PAGESÚlenr)   ÚargvÚintÚ
ValueErrorr(   r€   r*   rx   rp   rf   r:   ru   Úfetchonerc   rˆ   ri   rj   r‹   Úclose)Ú	max_pagesÚ	total_newÚtotal_foundrŒ   ÚpnÚarticlesr   r8   Údater‡   Ú	det_titleÚdet_dateÚdet_contentÚdet_attsÚfinal_titleÚ
final_dateÚfinal_contentÚ
final_attsrw   s                     @r   Úmainr¦   Ë   ss  ø€ Ü€IÜ
Œ3�8‰8ƒ}�qÒð	ÜœCŸH™H Q™KÓ(ˆIô 
ˆI”i�[ ¨i¨[Ð
9ÄÇ
Á
ÕKÜ‹9€DØ€IØ€Kôô ˆ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‘�	Ø ’>Ü˜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Ø�‰Žð=ð@ 	‡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   ¥H; È;:J&É6JÊJ&Ê	JÊJ&ÊJÊJ&Ê%J&Ú__main__)zDB opé
   r�   )Ú__doc__r#   rL   r~   rg   ri   Úosr)   r   Úbs4r   Úurllib.parser   rt   r€   r�   r‚   r
   r   r‘   r%   r   r:   rc   rp   rx   rˆ   r¦   Ú__name__© r   r   ú<module>r¯      s“   ðñ
÷ 2× 1× 1Ó 1Ý Ý Ý  à
€Ø0€	Ø€Ø€Ø%€Ø€	Ø€ð DØOØ0ñ€ò?ò òJM1ódòòò(9Nðx ˆzÒÙ…Fð r   