Ë
    yE}jL1  ã                   óÀ  — 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dl
ZddlmZ ddlmZ ej                  j!                  ej                  j#                  e«      «      Zej                  j)                  ed«      ZdZdZdZd	Zd
ZdZdZddlZddlZ ej@                  «       Z!ddiZ"dd„Z#dd„Z$d„ Z%d„ Z&d„ Z'd„ Z(d„ Z)d„ Z*d„ Z+d„ Z,e-dk(  r e,«        yy)uÆ  
è�†å·žç”Ÿæ€�çŽ¯å¢ƒå±€ â€” çŽ¯è¯„å…¬ç¤º çˆ¬è™«
========================
APIæ¨¡å¼�ï¼ˆPOST JSON â†’ åˆ—è¡¨é¡µï¼‰ï¼š
  python3 crawl_jz.py                  # å¢žé‡�ï¼ˆé»˜è®¤ï¼šå�ªçˆ¬ç¬¬1é¡µï¼‰
  python3 crawl_jz.py --full           # å…¨é‡�ï¼š223é¡µ
  python3 crawl_jz.py --pages=5        # æŒ‡å®šé¡µæ•°
  python3 crawl_jz.py --sync           # å�Œæ­¥æœ¬åœ°æ•°æ�®åˆ°æœ�åŠ¡å™¨

æ•°æ�®æµ�ï¼šæœ¬åœ° quality_results.db â†’ SCP sqlæ–‡ä»¶ â†’ æœ�åŠ¡å™¨ search.db
é    N)Údatetime)Úurljoinzquality_results.dbzroot@1.94.217.116ú/root/search.dbõ   è�†å·žå¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€zjzssthjj.zwgk.jingzhou.gov.cnzNhttp://jzssthjj.zwgk.jingzhou.gov.cn/api/content_center/document/list-data-newz$http://jzssthjj.zwgk.jingzhou.gov.cnéß   z
User-Agentz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36c                 óä   — t         j                  j                  | t        ¬«      }t         j                  j	                  ||t
        ¬«      j                  «       j                  dd¬«      S #  Y y xY w)N)Úheaders©ÚtimeoutÚcontextúutf-8Úreplace)Úerrors)ÚurllibÚrequestÚRequestÚHEADERSÚurlopenÚCTXÚreadÚdecode)Úurlr   Úreqs      ú/root/gov_crawler/crawl_jz.pyÚhttp_getr   #   sY   € Ü
�.‰.×
 Ñ
  ¬gÐ
 Ó
6€CÜ—‘×&Ñ& s°GÄSÐ&ÓI×NÑNÓP×WÑWÐX_ÐhqÐWÓrÐ	røØ‘4ús   ¦AA+ Á+A/c                 ó:  — t         j                  j                  | t        j                  |«      j                  d«      i t        ¥ddi¥¬«      }t        j                  t         j                  j                  ||t        ¬«      j                  «       «      S #  Y y xY w)Nr   zContent-Typezapplication/json;charset=UTF-8)Údatar	   r
   )r   r   r   ÚjsonÚdumpsÚencoder   Úloadsr   r   r   )r   r   r   r   s       r   Úhttp_post_jsonr"   (   sz   € Ü
�.‰.×
 Ñ
  ¬4¯:©:°dÓ+;×+BÑ+BÀ7Ó+KØ)f¬GÐ)f°^ÐEeÑ)fð !ó h€Cä—
