Ë
    ¸¬ujå  ã                   ó    — 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 dZ	dZ
dZdZdd	iZd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)u6   Crawl gzxw.com.cn - ç”˜å·žåœ¨çº¿ å…¬å‘Šæ �ç›®(sid=384)é    N)Údatetimezhttps://www.gzxw.com.cnÚgzxxwz/root/search.dbé   z
User-Agentz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36c                 óÐ   — t         j                  j                  | t        ¬«      }t         j                  j	                  |d¬«      }|j                  «       j                  dd¬«      S )N)Úheadersé   )Útimeoutzutf-8Úreplace)Úerrors)ÚurllibÚrequestÚRequestr   ÚurlopenÚreadÚdecode)ÚurlÚreqÚresps      ú/root/gov_crawler/crawl_gzxw.pyÚfetchr      sP   € Ü
�.‰.×
 Ñ
  ¬gÐ
 Ó
6€CÜ�>‰>×!Ñ! #¨rÐ!Ó2€DØ�9‰9‹;×Ñ˜g¨iÐÓ8Ð8ó    c                 ó0  — | dk(  r
t         › d�}nt         › d| › �}t        |«      }t        «       }t        j                  d«      }|j                  |«      }t        «       }|D ]n  \  }}}	|	j                  «       }	||vsŒ|	sŒt        |	«      dkD  sŒ.|j                  |«       |j                  d«      r|nt         |z   }
|j                  |	|
|f«       Œp t        j
                  d|«      }t        |D �cg c]  }t        |«      ‘Œ c}| gz   «      }||fS c c}w )z)Get all (title, url, id) from a list pageé   z+/index.php/index/news/newslist.html?sid=384z1/index.php/index/news/newslist.html?sid=384&page=z9href="([^"]*detail_news[^"]*id=(\d+)[^"]*)"[^>]*>([^<]+)<é   Úhttpzhref="[^"]*page=(\d+)[^"]*")ÚBASE_URLr   ÚsetÚreÚcompileÚfindallÚstripÚlenÚaddÚ
startswithÚmaxÚint)Úpage_numr   ÚhtmlÚitemsÚpatternÚmatchesÚseen_idsÚhrefÚid_valÚtextÚfull_urlÚ
page_linksÚpÚmax_pages                 r   Úget_items_from_pager4      s  € à�1‚}Ü�
ÐEÐF‰ä�
ÐKÈHÈ:ÐVˆÜ�‹:€DÜ‹E€EÜ�j‰jÐUÓV€GØ�o‰o˜dÓ#€GÜ‹u€HØ%ò 0Ñˆˆf�dØ�z‰z‹|ˆØ˜Ò!¢d¬s°4«y¸1«}Ø�L‰L˜Ô Ø#Ÿ™¨vÔ6‘t¼HÀt¹OˆHØ�I‰I�t˜X vÐ.Õ/ð0ô —‘Ð:¸DÓA€JÜ JÖ/˜q”C˜•FÒ/°8°*Ñ<Ó=€HØ�(ˆ?Ðùò 0s   Ã2Dc                 óŒ  — t        j                  dd| t         j                  ¬«      }t        j                  dd|t         j                  ¬«      }t        j                  dd|t         j                  ¬«      }t        j                  dd|t         j                  ¬«      }t        j                  d	d|t         j                  ¬«      }t        j                  d
d|«      }|j                  d«      D �cg c]  }|j	                  «       ‘Œ }}dj                  |«      }t        j                  d
d|«      }|j	                  «       }|S c c}w )z:Extract text from HTML chunk, preserving paragraph breaks.z</p>ú

)Úflagsz	<br\s*/?>ú
ú</div>z*</?(?:b|span|font|strong|em|u|i|a)\b[^>]*>Ú z
<p\b[^>]*>z\n{3,})r   ÚsubÚIÚsplitr!   Újoin)Ú
html_chunkr/   ÚlÚliness       r   Úextract_clean_textrB   (   sç   € ä�6‰6�'˜6 :´R·T±TÔ:€DÜ�6‰6�,  d´"·$±$Ô7€DÜ�6‰6�)˜V T´·±Ô6€DÜ�6‰6Ð?ÀÀTÔQS×QUÑQUÔV€DÜ�6‰6�-  T´·±Ô6€DÜ�6‰6�)˜V TÓ*€DØ $§
¡
¨4Ó 0Ö1˜1ˆQ�W‰W�YÐ1€EÐ1Ø�9‰9�UÓ€DÜ�6‰6�)˜V TÓ*€DØ�:‰:‹<€DØ€Kùò	 2s   Ã.Ec                 ó¤  — g }| j                  d«      }|dk  ry| j                  dd|«      }|dk  r|}| j                  d|«      dz   }d}|}|dkD  r{|t        | «      k  rm| j                  d|«      }| j                  d|«      }|dk  rnC|dk\  r ||k  r|dz  }| j                  d|«      dz   }n
|dz  }|dz   }|dkD  r|t        | «      k  rŒm|dk(  r| ||dz
   n| |d	 }	t        j                  d
