Ë
    ¸¬ujŸ  ã                   óD  — 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mZmZ ddl	m
Z
mZ ddlZej                  j                  dd«      ZdZdZd	Zd
diZdZdZ ej.                  «        ed¬«      z
  Zej3                  d«      Zd„ Zd„ Zd„ Zd„ Zd„ Ze dk(  r e«        yy)u6  
crawl_qianxi.py â€” é»”è¥¿å¸‚-å…¬ç¤ºå…¬å‘Š
CMS: è‡ªå®šä¹‰LayUI CMSï¼ˆè´µå·žå¤šå½©å�šè™¹ç§‘æŠ€ï¼‰
åˆ—è¡¨: é�™æ€�åˆ†é¡µ index.html (p1) / index_{N}.html (pN+1)
è¯¦æƒ…: h1æ ‡é¢˜, div.info-time spanæ—¥æœŸ, div#contentæ­£æ–‡
æ€»: 46é¡µ, ~14æ�¡/é¡µ (è¿‘3å¹´ ~9é¡µ ~120æ�¡)

è¿�è¡Œ: python3 crawl_qianxi.py [--full]
é    N)ÚdatetimeÚ	timedelta)ÚThreadPoolExecutorÚas_completedÚ	SEARCH_DBz/root/search.dbu   é»”è¥¿å¸‚-å…¬ç¤ºå…¬å‘Šu   é»”è¥¿å¸‚äººæ°‘æ”¿åºœzhttps://www.gzqianxi.gov.cnz
User-Agentz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36é
   é   iG  )Údaysz%Y-%m-%dc                 ó2   — t        dt        › d| › �d¬«       y )Nú[z] T)Úflush)ÚprintÚ	SITE_NAME)Úmsgs    ú!/root/gov_crawler/crawl_qianxi.pyÚlogr       s   € Ü	ˆAŒiˆ[˜˜3˜%Ð
 ¨Ö-ó    c                 óÐ  — | dk(  r
t         › d�}nt         › d| › d�}t        j                  j                  |t        ¬«      }	 t        j                  j                  |d¬«      }|j                  «       j                  d¬	«      }g }t        j                  dt        j                  «      }t        «       }|j                  |«      D ]ß  }	|	j                  d«      j!                  «       }
|	j                  d«      j!                  «       }|
j#                  d«      r|
}n'|
j#                  d«      r
t         |
z   }nt         dz   |
z   }||v rŒ�|j%                  |«       t        j&                  d|«      }|r |j                  d«      }|dd › d|dd › d�}nd}|j)                  |||f«       Œá |st        d
| dz   › d�«       |S # t        $ r }t        d
| dz   › d|› �«       g cY d}~S d}~ww xY w)z70-indexed: page 0=index.html, page 1=index_1.html, etc.r   z/xxfb/gsgg/index.htmlz/xxfb/gsgg/index_z.html©Úheadersé   ©ÚtimeoutÚreplace©Úerrorsõ   ç¬¬é   u   é¡µè¯·æ±‚å¤±è´¥: Nz,href="([^"]*gsgg/[^"]*)"[^>]*title="([^"]*)"é   Úhttpú/z/(\d{6})/t\d{8}_é   ú-é   z-01Ú u   é¡µ: æœªåŒ¹é…�åˆ°æ–‡ç« )ÚBASE_URLÚurllibÚrequestÚRequestÚHEADERSÚurlopenÚreadÚdecodeÚ	Exceptionr   ÚreÚcompileÚDOTALLÚsetÚfinditerÚgroupÚstripÚ
startswithÚaddÚsearchÚappend)Úpage_noÚurlÚreqÚrespÚhtmlÚeÚarticlesÚpatternÚ	seen_urlsÚmÚhrefÚtitleÚfull_urlÚ
date_matchÚymÚdate_strs                   r   Úfetch_list_pagerJ   $   sà  € à�!‚|Ü�
Ð/Ð0‰ä�
Ð+¨G¨9°EÐ:ˆä
�.‰.×
 Ñ
  ¬gÐ
 Ó
6€CðÜ�~‰~×%Ñ% c°2Ð%Ó6ˆØ�y‰y‹{×!Ñ!¨Ð!Ó3ˆð €Hä�j‰jØ7Ü
�	‰	ó€Gô “€IØ×Ñ˜dÓ#ò 5ˆØ�w‰w�q‹z×ÑÓ!ˆØ—‘˜“
× Ñ Ó"ˆà�?‰?˜6Ô"Ø‰HØ�_‰_˜SÔ!Ü $‘‰Hä #‘~¨Ñ,ˆHà�yÑ ØØ�‰�hÔô —Y‘YÐ2°HÓ=ˆ
ÙØ×!Ñ! !Ó$ˆBØ˜R˜a˜&˜  2 a¨ 7 )¨3Ð/‰HàˆHà�‰˜ 5¨(Ð3Õ4ð/5ñ2 Üˆc�'˜!‘)�Ð3Ð4Ô5Ø€OøôO ò Üˆc�'˜!‘)�Ð-¨a¨SÐ1Ô2Ø�	ûðús   ÁAF< Æ<	G%ÇG ÇG%Ç G%c                 ó¾  — t         j                  j                  | t        ¬«      }t	        j
                  t        j                  dd«      «       	 t         j                  j                  |d¬«      }|j                  «       j                  d¬«      }|}t        j                  d|t        j                  «      }|r|j!                  d«      j#                  «       }|}	t        j                  d|t        j                  «      }
