Ë
    ¸¬uj£  ã                   ó\  — d 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mZ ddl	Z	dZ
 e	j                  dd«      ZdZ ej                  «       Zej                   j#                  d	d
i«        ej$                  «        ed¬«      z
  j'                  d«      Zd„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)u˜   
Crawl å®œæ˜Œé«˜æ–°åŒº - æ‹›æ ‡å…¬å‘Š (gxq.yichang.gov.cn/list-103-1.html)
Static HTML list pages: list-103-{page}.html
Detail: content-103-{id}-1.html
é    N)ÚBeautifulSoup)ÚdatetimeÚ	timedeltazhttp://gxq.yichang.gov.cnÚ	SEARCH_DBz/root/search.dbu   å®œæ˜Œé«˜æ–°åŒº - æ‹›æ ‡å…¬å‘Šz
User-AgentzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36iG  )Údaysz%Y-%m-%dc                 óÐ  — g }t        | d«      }|j                  dd¬«      D �]@  }|j                  dd¬«      }|j                  dd¬«      }|sŒ-|j                  d«      }|sŒA|j                  dd	«      }|j	                  d
¬«      }|r|sŒjt        j                  dd	|«      j                  «       }|j                  d«      rd|z   }nG|j                  d«      r
t        |z   }n,|j                  d«      st        dz   |j                  d«      z   }|r|j	                  d
¬«      nd	}	t        j                  d|	«      }
|
r|
j                  d«      }	|j                  |||	dœ«       �ŒC |S )z%Parse list page, return list of dictsúhtml.parserÚdivz
list-views©Úclass_zlistview-btzlistview-dateÚaÚhrefÚ T©Ústripz
<!--.*?-->z//zhttp:ú/Úhttpz(\d{4}-\d{2}-\d{2})é   )ÚtitleÚurlÚdate)r   Úfind_allÚfindÚgetÚget_textÚreÚsubr   Ú
startswithÚBASE_URLÚlstripÚmatchÚgroupÚappend)Ú	html_textÚrecordsÚsoupÚitemÚbt_divÚdate_divr   r   r   Údate_strÚdms              ú&/root/gov_crawler/crawl_gxq_yichang.pyÚparse_list_pager-      s^  € à€GÜ˜ MÓ2€Dà—‘˜e¨L�Ó9ó &ˆØ—‘˜5¨�Ó7ˆØ—9‘9˜U¨?�9Ó;ˆáØà�K‰K˜ÓˆÙØà�u‰u�V˜RÓ ˆØ—
‘
 �
Ó&ˆÙ™5Øô —‘�} b¨%Ó0×6Ñ6Ó8ˆð �?‰?˜4Ô Ø˜T‘>‰DØ�_‰_˜SÔ!Ü˜d‘?‰DØ—‘ Ô(Ü˜c‘> D§K¡K°Ó$4Ñ4ˆDñ 5=�8×$Ñ$¨4Ð$Ô0À"ˆä�X‰XÐ,¨hÓ7ˆÙØ—x‘x “{ˆHà�‰ØØØñ
ö 	ðE&ðP €Nó    c                 óÒ  — 	 t         j                  | d¬«      }d|_        t	        |j
                  d«      }|j                  dd¬«      }|s|j                  dd	„ ¬«      }d
}|rt        |«      }d
}|j                  dddi¬«      }|r'|j                  d«      r|d   j                  «       dd }d
}|j                  d«      }|r|j                  d¬«      }|||fS # t        $ r Y yw xY w)z>Fetch detail page, return (content_html, date_str, full_title)é   ©Útimeoutúutf-8)r   r   r   r	   r
   ztxtcontent-divr   c                 ó@   — | xr dt        | «      j                  «       v S )NÚcontent)ÚstrÚlower)Úcs    r,   ú<lambda>zfetch_detail.<locals>.<lambda>U   s   € ¸Ò8Y¸iÌ3ÈqË6Ï<É<Ë>Ð>Y€ r.   r   ÚmetaÚnameÚPubDate)Úattrsr5   Né
   Úh1Tr   )
