Ë
    º€Ÿj@1  ã                   óö  — 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
Z	dZdZdZej                  j                  d«      ZdZdZd	Zd
ZdZd„ Zd„ Zdd„Zd„ ZdZd„ Zd„ Zd„ Zdd„Zedk(  r‡ddl Z  e jB                  «       Z"e"jG                  dd¬«       e"jG                  de$d¬«       e"jG                  dd¬«       e"jK                  «       Z&e&jN                  r e«        y ee&jP                  ¬«       yy)uY   
å�šå…´åŽ¿äººæ°‘æ”¿åºœ - é€šçŸ¥å…¬å‘Š çˆ¬è™«
Hanweb CMS: JSONPåˆ†é¡µ + requestsè¯¦æƒ…é¡µ
é    Nõ   å�šå…´åŽ¿äººæ°‘æ”¿åºœz1http://www.boxing.gov.cn/col/col117915/index.htmlzhttp://www.boxing.gov.cnz~/gov_crawler/boxing_results.dbzroot@1.94.217.116ú/root/search.dbi1  é-   a  http://www.boxing.gov.cn/module/web/jpage/dataproxy.jsp?page={page}&webid=453&path=http://www.boxing.gov.cn/&columnid=117915&unitid=692184&webname=%25E5%258D%259A%25E5%2585%25B4%25E5%258E%25BF%25E4%25BA%25BA%25E6%25B0%2591%25E6%2594%25BF%25E5%25BA%259C&permissiontype=0c                  óz   — t        j                  t        «      } | j                  d«       | j	                  «        | S )Nz¹CREATE TABLE IF NOT EXISTS crawl_results (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        title TEXT, url TEXT UNIQUE, content TEXT,
        publish_date TEXT, summary TEXT
    ))Úsqlite3ÚconnectÚDB_PATHÚexecuteÚcommit)Úconns    ú!/root/gov_crawler/crawl_boxing.pyÚinit_dbr      s1   € Ü�?‰?œ7Ó#€DØ‡L�Lð 	ô 
ð
 	‡K�K„MØ€Kó    c                 óD   — t        | xs d«      }|j                  dd«      S )NÚ ú'z'')ÚstrÚreplace)ÚvÚss     r   Úescr      s    € ÜˆAŠG�‹€AØ�9‰9�S˜$ÓÐr   c                 óÊ   — t         j                  j                  | ddi¬«      }t         j                  j                  ||¬«      }|j	                  «       j                  dd«      S )Nú
User-Agentú<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36)Úheaders©Útimeoutúutf-8Úignore)ÚurllibÚrequestÚRequestÚurlopenÚreadÚdecode)Úurlr   ÚreqÚresps       r   Úfetchr)   "   sZ   € Ü
�.‰.×
 Ñ
  ØÐTð/Ð
 ó €Cô �>‰>×!Ñ! #¨wÐ!Ó7€DØ�9‰9‹;×Ñ˜g xÓ0Ð0r   c                 ó‚  — g }t        j                  d| t         j                  «      }|D ]’  }t        j                  d|«      }t        j                  d|«      }|sŒ2|j	                  d«      }|j                  d«      r	t        |z   }|j                  |j	                  d«      ||r|j	                  d«      ndf«       Œ” |S )z@Extract links from the embedded CDATA records on the first page.z(<record>.*?CDATA\[(.*?)\]\]>.*?</record>z)<a[^>]*href="([^"]+)"[^>]*title="([^"]*)"z<span>([^<]+)</span>é   ú/é   r   )ÚreÚfindallÚDOTALLÚsearchÚgroupÚ