|
rH|
j!                  d«      j#                  «       }t        j                  d|«      }|r|j!                  d«      }	d
}t        j                  d|t        j                  «      }|r6|j!                  d«      j#                  «       }t        j$                  dd|«      }| ||	|fS # t        $ r$}t        d| d	d
 › d|› �«       | ||d
fcY d
}~S d
}~ww xY w)u0   çˆ¬è¯¦æƒ…é¡µ -> (url, full_title, date, content)r   g333333Ã?g333333Ó?r   r   r   r   u   è¯¦æƒ…é¡µå¤±è´¥ éÎÿÿÿNú: z<h1[^>]*>(.*?)</h1>r   z.<div class="info-time">\s*<span>([^<]+)</span>z(\d{4}-\d{2}-\d{2})z6<div\s+id="content"[^>]*>(.*?)</div>\s*<!--endprint-->z\s+ú )r'   r(   r)   r*   ÚtimeÚsleepÚrandomÚuniformr+   r,   r-   r.   r   r/   r8   r1   r4   r5   Úsub)r;   Ú
list_titleÚ
month_dater<   r=   r>   r?   Ú
full_titleÚmtrI   ÚmdÚraw_dateÚdmÚcontentÚmcÚbodys                   r   Úfetch_detailr^   Y   s’  € ä
�.‰.×
 Ñ
  ¬gÐ
 Ó
6€CÜ‡J�JŒv�~‰~˜d CÓ(Ô)ð3Ü�~‰~×%Ñ% c°2Ð%Ó6ˆØ�y‰y‹{×!Ñ!¨Ð!Ó3ˆð €JÜ	�‰Ð)¨4´·±Ó	;€BÙ	Ø—X‘X˜a“[×&Ñ&Ó(ˆ
ð €HÜ	�‰ÐDÀdÌBÏIÉIÓ	V€BÙ	Ø—8‘8˜A“;×$Ñ$Ó&ˆÜ�Y‰YÐ-¨xÓ8ˆÙØ—x‘x “{ˆHð €GÜ	�‰ØAØŒb�i‰ió
€Bñ 
Ø�x‰x˜‹{× Ñ Ó"ˆÜ—&‘&˜  dÓ+ˆà�˜X wÐ/Ð/øô; ò 3ÜÐ˜s 3 4˜y˜k¨¨A¨3Ð/Ô0Ø�Z ¨TÐ2Õ2ûð3ús   ÁAF/ Æ/	GÆ8GÇGÇGc                 óŽ  — t        j                  t        «      }|j                  «       }d}d}| D ]F  \  }}}}	 |j	                  dt
        |||t        |xs df«       |j                  dkD  r|dz  }n|dz  }ŒH |j                  «        |j                  «        ||fS # t        $ r}	t        d|dd  › d|	› �«       Y d }	~	Œ�d }	~	ww xY w)Nr   z�INSERT OR IGNORE INTO gov_raw
                   (site_name, title, page_url, publish_date, source_url, content)
                   VALUES (?, ?, ?, ?, ?, ?)r%   r   u   å…¥åº“å¤±è´¥: rL   rM   )Úsqlite3ÚconnectÚDB_PATHÚcursorÚexecuter   ÚSOURCEÚrowcountr.   r   ÚcommitÚclose)