|	«      }
|
D ]G  \  }}|j                  d«      r|nt        |z   }|j                  d|j                  «       › d|› d�«       ŒI dj                  |«      S )zLExtract attachment links from div.attachment_url, return as markdown string.zclass="attachment_url"r   r:   ú<divú>r   r9   é   Nz(<a\s[^>]*href="([^"]+)"[^>]*>([^<]+)</a>r   ú[z](ú)r8   )
ÚfindÚrfindr"   r   r    r$   r   Úappendr!   r>   )r(   ÚpartsÚidxÚstartÚposÚdepthÚendÚ	next_openÚ
next_closeÚchunkÚlinksr-   Únamer0   s                 r   Úextract_attachmentsrW   7   st  € à€EØ
�)‰)Ð,Ó
-€CØ
ˆQ‚wØØ�J‰J�v˜q #Ó&€EØˆq‚yØˆØ
�)‰)�C˜Ó
 Ñ
!€CØ€EØ
€CØ
�!Š)˜œc $›išØ—I‘I˜f cÓ*ˆ	Ø—Y‘Y˜x¨Ó-ˆ
Ø˜Š>ØØ˜Š>˜i¨*Ò4Ø�Q‰JˆEØ—)‘)˜C Ó+¨aÑ/‰Cà�Q‰JˆEØ˜q‘.ˆCð �!Š)˜œc $›i›ð  %¨šzˆD��S˜‘U‰O¨t°C°D¨z€EÜ�J‰JÐBÀEÓJ€EØò 6‰
ˆˆdØŸ?™?¨6Ô2‘4¼À4¹ˆØ�‰�q˜Ÿ™›˜ b¨¨
°!Ð4Õ5ð6ð �9‰9�UÓÐr   c                 ó"  — t        | «      }t        j                  d|«      }|r|j                  d«      j	                  «       nd}t        j
                  dd|«      j	                  «       }d}|j                  d«      }|dkD  rÐ|j                  dd|«      }|dk  r|}|j                  d|«      dz   }d}|}	|dkD  r{|	t        |«      k  rm|j                  d|	«      }
|j                  d	|	«      }|dk  rnC|
dk\  r |
|k  r|dz  }|j                  d|
«      dz   }	n
|dz  }|d
z   }	|dkD  r|	t        |«      k  rŒm|dk(  r|||	d
z
   n||d }t        |«      }t        |«      }|r|r|dz  }||z  }d}|j                  d«      }|dkD  rO|||dz    }t        j                  d|«      }|r|j                  d«      }nt        j                  d|«      }|r|d   }t        j                  d|«      }|r|j                  d«      j	                  «       nd}||||fS )z3Get (title, date, content, source) from detail pagez<title>([^<]+)</title>r   r:   u   \s*[-â€“â€”|_].*$zclass="com_text"r   rD   rE   r9   rF   Nr6   zclass="content_box"iÐ  z1class="top-bar"[^>]*>.*?<span>(\d{4}-\d{2}-\d{2})z(\d{4}-\d{2}-\d{2})u   æ�¥æº�[ï¼š:]\s*([^<]+))r   r   ÚsearchÚgroupr!   r;   rI   rJ   r"   rB   rW   r    )r   r(   Útitle_matchÚtitleÚcontentrM   rN   rO   rP   rQ   rR   rS   rT   ÚattachmentsÚdateÚidx2Ú	bar_matchÚdatesÚsource_matchÚsources                       r   Ú