startswithÚBASE_URLÚappend)ÚhtmlÚlinksÚrecordsÚrecÚaÚdater&   s          r   Úextract_links_from_pager<   )   s¤   € à€EÜ�j‰jÐDÀdÌBÏIÉIÓV€GØò KˆÜ�I‰IÐBÀCÓHˆÜ�y‰yÐ0°#Ó6ˆÚØ—'‘'˜!“*ˆCØ�~‰~˜cÔ"Ü ‘n�Ø�L‰L˜!Ÿ'™' !›* c¹D¨4¯:©:°a¬=ÀbÐIÕJðKð €Lr   c                 óz  — t        j                  d| t         j                  «      }|s%t        j                  d| t         j                  «      }|sy|j                  d«      }t        j                  dd|t         j                  ¬«      }t        j                  dd|«      }t        j                  d	d|t         j                  ¬«      }d
„ }t        j                  d||«      }t        j                  dd|«      }|j                  dd«      }t        j                  dd„ |«      }t        j                  dd„ |«      }t        j                  dd„ |«      }t        j                  dd„ |«      }|j                  dd«      }|j                  dd«      }|j                  dd«      }|j                  dd«      }t        j                  d d!|«      }g }|j                  d"«      D ]&  }|j                  «       }|sŒ|j                  |«       Œ( d"j                  |«      }t        j                  d#d|«      }t        j                  d$d|«      }|j                  «       }t        j                  d%d|«      }|j                  «       }t        j                  d&d|«      }t        j                  d'd|«      d(d) j                  «       }||fS )*zNExtract article content from detail page as HTML (preserves links/paragraphs).zP<div class="content contpm[^"]*"[^>]*>(.*?)(?:<div class="share|<div class="bot)z:<div class="content contpm[^"]*"[^>]*>(.*?)</div>\s*</div>)r   r   r+   z
<!--.*?-->r   )Úflagsz<meta[^>]*>z<iframe[^>]*>.*?</iframe>c                 óð   — | j                  d«      }d|v sd|v ryt        j                  d|«      }|r|j                  d«      }nd}|s)t        j                  d|«      }|r|j                  d«      }|xs dS )	Nr   z/icons/z/ico/r   ztitle="([^"]*)"r+   zalt="([^"]*)"u   [å›¾ç‰‡])r2   r.   r1   )ÚmÚtÚmtÚtitleÚmas        r   Úreplace_imgz$extract_content.<locals>.replace_imgM   sr   € Ø�G‰G�A‹Jˆà˜‰>˜W¨™\ØÜ�Y‰YÐ)¨1Ó-ˆÙ�r—x‘x “{‰uØˆeÙÜ—‘Ð+¨QÓ/ˆBÙ˜2Ÿ8™8 A›;�5ØÒ"˜
Ð"r   z
<img[^>]*>z<p[^>]*>z<div>z</p>z</div>z href="(/(?:module|attach)[^"]*)"c                 ó>   — dt         z   | j                  d«      z   dz   S ©Nzhref="r+   ú"©ÚBASE_URL_HTTPr2   ©r@   s    r   ú<lambda>z!extract_content.<locals>.<lambda>a   ó   €  H¬}Ñ$<¸q¿w¹wÀq»zÑ$IÈCÑ$O€ r   z href='(/(?:module|attach)[^']*)'c                 ó>   — dt         z   | j                  d«      z   dz   S ©Nzhref='r+   r   rI   rK   s    r   rL   z!extract_content.<locals>.<lambda>c   rM   r   zhref="(/(?!http)[^"]*)"c                 ó>   — dt         z   | j                  d«      z   dz   S rG   rI   rK   s    r   rL   z!extract_content.<locals>.<lambda>f   rM   r   zhref='(/(?!http)[^']*)'c                 ó>   — dt         z   | j                  d«      z   dz   S rO   rI   rK   s    r   rL   z!extract_content.<locals>.<lambda>h   rM   r   z&nbsp;ú z&amp;ú&z&lt;ú<z&gt;ú>z>\s+<z>\n<z\nz<a[^>]*>\s*</a>z<div>\s*</div>z
</div>\s*$z<[^>]+>z\\s+Néô  )
r.   r1   r0   r2   Úsubr   ÚsplitÚstripr5   Újoin)r6   r@   Úcontent_htmlrE   ÚlinesÚlineÚstrippedÚsummarys           r   Úextract_contentr`   ;   sy  € ô 	�	‰	ÐeÐgkÔmo×mvÑmvÓw€AÙä�I‰IÐSÐUYÔ[]×[dÑ[dÓeˆÙØà—7‘7˜1“:€Lô —6‘6˜-¨¨\ÄÇÁÔK€LÜ—6‘6˜.¨"¨lÓ;€Lä—6‘6Ð6¸¸LÔPR×PYÑPYÔZ€Lò#ô —6‘6˜-¨°lÓC€Lô —6‘6˜+ w°Ó=€LØ×'Ñ'¨°Ó9€Lô —6‘6Ð=ÙOÐQ]ó_€Lä—6‘6Ð=ÙOÐQ]ó_€Lô —6‘6Ð4ÙOÐQ]ó_€Lä—6‘6Ð4ÙOÐQ]ó_€Lð  ×'Ñ'¨°#Ó6€LØ×'Ñ'¨°Ó5€LØ×'Ñ'¨°Ó4€LØ×'Ñ'¨°Ó4€Lô —6‘6˜( G¨\Ó:€LØ€EØ×"Ñ" 5Ó)ò #ˆØ—:‘:“<ˆÚØ�L‰L˜Õ"ð#ð —:‘:˜eÓ$€Lô —6‘6Ð,¨b°,Ó?€Lä—6‘6Ð+¨R°Ó>€Là×%Ñ%Ó'€Lä—6‘6˜-¨¨\Ó:€LØ×%Ñ%Ó'€Lô �f‰f�Z  \Ó2€GÜ�f‰f�W˜c 7Ó+¨D¨SÐ1×7Ñ7Ó9€Gà˜Ð Ð r   c                 óV   — t        j                  d| «      }|r|j                  d«      S y)z&Extract publish date from detail page.u"   å�‘å¸ƒæ—¥æœŸï¼š(\d{4}-\d{2}-\d{2})r+   r   )r.   r1   r2   )r6   Úds     r   Úextract_pub_daterc   ‰   s'   € ä
�	‰	Ð7¸Ó>€AÙØ�w‰w�q‹zÐØr   c                  ó  — t        d«       t        j                  t        «      } | j	                  d«      j                  «       }| j                  «        |st        d«       yt        j                  d«      }|j	                  d«       d}d}|D ]J  }|\  }}}}	}
	 |j	                  d	|||xs d
dd |	xs d
|
xs d
dd |d
f«       |j                  dkD  r|dz  }ŒL |dkD  r3|j                  «        |j	                  d|f«       |j                  «        |j	                  d|f«      j                  «       d   }|j                  «        t        d|› dt        |«      › d|› d�«       y# t        $ r}t        d|› �«       Y d}~Œôd}~ww xY w)u@   å°†æœ¬åœ°æ•°æ�®ç›´æŽ¥å†™å…¥ search.dbï¼ˆæœ�åŠ¡å™¨æœ¬åœ°æ¨¡å¼�ï¼‰u   
ðŸ“¤ å�Œæ­¥åˆ° search.db...zPSELECT title, url, content, publish_date, summary FROM crawl_results ORDER BY idu     æœ¬åœ°æ²¡æœ‰æ•°æ�®Nr   zPRAGMA journal_mode=WALr   r   zwINSERT OR IGNORE INTO gov_raw (title, page_url, content, publish_date, summary, site_name, tags) VALUES (?,?,?,?,?,?,?)r   i ¡ i,  r+   z	  Error: z±INSERT INTO gov_search(rowid,title,site_name,summary) SELECT r.id,r.title,r.site_name,r.summary FROM gov_raw r WHERE r.id NOT IN (SELECT rowid FROM gov_search) AND r.site_name=?z.SELECT COUNT(*) FROM gov_raw WHERE site_name=?z  OK r,   u    æ�¡å�Œæ­¥åˆ° search.db (DBå…±u   æ�¡))Úprintr   r   r	   r
   ÚfetchallÚcloseÚtotal_changesÚ	Exceptionr   ÚfetchoneÚlen)r   ÚrowsÚdstÚ	site_nameÚ	new_countÚrrC   r&   ÚcontentÚpub_dater_   ÚeÚtotals                r   Úsync_to_serverru   �   s™  € ä	Ð
)Ô*ä�?‰?œ7Ó#€DØ�<‰<ÐjÓk×tÑtÓv€DØ‡J�J„LáÜÐ$Ô%Øä
�/‰/Ð+Ó
,€CØ‡K�KÐ)Ô*à'€IØ€IØò #ˆØ12Ñ.ˆˆs�G˜X wð	#Ø�K‰Kð)ð ˜˜gšm¨¨W¨fÐ5°x²~À2Ø’-˜R  #Ð&¨	°2ð7ô	ð × Ñ  1Ò$Ø˜Q‘�	øð#ð �1‚}Ø�
‰
Œà�‰ðQð ˆLô		ð
 	�
‰
Œà�K‰KØ8¸9¸,óHßHPÉË
ÐSTñV€Eà‡I�I„Kä	ˆE�)�˜Aœc $›i˜[Ð(FÀuÀgÈTÐ
RÕSøô# ò 	#Ü�I˜a˜S�/×"Ñ"ûð	#ús   Â?E&Å&	FÅ/FÆFc           
      ó¤  ‡$— t        «       }ddddœ}g }dd l}|j                  j                  «       }t        j
                  j                  t        j
                  j                  |«      «      Š$d:ˆ$fd„	}t        d«        |t        «      }t        |«      }|j                  |«       t        dt        |«      › d�«       d}	t        j                  j                  d«      }
d	}d
dddddddddœ	}|	dz   }|D ��ch c]  \  }}}|’Œ
 }}}|j                  d«      j!                  «       D �ch c]  \  }|’Œ }}t        dt        |«      › d�«       dD �]  }||	z   dz
  }|t"        kD  r nøt        d|› d|› d�«       |› d|› d|› d|
› d�}t        j                  j%                  |«      j'                  «       }	  |||«      }t        |«      }|D ���cg c]  \  }}}||vsŒ|||f‘Œ }}}}|rA|j                  |«       |j)                  d„ |D «       «       t        dt        |«      › d�«       t        |«      dk  rt        d «        n	 t/        j0                  d#«       �Œ t        d$t        |«      › d%�«       |D �cg c]  }|d   |vsŒ|‘Œ }}t        d&t        |«      › d't        |«      › d�«       t3        |«      D ]­  \  }\  }}}| dkD  r|| k\  r nš	 t5        |«      }t7        |«      \  } }!t9        |«      xs |}"|j                  d(|d d) || |"|!f«       |j;                  «        t        | xs d*«      }#t        d+|#› d,|d d" › �«       |d-xx   dz  cc<   t/        j0                  d#«       Œ¯ |j=                  «        t        d3d4› �«       t        d5|d-   › d6|d7   › d8|d2   › �«       |d-   dkD  rt?        «        y t        d9«       y c c}}w c c}w c c}}}w # t*        $ r%}t        d!t-        |«      d d" › �«       Y d }~�Œ»d }~ww xY wc c}w # t*        $ r7}t        d.t-        |«      d d/ › d0|d d1 › �«       |d2xx   dz  cc<   Y d }~Œôd }~ww xY w);Nr   )ÚnewÚskipÚerrorsc                 óä   •— t         j                  j                  | |dt        dœ¬«      }|r|j	                  dd«       ‰j                  ||¬«      }|j                  «       j                  dd«      S )	Nr   )r   ÚReferer)Údatar   zContent-Typez!application/x-www-form-urlencodedr   r   r   )r    r!   r"   ÚLIST_URLÚ
add_headerÚopenr$   r%   )r&   Ú	post_datar   r'   r(   Úopeners        €r   Úfetch_with_cookiesz!crawl.<locals>.fetch_with_cookiesË   si   ø€ Ü�n‰n×$Ñ$ S¨yØXÜñC
Ð$ó ˆñ Ø�N‰N˜>Ð+NÔOØ�{‰{˜3¨ˆ{Ó0ˆØ�y‰y‹{×!Ñ! '¨8Ó4Ð4r   u   ðŸ“ƒ ç¬¬1é¡µu     ðŸ“„ æ��å�– u    æ�¡r   r   z7http://www.boxing.gov.cn/module/web/jpage/dataproxy.jspÚ2Ú1Ú453zhttp://www.boxing.gov.cn/Ú117915Ú692184Ú0)	ÚpageÚcolÚwebidÚpathÚcolumnidÚsourceContentTypeÚunitidÚwebnameÚpermissiontyper+   zSELECT url FROM crawl_resultsu     ðŸ“š æœ¬åœ°å·²æœ‰ )é.   é[   éˆ   éµ   éâ   i  i<  ii  rV   iè  iÜ  iÐ  iÄ	  i¸  i¬  i   iÌ  u   ðŸ“ƒ æ��å�– (rec ú-ú)z?startrecord=z&endrecord=zS&perpage=15&unitid=692184&webid=453&path=http%3A%2F%2Fwww.boxing.gov.cn%2F&webname=z;&col=1&columnid=117915&sourceContentType=1&permissiontype=0c              3   ó(   K  — | ]
  \  }}}|–— Œ y ­w)N© )Ú.0Ú_Úus      r   ú	<genexpr>zcrawl.<locals>.<genexpr>  s   è ø€ Ò$A©7¨1¨a°¤QÑ$Aùs   ‚u     ðŸ“„ +é
   u     â�¹ï¸� æ•°æ�®è€—å°½u     âš ï¸� è¯·æ±‚å¤±è´¥: é2   g333333Ó?u   
ðŸ“„ å…±æ��å�– u%    æ�¡é“¾æŽ¥ï¼Œå¼€å§‹æŠ“å�–è¯¦æƒ…é¡µ...u     â�© è¿‡æ»¤å�Žå¾…æŠ“è¯¦æƒ… u    æ�¡ (æœ¬åœ°å·²æœ‰ zcINSERT OR IGNORE INTO crawl_results (title, url, content, publish_date, summary) VALUES (?,?,?,?,?)rV   r   u     âœ… zB | rw   u     â�Œ é<   z | é(   ry   ú
z2==================================================u   ðŸ�� æ–°å¢ž:u    è·³è¿‡:rx   u    é”™è¯¯:u"   âš ï¸� æ— æ–°æ•°æ�®ï¼Œè·³è¿‡å�Œæ­¥)Né   ) r   Úhttp.cookiejarÚ	cookiejarÚ	CookieJarr    r!   Úbuild_openerÚHTTPCookieProcessorre   r}   r<   Úextendrk   ÚparseÚquoter
   rf   ÚTOTAL_RECORDSÚ	urlencodeÚencodeÚupdateri   r   ÚtimeÚsleepÚ	enumerater)   r`   rc   r   rg   ru   )%Ú