r@   Úconnrc   ÚinsertedÚskippedr;   rE   Údater[   r?   s
             r   Ú
save_to_dbrm   €   sÙ   € Ü�?‰?œ7Ó#€DØ�[‰[‹]€FØ€HØ€Gà%-ò 3Ñ!ˆˆU�D˜'ð	3Ø�N‰Nð0ô ˜E 3¨¬f°g²mÀÐDô	ð �‰ Ò"Ø˜A‘‘à˜1‘�øð3ð 	‡K�K„MØ‡J�J„LØ�WÐÐøô ò 	3Ü�.  S T  ¨2¨a¨SÐ1×2Ñ2ûð	3ús   ¹>BÂ	CÂ&B?Â?Cc                  ól  — dt         j                  v } t        d| rdnd› d�«       | rt        dt        «      ndg}g }|D ]{  }t        |«      }|st        d|dz   › d	�«        nZt        d|dz   › d
t        |«      › d�«       |j                  |«       t        j                  t        j                  dd«      «       Œ} |st        d«       y t        dt        |«      › d�«       g }t        t        ¬«      5 }t        |«      D ���	�
ci c]"  \  }\  }}	}
|j                  t         ||	|
«      |“Œ$ }}	}}}
dt        |«      }}t#        |«      D ]I  }|dz  }|j%                  «       }|r|j'                  |«       |dz  dk(  s||k(  sŒ9t        d|› d|› �«       ŒK 	 d d d «       g }|D ]*  \  }}}}|t(        k  rŒ|j'                  ||||r|ndf«       Œ, t        dt        |«      › dt        |«      › d�«       |r t+        |«      \  }}t        d|› d|› �«       y t        d«       y c c}
}	}}w # 1 sw Y   Œ”xY w)Nz--fullu   å¼€å§‹u   å…¨é‡�u   å¢žé‡�u	   çˆ¬å�–...r   r   r   u   é¡µæ— æ•°æ�®ï¼Œç»“æ�Ÿu   é¡µ: u   æ�¡gš™™™™™É?gš™™™™™Ù?u   æ— æ•°æ�®ï¼Œé€€å‡ºu   å…± u    æ�¡ï¼Œå¼€å§‹çˆ¬è¯¦æƒ…é¡µ...)Úmax_workersr   u   è¯¦æƒ…é¡µè¿›åº¦: r!   r%   u   è¯¦æƒ…é¡µå®Œæˆ�: u   æ�¡ï¼Œè¿‘3å¹´: u   å…¥åº“å®Œæˆ�: æ–°å¢ž u	   , è·³è¿‡ u   æ— æ•°æ�®å…¥åº“)ÚsysÚargvr   ÚrangeÚ	MAX_PAGESrJ   ÚlenÚextendrO   rP   rQ   rR   r   ÚNUM_THREADSÚ	enumerateÚsubmitr^   r   Úresultr9   ÚTHREE_YEARS_STRrm   )Úis_fullÚpages_to_crawlÚ	all_itemsr:   r@   Údetail_resultsÚexecutorÚiÚuÚtÚdÚfuturesÚdoneÚtotalÚfÚrÚvalidr;   rE   rl   r[   rj   rk   s                          r   ÚmainrŠ   š   sI  € Øœ#Ÿ(™(Ð"€GÜˆ&™W‘¨(Ð3°9Ð=Ô>á,3”U˜1œiÔ(¸!¸€Nà€IØ!ò -ˆÜ" 7Ó+ˆÙÜ�#�g˜a‘i�[Ð 5Ð6Ô7Ùäˆc�'˜!‘)�˜E¤# h£- °Ð4Ô5Ø×Ñ˜Ô"Ü�
‰
”6—>‘> # sÓ+Õ,ð-ñ ÜÐ Ô!Øäˆ$Œs�9‹~ÐÐ:Ð;Ô<à€NÜ	¬Ô	4ð 	8¸ÜQZÐ[dÓQe×fÑfÁÀÁIÀQÈÈ1�8—?‘?¤<°°A°qÓ9¸1Ñ<ÐfˆÓfØœ˜W›ˆeˆÜ˜gÓ&ò 	8ˆAØ�A‰IˆDØ—‘“
ˆAÙØ×%Ñ% aÔ(Ø�b‰y˜AŠ~ ¨£ÜÐ'¨ v¨Q¨u¨gÐ6Õ7ñ	8÷	8ð €EØ%3ò EÑ!ˆˆU�D˜'Ø”/Ò!ØØ�‰�c˜5 $±7©ÀÐCÕDðEô
 Ð
œC Ó/Ð0°ÄÀEÃ
¸|È3ÐOÔPáÜ& uÓ-Ñˆ�'ÜÐ# H :¨Y°w°iÐ@ÕAäÐÕùõ/ g÷	8ð 	8ús%   Ã5H*Ä'H"Ä-AH*ÆH*È"H*È*H3Ú__main__)!Ú__doc__rp   r`   Úosr/   rO   rQ   r   r   Úconcurrent.futuresr   r   Úurllib.requestr'   ÚenvironÚgetrb   r   re   r&   r*   rs   rv   ÚnowÚTHREE_YEARS_AGOÚstrftimerz   r   rJ   r^   rm   rŠ   Ú__name__© r   r   ú<module>r—      s´   ðñ÷ *× )× )ß (ß ?Û à
�*‰*�.‰.˜Ð&7Ó
8€Ø$€	Ø	 €Ø(€ð ÐPð€ð €	Ø€Ø�(—,‘,“.¡9°'Ô#:Ñ:€Ø!×*Ñ*¨:Ó6€ò.ò2òj$0òNò40ðf ˆzÒÙ…Fð r   