get_detailre   V   s.  € ä�‹:€DÜ—)‘)Ð5°tÓ<€KÙ,7ˆK×Ñ˜aÓ ×&Ñ&Ô(¸R€EÜ�F‰FÐ'¨¨UÓ3×9Ñ9Ó;€Eà€GØ
�)‰)Ð&Ó
'€CØ
ˆQ‚wØ—
‘
˜6 1 cÓ*ˆØ�1Š9ØˆEØ�i‰i˜˜SÓ! AÑ%ˆØˆØˆØ�aŠi˜C¤# d£)šOØŸ	™	 &¨#Ó.ˆIØŸ™ 8¨SÓ1ˆJØ˜AŠ~ØØ˜AŠ~ )¨jÒ"8Ø˜‘
�Ø—i‘i  YÓ/°!Ñ3‘à˜‘
�Ø  1‘n�ð �aŠi˜C¤# d£)›Oð $)¨A¢:��S˜˜Q™‘°4¸¸°:ˆÜ$ UÓ+ˆä% dÓ+€KÙÙØ�vÑˆGØ�;Ñˆà€DØ�9‰9Ð*Ó+€DØˆa‚xØ�T˜$˜t™)Ð$ˆÜ—I‘IÐRÐTYÓZˆ	ÙØ—?‘? 1Ó%‰Dä—J‘JÐ5°uÓ=ˆEÙØ˜Q‘x�ä—9‘9Ð6¸Ó=€LÙ.:ˆ\×Ñ Ó"×(Ñ(Ô*À€FØ�$˜ Ð'Ð'r   c                 ód  — | syt        j                  t        «      }|j                  d«       |j	                  «       }d}| D ]Û  }|j                  d|d   f«      j                  «       }|rt        d|d   d d › �«       Œ>|j                  dt        |d   |d   |d   |d	   |d	   r0t        t        j                  |d	   d
«      j                  «       «      nd|d   r|d   d d nd|d   f«       |j                  «        |dz  }t        d|d   d d › d|d	   › �«       ŒÝ |j                  «        |S )Nr   zPRAGMA busy_timeout=30000z)SELECT id FROM gov_raw WHERE source_url=?r   z  SKIP: r\   é(   z©
            INSERT INTO gov_raw (site_name, source_url, page_url, title, publish_date, date_rank, summary, content)
            VALUES (?, ?, ?, ?, ?, ?, ?, ?)
        r_   z%Y-%m-%dr]   éÈ   r:   r   z  OK: é2   z | )Úsqlite3ÚconnectÚDB_PATHÚexecuteÚcursorÚfetchoneÚprintÚ	SITE_NAMEr&   r   ÚstrptimeÚ	timestampÚcommitÚclose)ÚrecordsÚconnÚcÚcountÚrÚexistings         r   Ú