‘
œ6Ÿ>™>×1Ñ1°#¸wÔPSÐ1ÓT×YÑYÓ[Ó\Ð	\øØ‘4ús   ÁAB ÂBc                 óâ   — t        t        dddd| ddt        j                  «       dœ«      }|r|j                  d«      d	k7  ry
|d   j                  dg «      }|d   j                  dd«      }||fS )u   é€šè¿‡APIèŽ·å�–ä¸€é¡µåˆ—è¡¨éZ   iO‹  FTé   Ú )Údept_idÚ	column_idÚhas_relatedÚis_contain_subÚ
page_indexÚ	page_sizeÚreturn_data_typeÚ
randNumberÚcodeéÈ   )Nr   r   ÚlistÚtotalr   )r"   ÚAPI_URLÚtimeÚget)Úpager   Úitemsr2   s       r   Úfetch_list_pager8   /   sz   € äœ'Ø E¸%Ø¨dÀØ¬d¯i©i«kñ$ó €Dñ
 �4—8‘8˜FÓ# sÒ*Øà�‰L×Ñ˜V RÓ(€EØ�‰L×Ñ˜W aÓ(€EØ�%ˆ<Ðó    c                 óZ  — t        | «      }|syd}t        j                  d|t        j                  «      }|r4t        j                  dd|j                  d«      «      j                  «       }|s[t        j                  d|t        j                  «      }|r4t        j                  dd|j                  d«      «      j                  «       }d}t        j                  d|t        j                  «      }|�r5|j                  d«      j                  «       }t        j                  d	d|t        j                  t        j                  z  ¬
«      }t        j                  dd|t        j                  t        j                  z  ¬
«      }t        j                  dd|«      }t        j                  dd|«      }t        j                  dd|t        j                  ¬
«      }t        j                  dd|t        j                  ¬
«      }d„ }t        j                  d||t        j                  ¬
«      }||dœS )uE   èŽ·å�–è¯¦æƒ…é¡µï¼šæ­£æ–‡HTMLï¼ˆ<!--æ­£æ–‡å†…å®¹-->â†”<!--ç»“æ�Ÿ-->ï¼‰Nr&   z2<h1[^>]*class=['"]zw-box-title['"][^>]*>(.*?)</h1>ú<[^>]+>é   z<title>(.*?)</title>z
\s*[-_].*$u%   <!--æ­£æ–‡å†…å®¹-->(.*?)<!--ç»“æ�Ÿ-->z<script[^>]*>.*?</script>)Úflagsz<style[^>]*>.*?</style>z<p>\s*<br\s*/?>\s*</p>u+   <a href="javascript:[^"]*">\s*å…³é—­\s*</a>z#<div class="zw-box-print">.*?</div>uh   <div class="zw-leader-jl">\s*<h3><span>ç›¸å…³(?:é“¾æŽ¥|æ–‡æ¡£|å›¾ç‰‡|éŸ³é¢‘|è§†é¢‘)</span></h3>.*?</div>c           	      óŽ  — g }t        j                  d| j                  d«      t         j                  «      D ]|  }|j                  d«      j	                  «       t        j
                  dd|j                  d«      «      j	                  «       }}|sŒY|sŒ\|j                  dj                  ||«      «       Œ~ dj                  |«      S )	Nz.<a[^>]*href=[\'"]([^\'"]+)[\'"][^>]*>(.*?)</a>r   r<   r;   r&   é   z<p><a href="{}">{}</a></p>ú
)	ÚreÚfinditerÚgroupÚDOTALLÚstripÚsubÚappendÚformatÚjoin)ÚmÚparasÚamÚhrefÚtexts        r   Ú	att_cleanzget_detail.<locals>.att_cleana   s£   € ØˆEÜ—k‘kÐ"SÐUV×U\ÑU\Ð]^ÓU_Ôac×ajÑajÓkò R�ØŸX™X a›[×.Ñ.Ó0´"·&±&¸ÀRÈÏÉÐRSËÓ2U×2[Ñ2[Ó2]�d�ÚšDØ—L‘LÐ!=×!DÑ!DÀTÈ4Ó!PÕQðRð —9‘9˜UÓ#Ð#r9   uH   <div class="zw-leader-jl">\s*<h3><span>ç›¸å…³é™„ä»¶</span></h3>.*?</div>)ÚtitleÚcontent)r   rA   ÚsearchrD   rF   rC   rE   ÚI)r   ÚhtmlrP   ÚhmÚtmrQ   ÚcmrO   s           r   Ú
get_detailrX   >   s§  € ä�C‹=€DÙØð €EÜ	�‰ÐIÈ4ÔQS×QZÑQZÓ	[€BÙ	Ü—‘�z 2 r§x¡x°£{Ó3×9Ñ9Ó;ˆÙÜ�Y‰YÐ.°´b·i±iÓ@ˆÙÜ—F‘F˜=¨"¨b¯h©h°q«kÓ:×@Ñ@ÓBˆEð €GÜ	�‰Ð;¸TÄ2Ç9Á9Ó	M€BÚ	Ø—(‘(˜1“+×#Ñ#Ó%ˆÜ—&‘&Ð5°r¸7Ì"Ï)É)ÔTV×TXÑTXÉ.ÔYˆÜ—&‘&Ð3°R¸ÌÏ	É	ÔRT×RVÑRVÉÔWˆä—&‘&Ð2°B¸Ó@ˆô —&‘&ÐGÈÈWÓUˆä—&‘&Ð?ÀÀWÔTV×T]ÑT]Ô^ˆä—&‘&ØwØ�œrŸy™yô*ˆò	$ô —&‘&ØWØ�w¤b§i¡iô1ˆð
  wÑ/Ð/r9   c                 ó|  ‡— | syt        j                  dd| «      }t        j                  dd|«      }t        j                  dd|«      }t        j                  |«      }t        j                  dd|«      }t        j                  d	d|«      }|j	                  «       d