Úsessionr   ÚencodingÚ	Exceptionr   Útextr   r6   r   r   )	r   Úrespr&   Úcontent_divÚcontent_htmlr*   r:   Ú
full_titler?   s	            r,   Úfetch_detailrH   H   sü   € ðÜ�{‰{˜3¨ˆ{Ó+ˆØˆŒô ˜Ÿ™ MÓ2€Dð —)‘)˜EÐ*:�)Ó;€KÙØ—i‘i Ñ.Y�iÓZˆà€LÙÜ˜;Ó'ˆð €HØ�9‰9�V F¨IÐ#6ˆ9Ó7€DÙ�—‘˜Ô#Ø˜	‘?×(Ñ(Ó*¨3¨BÐ/ˆð €JØ	�‰�4‹€BÙ	Ø—[‘[ t�[Ó,ˆ
à˜ :Ð-Ð-øô5 ò Ùðús   ‚C Ã	C&Ã%C&c                 óŽ  — |j                  «       }d}d}| D ]u  }|d   r|d   t        k  r|dz  }Œ	 |j                  d|d   t        |d   d|j	                  dd«      |j	                  dd«      t
        f«       |j                  dkD  r|dz  }Œw |j                  «        ||fS # t        $ r}t        d	|› �«       Y d
}~Œ¨d
}~ww xY w)zInsert records into gov_rawr   r   r   zÂ
                INSERT OR IGNORE INTO gov_raw 
                (page_url, source_url, title, summary, content, publish_date, site_name)
                VALUES (?, ?, ?, ?, ?, ?, ?)
            r   r   r   r5   z  DB error: N)
ÚcursorÚTHREE_YEARS_AGOÚexecuter   r   Ú	SITE_NAMEÚrowcountrB   ÚprintÚcommit)r%   ÚconnrJ   ÚinsertedÚskippedÚrecÚes          r,   Úinsert_to_dbrV   i   sæ   € à�[‰[‹]€FØ€HØ€Gàò &ˆØˆvŠ;˜3˜v™;¬Ò8Ø�q‰LˆGØð	&Ø�N‰Nð ð
 �E‘
ÜØ�G‘ØØ—‘˜	 2Ó&Ø—‘˜ Ó#Üðô	ð �‰ Ò"Ø˜A‘�øð)&ð0 	‡K�K„MØ�WÐÐøô	 ò 	&Ü�L  Ð$×%Ñ%ûð	&ús   ²AB#Â#	CÂ,B?Â?Cc            	      ón  — dt         j                  v xs t         j                  d   dk(  } dd l}|j                  t        «      }t        dt        › d�«       | rt        d«       d}nd	}t        › d
�}t        j                  |d¬«      }d|_
        t        |j                  «      }t        dt        |«      › d�«       | sét        |j                  d«      }|j                  dd¬«      }|r¾|j!                  d«      }	d}
|	D ]M  }t#        j$                  d|j                  dd«      «      }|sŒ,t'        |j)                  d«      «      }||
kD  sŒL|}
ŒO |
dkD  r|
|k  r|
}t#        j$                  d|j+                  «       «      }|r|j)                  d«      nd}t        d|› d|
› d|› �«       t-        d|dz   «      D ]˜  }t        › d|› d�}	 t        j                  |d¬«      }d|_
        |j.                  d k7  r n\t        |j                  «      }|s nCt        d!|› d"t        |«      › d�«       |j1                  |«       t3        j4                  d#«       Œš t        d%t        |«      › �«       t        d&«       t9        |«      D ]Q  \  }}|d'z  dk(  rt        d(|› d)t        |«      › �d*¬+«       t;        |d,   «      \  }}}|r||d-<   |r||d.<   |sŒM||d/<   ŒS t=        ||«      \  }}|j?                  «        t        d0«       t        d1|› d2|› �«       y # t6        $ r}t        d!|› d$|› �«       Y d }~ ŒÝd }~ww xY w)3NÚincrementaléÿÿÿÿÚ1r   z=== z ===zMode: incremental (page 1 only)r   é   z/list-103-1.htmlr0   r1   r3   z
  Page 1: z recordsr	   r
   Úpages)Úidr   zlist-103-(\d+)\.htmlr   r   u   (\d+)æ�¡ú?z	  Total: z
 records, z pages, crawling é   z