save_to_dbr|   ‹   sF  € ÙØÜ�?‰?œ7Ó#€DØ‡L�LÐ,Ô-Ø�‰‹€AØ€EØò 8ˆØ—9‘9ÐHÈ1ÈUÉ8È+ÓV×_Ñ_ÓaˆÙÜ�H˜Q˜w™Z¨¨˜_Ð-Ð.Ô/ØØ	�	‰	ð ô �q˜‘x  5¡¨1¨W©:Øˆf‰IØIJÈ6ÊŒC”×!Ñ! ! F¡)¨ZÓ8×BÑBÓDÔEÐXYØ"# I¢,ˆAˆi‰L˜˜#Ñ°BØˆi‰Lð
ô		ð 	�‰ŒØ�‰
ˆÜ��q˜‘z # 2�Ð' s¨1¨V©9¨+Ð6Õ7ð#8ð$ 	‡J�J„LØ€Lr   c                  óì  — t        d«       g } d}t        dt        dz   «      D ]n  }t        d|› d�«       	 t        |«      \  }}t	        ||«      }|st        d«        n5t        dt        |«      › d|› d�«       | j                  |«       ||k\  r nŒp t        dt        | «      › d�«       t        «       }g }| D ]0  \  }}	}
|
|vsŒ|j                  |
«       |j                  ||	|
f«       Œ2 t        dt        |«      › d�«       g }t        |«      D ]Y  \  }\  }}	}
t        d|dz   › dt        |«      › d|d d › d�«       	 t        |	«      \  }}}}|j                  |xs ||	|||dœ«       Œ[ t        |«      }t        d|› dt        |«      › d�«       y # t        $ r}t        d	|› d
|› �«       Y d }~ �Œ"d }~ww xY w# t        $ r,}t        d|› �«       t        j                  «        Y d }~ŒÜd }~ww xY w)Nu-   === Crawling gzxw.com.cn (å…¬å‘Š sid=384) ===r   z
Page z...z  No items, stoppingz  Found z items (max_page=rH   z  Error page z: z
=== Total: z
 items ===zUnique: z itemsz
[ú/z] ri   )r\   r   r_   r]   rd   z	  ERROR: z
=== Complete: z new records ===)rp   ÚrangeÚ	MAX_PAGESr4   r%   r"   ÚextendÚ	Exceptionr   r#   rK   Ú	enumeratere   Ú	tracebackÚ	print_excr|   )Ú	all_itemsr3   r'   r)   Úmax_pÚeÚseenÚunique_itemsr\   r   r.   rv   ÚiÚd_titleÚd_dater]   rd   Úsaveds                     r   Úmainr�   ¨   s,  € Ü	Ð
9Ô:Ø€IØ€HÜ˜!œY¨™]Ó+ò ˆÜ�˜�z Ð%Ô&ð	Ü.¨xÓ8‰LˆE�5Ü˜8 UÓ+ˆHÙÜÐ,Ô.ÙÜ�HœS ›Z˜LÐ(9¸%¸ÀÐBÔCØ×Ñ˜UÔ#Ø˜8Ò#Ùð $ðô 
ˆMœ#˜i›.Ð)¨Ð
4Ô5Ü‹5€DØ€LØ'ò 6Ñˆˆs�FØ˜ÒØ�H‰H�VÔØ×Ñ ¨¨VÐ 4Õ5ð6ô 
ˆH”S˜Ó&Ð' vÐ
.Ô/Ø€GÜ#,¨\Ó#:ò "ÑˆÑˆE�3˜Ü��A�a‘C�5˜œ#˜lÓ+Ð,¨B¨u°S°b¨z¨l¸#Ð>Ô?ð	"Ü/9¸#«Ñ,ˆG�V˜W fØ�N‰N WÒ%5°¸cÈ6Ð^eÐqwÑxÕyð	"ô �wÓ€EÜ	Ð˜U˜G 1¤S¨£\ NÐ2BÐ
CÕDøô+ ò 	Ü�M ( ¨2¨a¨SÐ1Ô2Þûð	ûô" ò 	"Ü�I˜a˜S�/Ô"Ü×Ñ×!Ñ!ûð	"ús5   ¶'FÁ1FÅ+F>Æ	F;ÆF6Æ6F;Æ>	G3Ç"G.Ç.G3Ú__main__)Ú__doc__r   Úsysrj   Úurllib.requestr   Úurllib.parser„   r   r   rq   rl   r€   r   r   r4   rB   rW   re   r|   r�   Ú__name__© r   r   ú<module>r—      sm   ðá <ß @× @× @Ý à$€Ø€	Ø
€Ø€	àÐWÐ
X€ò9ò
ò,òò>2(òjò:%EðN ˆzÒÙ…Fð r   