d }g d¢}g }|j                  d«      D ]L  }|j	                  «       Š‰s|j                  d«       Œ't        ˆfd„|D «       «      rŒ<|j                  ‰«       ŒN dj                  |«      }t        j                  d	d|«      }|j	                  «       S )u%   ä»ŽHTMLæ��å�–çº¯æ–‡æœ¬ï¼Œä¿�ç•™æ®µè�½r&   z</(p|div|li|h[1-6]|tr|td|th)>z

z	<br\s*/?>r@   r;   z[ \t]+ú z\n{3,}Né,  )	u	   æ‰«ä¸€æ‰«u   æ‰“å�°|u   å…³é—­u   ç›¸å…³é“¾æŽ¥u   ç›¸å…³æ–‡æ¡£u   ç›¸å…³å›¾ç‰‡u   ç›¸å…³éŸ³é¢‘u   ç›¸å…³è§†é¢‘u   ç›¸å…³é™„ä»¶c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­w)N© )Ú.0ÚnÚlss     €r   ú	<genexpr>z%extract_plain_text.<locals>.<genexpr>€   s   øè ø€ Ò2 �Q˜"”WÑ2ùs   ƒ)	rA   rF   Úhtml_modÚunescaperE   ÚsplitrG   ÚanyrI   )Úhtml_contentrN   Únoise_linesÚclean_linesÚliner`   s        @r   Úextract_plain_textrj   o   s  ø€ á Ü�6‰6Ð2°F¸LÓI€DÜ�6‰6�,  dÓ+€DÜ�6‰6�*˜b $Ó'€DÜ×Ñ˜TÓ"€DÜ�6‰6�)˜S $Ó'€DÜ�6‰6�)˜V TÓ*€DØ�:‰:‹<˜˜Ð€Dò U€KØ€KØ—
‘
˜4Ó ò #ˆØ�Z‰Z‹\ˆÙØ×Ñ˜rÕ"ÜÓ2 kÔ2Õ2Ø×Ñ˜rÕ"ð#ð �9‰9�[Ó!€DÜ�6‰6�)˜V TÓ*€DØ�:‰:‹<Ðr9   c                  ó˜   — t        j                  t        «      } | j                  d«       | j	                  «        | j                  «        y )Na¼  
        CREATE TABLE IF NOT EXISTS crawl_results (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            site_id INTEGER DEFAULT 0,
            title TEXT,
            url TEXT UNIQUE,
            content TEXT,
            publish_date TEXT,
            summary TEXT,
            domain TEXT,
            category TEXT DEFAULT '',
            content_hash TEXT,
            crawl_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
        )
    )Úsqlite3ÚconnectÚ