test_limitr   ÚstatsÚ	all_linksÚhttpÚcjr‚   r6   r7   Ú
BATCH_SIZEÚwebname_encÚ	proxy_urlÚ
ajax_paramÚ	start_recrœ   r�   Úexisting_urlsÚlocal_existÚsrÚerr&   Ú	post_bodyr|   Ú	new_linksrA   rb   Ú
new_uniquers   ÚxÚidxrC   Ú	list_daterq   r_   rr   Úsizer�   s%                                       @r   ÚcrawlrÉ   Á   s–  ø€ Ü‹9€DØ˜q¨AÑ.€EØ€Ió Ø	�‰×	!Ñ	!Ó	#€BÜ�^‰^×(Ñ(¬¯©×)KÑ)KÈBÓ)OÓP€Fõ5ô 
ˆ.ÔÙœhÓ'€DÜ# DÓ)€EØ×Ñ�UÔÜ	ˆNœ3˜u›:˜, dÐ
+Ô,ð
 €JÜ—,‘,×$Ñ$Ð%<Ó=€KØI€IàØØØ+ØØ ØØ*Øñ
€Jð ˜Q‘€IØ&/×0™7˜1˜a ’QÐ0€MÑ0ð "&§¡Ð.MÓ!N×!WÑ!WÓ!YÖZ™˜!’1ÐZ€KÐZÜ	Ð ¤ [Ó!1Ð 2°$Ð
7Ô8àió ˆØ�*‰_˜qÑ ˆØ”ÒÙäÐ! "  Q r d¨!Ð,Ô-à�˜=¨¨¨K¸°tð  <Oð  P[ð  O\ð  \Wð  XˆÜ—L‘L×*Ñ*¨:Ó6×=Ñ=Ó?ˆ	ð	;Ù% c¨9Ó5ˆDÜ/°Ó5ˆIØ3<×WÐW©¨¨1¨aÀÈÒ@V˜1˜a š)ÐWˆJÒWáØ× Ñ  Ô,Ø×$Ñ$Ñ$A°jÔ$AÔAÜ˜¤ Z£Ð 1°Ð6Ô7ä�9‹~ Ò"ÜÐ-Ô/Ùð #ô 	�
‰
�3Žð5ô8 
Ðœc )›nÐ-Ð-RÐ
SÔTð &ÖA�q¨¨1©°[Ò)@’ÐA€IÐAÜ	Ð(¬¨Y«Ð(8Ð8KÌCÐP[ÓL\ÐK]Ð]^Ð
_Ô`ä(1°)Ó(<ò Ñ$ˆÑ$ˆe�S˜)Ø˜Š>˜c ZÒ/Ùð	!Ü˜“:ˆDä.¨tÓ4ÑˆG�WÜ'¨Ó-Ò:°ˆHà�L‰LØuØ�t˜�˜c 7¨H°gÐ>ôð �K‰KŒMä�w’} "Ó%ˆDÜ�F˜4˜&  U¨3¨B Z LÐ1Ô2Ø�%‹L˜AÑ‹Lô 	�
‰
�3�ð/ð2 	‡J�J„Lä	ˆBˆvˆhˆ-ÔÜ	ˆL˜˜u™˜ h¨u°V©}¨o¸XÀeÈHÁoÐEVÐ
WÔXàˆU�|�aÒÜÕäÐ2Õ3ùóU 1ùò [ùô  Xøô ò 	;ÜÐ+¬C°«F°3°B¨K¨=Ð9×:Ò:ûð	;üò Bøô, ò 	!Ü�Fœ3˜q›6 # 2˜;˜- s¨5°°"¨:¨,Ð7Ô8Ø�(‹O˜qÑ �OˆOûð	!úsb   Ã8OÄ)OÆ5OÇO
ÇO
Ç$A OÉ;P
ÊP
ËBPÏOÏ	PÏ"PÐPÐ	QÐ-Q
Ñ
QÚ__main__z--fullÚ
store_true)Úactionz--test)ÚtypeÚdefaultz--sync)r´   )r¤   )r   ))Ú__doc__ÚjsonÚosr.   r   Ú
subprocessÚsysr±   Úurllib.parser    Úurllib.requestÚ	SITE_NAMEr}   r4   rŒ   Ú
expanduserr	   Ú
SERVER_SSHÚSERVER_SEARCH_DBr­   ÚPER_PAGEÚ	PROXY_URLr   r   r)   r<   rJ   r`   rc   ru   rÉ   Ú__name__ÚargparseÚArgumentParserÚparserÚadd_argumentÚintÚ
parse_argsÚargsÚsyncÚtestrš   r   r   ú<module>ræ      s  ðñ÷ R× Q× Q× QÓ Qà#€	Ø>€Ø%€Ø
�'‰'×
Ñ
Ð>Ó
?€Ø €
Ø$Ð Ø€Ø€ð \€	òò ó1òð  +€òL!ò\ò.Tóbx4ðt ˆzÒÛØ$ˆX×$Ñ$Ó&€FØ
×Ñ˜¨ÐÔ6Ø
×Ñ˜ s°AÐÔ6Ø
×Ñ˜¨ÐÔ6Ø×ÑÓ€Dà‡y‚yÙÕá˜Ÿ™Ö#ð r   