/list-103-z.htmléÈ   z  Page z: g333333Ó?z error: z
Total collected: zFetching details...r>   z  r   T)Úflushr   r5   r   r   z
=== SUMMARY ===z
Inserted: z, Skipped (old): ) ÚsysÚargvÚsqlite3ÚconnectÚDB_PATHrO   rM   r   r@   r   rA   r-   rC   Úlenr   r   r   r   ÚsearchÚintr"   r   ÚrangeÚstatus_codeÚextendÚtimeÚsleeprB   Ú	enumeraterH   rV   Úclose)rX   rd   rQ   Úpages_to_crawlÚurl1rD   Úall_recordsr&   Ú	pages_divÚlinksÚtotal_pagesr   ÚmÚpÚtotal_matchÚ	total_recÚpageÚpage_urlr%   rU   ÚirT   r5   Údate_from_detailrG   rR   rS   s                              r,   Úmainr   Š   s7  € Ø¤3§8¡8Ð+ÒB¬s¯x©x¸©|¸sÑ/B€KãØ�?‰?œ7Ó#€Dä	ˆD”�˜4Ð
 Ô!ÙÜÐ/Ô0Ø‰àˆô ˆZÐ'Ð(€DÜ�;‰;�t Rˆ;Ó(€DØ€D„Mä! $§)¡)Ó,€KÜ	ˆJ”s˜;Ó'Ð(¨Ð
1Ô2áä˜TŸY™Y¨Ó6ˆØ—I‘I˜e¨�IÓ0ˆ	ÙØ×&Ñ& sÓ+ˆEØˆKØò (�Ü—I‘IÐ5°q·u±u¸VÀRÓ7HÓI�ÚÜ˜AŸG™G A›J›�AØ˜;“Ø&'™ð(ð ˜QŠ ;°Ò#?Ø!,�äŸ)™) K°×1CÑ1CÓ1EÓFˆKÙ0;˜×)Ñ)¨!Ô,ÀˆIÜ�I˜i˜[¨
°;°-Ð?PÐQ_ÐP`ÐaÔbô �a˜¨!Ñ+Ó,ò ˆÜ�Z˜z¨$¨¨uÐ5ˆð	Ü—;‘;˜x°�;Ó4ˆDØ#ˆDŒMØ×Ñ 3Ò&ÙÜ% d§i¡iÓ0ˆGÙÙÜ�G˜D˜6 ¤C¨£L >°Ð:Ô;Ø×Ñ˜wÔ'Ü�J‰J�s�Oðô" 
Ð¤ KÓ 0Ð1Ð
2Ô3ô 
Ð
Ô Ü˜KÓ(ò 
&‰ˆˆ3Øˆr‰6�QŠ;Ü�B�q�c˜œ3˜{Ó+Ð,Ð-°TÕ:ä0<¸SÀ¹ZÓ0HÑ-ˆÐ! :ÙØ$ˆC�	‰NÙØ*ˆC�‰KÚØ%ˆC�ŠLð
&ô % [°$Ó7Ñ€HˆgØ‡J�J„Lä	ÐÔÜ	ˆJ�x�jÐ 1°'°Ð
;Õ<øô1 ò 	Ü�G˜D˜6 ¨!¨Ð-Ô.Ýûð	ús%   Ç-LÇ6LÈALÌ	L4ÌL/Ì/L4Ú__main__)Ú__doc__rb   r   rm   ÚrequestsÚbs4r   r   r   Úosr   Úgetenvrf   rM   ÚSessionr@   ÚheadersÚupdateÚnowÚstrftimerK   r-   rH   rV   r   Ú__name__© r.   r,   ú<module>r�      s¼   ðñ÷ Ó Û Ý ß (Û 	à&€Ø
ˆ"�)‰)�KÐ!2Ó
3€Ø,€	à
ˆ(×
Ñ
Ó
€Ø ‡�× Ñ Øð  Dðô ð  �8—<‘<“>¡I°5Ô$9Ñ9×CÑCÀJÓO€ò-ò^.òBòBO=ðb ˆzÒÙ…Fð r.   