QUALITY_DBÚexecuteÚcommitÚclose)Úconns    r   Úensure_tablers   ‡   s5   € Ü�?‰?œ:Ó&€DØ‡L�Lð ô 	ð 	‡K�K„MØ‡J�J…Lr9   c                 ó¢   — t        j                  t        «      }|j                  d| f«      }|j	                  «       }|j                  «        |d uS )Nz(SELECT id FROM crawl_results WHERE url=?)rl   rm   rn   ro   Úfetchonerq   )r   rr   ÚcurÚrs       r   Úis_url_crawledrx   ›   sA   € Ü�?‰?œ:Ó&€DØ
�,‰,ÐAÀCÀ6Ó
J€CØ�‰‹€AØ‡J�J„LØ�Dˆ=Ðr9   c                 ó  — | j                  dd«      j                  «       }|rt        |«      dk  sd|v sd|v r#t        d| j                  dd«      d d › d�«       y	| j                  d
d«      j                  «       d d }|r&t	        j
                  d|«      st        d|› d�«       y	t        j                  t        «      }	 |j                  d|| d   | j                  dd«      || j                  dd«      t        dt        j                  | j                  dd«      xs dj                  «       «      j                  «       f«       |j                  «        |j                   dkD  |j#                  «        S # |j#                  «        w xY w)NrP   r&   é   ú<ú>u     âš ï¸� è·³è¿‡æ— æ•ˆæ ‡é¢˜: 'é(   ú'FÚdateé
   z^\d{4}-\d{2}-\d{2}$u     âš ï¸� è·³è¿‡æ— æ•ˆæ—¥æœŸ: 'z‰INSERT OR IGNORE INTO crawl_results (title, url, content, publish_date, summary, domain, category, content_hash) VALUES (?,?,?,?,?,?,?,?)r   rQ   Úsummaryu   çŽ¯è¯„é˜¶æ®µr   )r5   rE   ÚlenÚprintrA   Úmatchrl   rm   rn   ro   ÚDOMAINÚhashlibÚmd5r    Ú	hexdigestrp   Útotal_changesrq   )ÚitemrP   r   rr   s       r   Ú
store_itemr‹   ¢   sR  € à�H‰H�W˜bÓ!×'Ñ'Ó)€EÙ”C˜“J ’N c¨U¡l°c¸U±lÜÐ.¨t¯x©x¸ÀÓ/CÀCÀRÐ/HÐ.IÈÐKÔLØà�8‰8�F˜BÓ×%Ñ%Ó'¨¨Ð,€DÙ”B—H‘HÐ3°TÔ:ÜÐ.¨t¨f°AÐ6Ô7Øä�?‰?œ:Ó&€DðØ�‰ð'ð �D˜‘K §¡¨)°BÓ!7¸Ø�X‰X�i Ó#¤V¨^Ü�[‰[˜$Ÿ(™( 9¨RÓ0Ò6°B×>Ñ>Ó@ÓA×KÑKÓMðOô		
ð 	�‰ŒØ×!Ñ! AÑ%à�
‰
�øˆ�
‰
�ús   ÃB"E4 Å4Fc                  ó6  — t        d«       t        j                  t        «      } | j	                  dt
        f«      j                  «       }| j                  «        |st        d«       yt        j                  d«      }|j	                  d«       d}d}|D ]Ô  }|\  }}}}	}
|xs d	j                  «       }|rt        |«      d
k  sd|v sd|v rŒ8|	xs d	j                  «       dd }	|	rt        j                  d|	«      sd	}		 |j	                  d||xs d	|	|
xs d	dd |d	|f«      }|j                  dk(  r$|j	                  d|||xs d	|	|
xs d	dd |d	f«       |j                  dkD  r|dz  }ŒÖ |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...z_SELECT title, url, content, publish_date, summary FROM crawl_results WHERE domain=? ORDER BY idu     æœ¬åœ°æ²¡æœ‰æ•°æ�®Nr   zPRAGMA journal_mode=WALr   r   r&   rz   r{   r|   r€   z^\d{4}(-\d{2}){2}$zfUPDATE gov_raw SET title=?, content=?, publish_date=?, summary=?, site_name=?, tags=? WHERE page_url=?r[   zmINSERT INTO gov_raw (title, page_url, content, publish_date, summary, site_name, tags) VALUES (?,?,?,?,?,?,?)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 ú/u    æ�¡å�Œæ­¥åˆ° search.db (DBå…±u   æ�¡))rƒ   rl   rm   rn   ro   r…   Úfetchallrq   rE   r‚   rA   r„   Úrowcountr‰   Ú	Exceptionrp   ru   )rr   ÚrowsÚdstÚ	site_nameÚ	new_countrw   rP   r   rQ   Úpub_dater�   rv   Úer2   s                 r   Úsync_to_serverr—   ¾   s:  € ä	Ð
)Ô*ä�?‰?œ:Ó&€DØ�<‰<ØiÜ	ˆ	ó÷ �hƒjð 	ð 	‡J�J„LáÜÐ$Ô%Øä
�/‰/Ð+Ó
,€CØ‡K�KÐ)Ô*à*€IØ€IØò #ˆØ12Ñ.ˆˆs�G˜X wà’˜"×#Ñ#Ó%ˆÙœ˜E›
 Qš¨#°©,¸#À¹,ØØ’N ×)Ñ)Ó+¨C¨RÐ0ˆÙœBŸH™HÐ%:¸HÔEØˆHð	#ð —+‘+ð#à˜š 2 x°'²-¸RÀÀ#Ð1FÈ	ÐSUÐWZÐ[óˆCð
 �|‰|˜qÒ Ø—‘ð-à˜C ¢¨B°¸7º=ÀbÈ$È3Ð:OÐQZÐ\^Ð_ôð
 × Ñ  1Ò$Ø˜Q‘�	øð3#ð: �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   Ã>A+G6Ç6	HÇ?HÈHc                  óº  — t         j                  dd  } d| v }d| v }|rt        «        y |rt        nd}| D �cg c]  }|j	                  d«      sŒ|‘Œ }}|r t        |d   j                  d«      d   «      }|rdnd|› d	�}t        d
t        › d|› dt        › d�«       t        «        d}dx}}	t        d|dz   «      D �]h  }
t        |
«      \  }}|€(t        d|
d›d|› d�d¬«       |
dkD  r �n;t        «        Œ<|dk(  r|}dx}}|D ]Ì  }|j                  dd«      }|sŒt        |«      r|dz  }|	dz  }	Œ.t        |«      }|j                  dd«      ||j                  dd«      xs dd d dddœ}|rN|j                  d«      xs |d   |d<   |j                  dd«      |d<   t        |j                  dd«      «      |d<   t!        |«       |dz  }|dz  }ŒÎ t        d|
d›d|› dt#        |«      › d|› d|› d�dz   d ¬«       |
d!z  dk(  r
t        «        t%        j&                  d"«       �Œk t        d#|› d$|	› d%|› �«       |dkD  rt        «        y t        d&«       y c c}w )'Nr<   z--fullz--syncz--pages=r   ú=u   å…¨é‡�u	   å¢žé‡�ï¼ˆu   é¡µï¼‰u   ðŸ”� u   çˆ¬è™« â€” u   æ¨¡å¼� (u   é¡µ)z  [pÚ3dr�   u   ] âœ— APIå¤±è´¥r&   )ÚendÚpub_urlrP   Úrel_timer€   )rP   r   r   rQ   r�   rQ   r�   u   ] âœ“ u   æ�¡ (æ–°å¢žu    è·³è¿‡ú)z
          úr%   g333333Ó?u   

ðŸ“Š å®Œæˆ�ï¼�æ–°å¢ž: u    | è·³è¿‡: u    | æ€»æ•°: u     æ— æ–°æ•°æ�®ï¼Œè·³è¿‡å�Œæ­¥)ÚsysÚargvr—   ÚTOTAL_PAGESÚ
startswithÚintrd   rƒ   Ú	SITE_NAMErs   Úranger8   r5   rx   rX   rj   r‹   r‚   r4   Úsleep)ÚargsÚ	full_modeÚ	sync_onlyÚpages_to_crawlÚaÚpages_matchÚmodeÚ
total_siteÚ	new_totalÚ
skip_totalr6   r7   r2   Úpage_newÚ	page_skiprŠ   Úpage_urlÚdetailÚentrys                      r   Úmainr·     s¯  € Ü�8‰8�A�Bˆ<€DØ˜DÐ €IØ˜DÐ €IáÜÔ˜&á$-•[°1€NØ"Ö?˜ a§l¡l°:Õ&>’1Ð?€KÐ?ÙÜ˜[¨™^×1Ñ1°#Ó6°qÑ9Ó:ˆÙ ‰8¨	°.Ð1AÀÐ&H€Dä	ˆE”)�˜K¨ v¨X´k°]À$Ð
GÔHÜ„Nà€JØÐ€I�
ä�a˜¨!Ñ+Ó,ó %ˆÜ& tÓ,‰ˆˆuØˆ=Ü�D˜˜b˜	  >Ð"2°/ÐBÈÕKØ�aŠxšÜŒG�Xà˜Š?¨˜Jà Ð ˆ�9Øò 	*ˆDØ—x‘x 	¨2Ó.ˆHÙ˜Xä˜hÔ'Ø˜Q‘�	 
¨a¡ 
°ô   Ó)ˆFàŸ™ '¨2Ó.ØØŸ™ *¨RÓ0Ò6°B¸¸Ð<ØØñˆEñ Ø!'§¡¨GÓ!4Ò!F¸¸g¹��g‘Ø#)§:¡:¨i¸Ó#<��iÑ Ü#5°f·j±jÀÈ2Ó6NÓ#O��iÑ ä�uÔØ˜‰MˆH˜9¨™>™9ð-	*ô0 	��T˜"�I˜Q˜~Ð.¨f´S¸³Z°LÀÈHÈ:ÐU\Ð]fÐ\gÐghÐiÐlrÑrÐx|Õ}Ø�"‰9˜Š>ÜŒGÜ�
‰
�3ŽðK%ôN 
Ð& y k°¸Z¸LÈÐT^ÐS_Ð
`Ôaà�1‚}ÜÕäÐ-Õ.ùòo @s   ·IÁIÚ__main__)r%   ).Ú__doc__r    ÚosrA   r   rl   r†   r4   Úbase64Ú
subprocessrT   rb   r   Úurllib.parser   ÚpathÚdirnameÚabspathÚ__file__ÚBASE_DIRrI   rn   Ú
SERVER_SSHÚ	SERVER_DBr¥   r…   r3   ÚBASE_URLr¢   ÚsslÚurllib.requestr   Ú_create_unverified_contextr   r   r   r"   r8   rX   rj   rs   rx   r‹   r—   r·   Ú__name__r]   r9   r   ú<module>rÊ      sæ   ðñ
÷ W× V× V× V× VÝ Ý  ð �7‰7�?‰?˜2Ÿ7™7Ÿ?™?¨8Ó4Ó5€Ø�W‰W�\‰\˜(Ð$8Ó9€
Ø €
Ø€	à&€	Ø	(€Ø
Z€Ø1€Ø€÷ Ø$€c×$Ñ$Ó&€ØÐWÐ
X€óó
òò/0òbò0ò(òò8?TòF@/ðD ˆzÒÙ…Fð r9   