Ë
    nÖzj,  ã                   ó¼  — 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ZddlZddlZ  ejB                  «       Z"ddi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¥  
ä½›å†ˆåŽ¿æ”¿åºœ â€” é€šçŸ¥å…¬å‘Š çˆ¬è™«
===================
æ”¿åºœCMSæ ‡å‡†æ¨¡å¼�ï¼š
  python3 crawl_fogang.py              # å¢žé‡�ï¼ˆé»˜è®¤ï¼šå�ªçˆ¬ç¬¬1é¡µæœ€æ–°ï¼‰
  python3 crawl_fogang.py --full       # å…¨é‡�ï¼š20é¡µ
  python3 crawl_fogang.py --pages=5    # æŒ‡å®šé¡µæ•°
  python3 crawl_fogang.py --sync       # å�Œæ­¥å·²æœ‰æ•°æ�®åˆ°æœ�åŠ¡å™¨

æ•°æ�®æµ�ï¼šæœ¬åœ° quality_results.db â†’ SSH â†’ æœ�åŠ¡å™¨ search.db
é    N)Údatetime)Úurljoinzquality_results.dbzroot@1.94.217.116z/root/quality_results.dbú/root/search.dbzhttp://www.fogang.gov.cnz2http://www.fogang.gov.cn/ywdt/gggs/tzgg/index.htmlé   õ   ä½›å†ˆåŽ¿äººæ°‘æ”¿åºœzwww.fogang.gov.cnz
User-Agentz[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/125.0.0.0 Safari/537.36c                 ó  — t         j                  j                  | t        ¬«      }	 t         j                  j	                  ||t
        ¬«      }|j                  «       }|j                  dd¬«      }|S # t        $ r
}Y d }~y d }~ww xY w)N)Úheaders)ÚtimeoutÚcontextzutf-8Úreplace)Úerrors)	ÚurllibÚrequestÚRequestÚHEADERSÚurlopenÚCTXÚreadÚdecodeÚ	Exception)Úurlr
   ÚreqÚrespÚrawÚtextÚes          ú!/root/gov_crawler/crawl_fogang.pyÚhttp_getr   (   sp   € Ü
�.‰.×
 Ñ
  ¬gÐ
 Ó
6€CðÜ�~‰~×%Ñ% c°7ÄCÐ%ÓHˆØ�i‰i‹kˆØ�z‰z˜'¨)ˆzÓ4ˆØˆøÜò Üûðús   §A
A2 Á2	BÂ Bc                 ó\  — g }t        «       }t        j                  d| t        j                  «      }|s%t        j                  d| t        j                  «      }|s%t        j                  d| t        j                  «      }|s|S |j	                  d«      }t        j
                  d|t        j                  «      D ]ï  }|j	                  d«      j                  «       }|j	                  d«      j                  «       xs4 t        j                  dd|j	                  d	«      «      j                  «       }|j	                  d
«      j                  «       }|r|sŒ›t        |vrŒ¤|j                  d«      st        t        |«      }||v rŒÊ|j                  |«       |j                  |||dœ«       Œñ |S )u$   ä»Žä½›å†ˆåˆ—è¡¨é¡µæ��å�–æ‰€æœ‰æ–‡ç« zT<div[^>]*class="pageList\s+listContent\s+infoList"[^>]*>(.*?)<div[^>]*class="pagedivz,id="mainContent"[^>]*>(.*?)<!--\s*main\s+Endz<body[^>]*>(.*?)</body>é   zq<li[^>]*>.*?<a[^>]*href="([^"]+)"[^>]*title="([^"]*)"[^>]*>(.*?)</a>.*?<span[^>]*class="time"[^>]*>([^<]+)</span>é   ú<[^>]+>Ú é   é   Úhttp)Útitler   Údate)ÚsetÚreÚsearchÚDOTALLÚgroupÚfinditerÚstripÚsubÚDOMAINÚ
startswithr   ÚBASE_URLÚaddÚappend)	ÚhtmlÚitemsÚ	seen_urlsÚarea_mÚareaÚmÚhrefr'   r(   s	            r   Úparse_list_pager=   3   ss  € à€EÜ“€Iô �Y‰Yð	#àŒb�i‰ió€Fñ
 ä—‘Ø;Ø”"—)‘)ó
ˆñ ä—‘Ø&Ø”"—)‘)ó
ˆñ ØˆØ�<‰<˜‹?€Dô �[‰[ð	9àŒb�i‰ióò ˆð
 �w‰w�q‹z×ÑÓ!ˆØ—‘˜“
× Ñ Ó"ÒP¤b§f¡f¨Z¸¸Q¿W¹WÀQ»ZÓ&H×&NÑ&NÓ&PˆØ�w‰w�q‹z×ÑÓ!ˆá™DØä˜ÑØà�‰˜vÔ&Üœ8 TÓ*ˆDØ�9ÑØØ�‰�dÔà�‰ØØØñ
õ 	ð+ð6 €Ló    c                 ó¼  — t        | «      }|syd}t        j                  d|«      }|r6|j                  d«      }t        j                  dd|«      j                  «       }|s[t        j                  d|t        j                  «      }|r4t        j                  dd|j                  d«      «      j                  «       }d}t        j                  d|t        j                  «      }|s%t        j                  d	|t        j                  «      }|s%t        j                  d
|t        j                  «      }|r¦|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|«      }||dœS )u.   èŽ·å�–è¯¦æƒ…é¡µï¼šæ ‡é¢˜ã€�æ­£æ–‡HTMLã€�æ—¥æœŸNr#   z<title>([^<]+)</title>r    u&   \s*-\s*ä½›å†ˆåŽ¿æ”¿åºœé—¨æˆ·ç½‘ç«™\s*$z-<h1[^>]*class="article-title"[^>]*>(.*?)</h1>r"   z�<div[^>]*class="article-content\s+article-content-body"[^>]*id="zoomcon"[^>]*>(.*?)</div>\s*<div[^>]*class="article-reldocuments"zEid="zoomcon"[^>]*>(.*?)</div>\s*<div[^>]*class="article-reldocuments"zu<div[^>]*class="article-content[^"]*"[^>]*>(.*?)</div>\s*<div[^>]*class="article-(?:reldocuments|auxiliary|extended)"z<script[^>]*>.*?</script>)Úflagsz<style[^>]*>.*?</style>z<p>\s*<br\s*/?>\s*</p>)r'   Úcontent)r   r*   r+   r-   r0   r/   r,   ÚI)r   r6   r'   ÚtmrA   Úcms         r   Ú
get_detailrE   l   s�  € ä�C‹=€DÙØð €EÜ	�‰Ð,¨dÓ	3€BÙ	Ø—‘˜“ˆä—‘Ð@À"ÀeÓL×RÑRÓTˆÙÜ�Y‰YÐGÈÌrÏyÉyÓYˆÙÜ—F‘F˜: r¨2¯8©8°A«;Ó7×=Ñ=Ó?ˆEð €GÜ	�‰ð	?àŒb�i‰ió
€Bñ
 Ü�Y‰YØTØ”"—)‘)ó
ˆñ Ü�Y‰Yð EØ”"—)‘)ó
ˆñ 
Ø—(‘(˜1“+×#Ñ#Ó%ˆä—&‘&Ð5°r¸7Ì"Ï)É)ÔTV×TXÑTXÉ.ÔYˆÜ—&‘&Ð3°R¸ÌÏ	É	ÔRT×RVÑRVÉÔWˆä—&‘&Ð2°B¸Ó@ˆð Øñð r>   c                 ó8  — | 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	                  «       S )u+   ä»ŽHTMLæ��å�–çº¯æ–‡æœ¬ï¼Œä¿�ç•™æ®µè�½ç»“æž„r#   z</(p|div|li|h[1-6]|tr|td|th)>z	</\1>\n\nz	<br\s*/?>ú
r"   z[ \t]+ú z\n{3,}z

)r*   r0   Úhtml_modÚunescaper/   )Úhtml_contentr   s     r   Úextract_plain_textrL   �   s   € áØä�6‰6Ð2°LÀ,ÓO€DÜ�6‰6�,  dÓ+€Dä�6‰6�*˜b $Ó'€Dä×Ñ˜TÓ"€Dä�6‰6�)˜S $Ó'€DÜ�6‰6�)˜V TÓ*€DØ�:‰:‹<Ðr>   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_tablerU   ®   s5   € Ü�?‰?œ:Ó&€DØ‡L�Lð ô 	ð 	‡K�K„MØ‡J�J…Lr>   c                 ó¢   — t        j                  t        «      }|j                  d| f«      }|j	                  «       }|j                  «        |d uS )Nz(SELECT id FROM crawl_results WHERE url=?)rN   rO   rP   rQ   ÚfetchonerS   )r   rT   ÚcurÚrs       r   Úis_url_crawledrZ   Â   sA   € Ü�?‰?œ:Ó&€DØ
�,‰,ÐAÀCÀ6Ó
J€CØ�‰‹€AØ‡J�J„LØ�Dˆ=Ðr>   c           
      óà  — | d   }| j                  dd«      }| j                  dt        |«      d d «      }| d   }| d   }t        j                  |xs dj	                  «       «      j                  «       }t        j                  t        «      }	 |j                  d|||||t        |f«       |j                  «        |j                  d	kD  |j                  «        S # |j                  «        w xY w)
Nr   rA   r#   Úsummaryé,  r(   r'   z}INSERT OR IGNORE INTO crawl_results (title, url, content, publish_date, summary, domain, content_hash) VALUES (?,?,?,?,?,?,?)r   )ÚgetrL   ÚhashlibÚmd5ÚencodeÚ	hexdigestrN   rO   rP   rQ   r1   rR   Útotal_changesrS   )Úitemr   rA   r\   r(   r'   Úcontent_hashrT   s           r   Ú
store_itemrf   É   sÒ   € Ø
ˆu‰+€CØ�h‰h�y "Ó%€GØ�h‰h�yÔ"4°WÓ"=¸d¸sÐ"CÓD€GØ�‰<€DØ�‰M€Eä—;‘; ¢¨2×5Ñ5Ó7Ó8×BÑBÓD€Lä�?‰?œ:Ó&€Dð
Ø�‰ð%ð �C˜ $¨´¸ÐFô		
ð 	�‰ŒØ×!Ñ! AÑ%à�
‰
�øˆ�
‰
�ús   Â;C ÃC-c                  óB  — t        d«       t        j                  t        «      } | j	                  dt
        f«      j                  «       }| j                  «        |st        d«       yt        j                  d«      }|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...z_SELECT title, url, content, publish_date, summary FROM crawl_results WHERE domain=? ORDER BY idu     æœ¬åœ°æ²¡æœ‰æ•°æ�®Nr   zPRAGMA journal_mode=WALzPRAGMA busy_timeout=300000r   r   zwINSERT OR IGNORE INTO gov_raw (title, page_url, content, publish_date, summary, site_name, tags) VALUES (?,?,?,?,?,?,?)r#   i ¡ r]   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   æ�¡))ÚprintrN   rO   rP   rQ   r1   ÚfetchallrS   rc   r   rR   rW   Úlen)rT   ÚrowsÚdstÚ	site_nameÚ	new_countrY   r'   r   rA   Úpub_dater\   r   Útotals                r   Úsync_to_serverrr   à   s²  € ä	Ð
)Ô*ä�?‰?œ:Ó&€DØ�<‰<ØiÜ	ˆ	ó÷ �hƒjð 	ð 	‡J�J„LáÜÐ$Ô%Øä
�/‰/Ð+Ó
,€CØ‡K�KÐ)Ô*Ø‡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   Â1?E=Å=	FÆFÆFc                  óF  — t         j                  dd  } d| v }d| v }|rt        «        y |r	t        }d}nK| D �cg c]  }|j	                  d«      sŒ|‘Œ }}|r t        |d   j                  d«      d   «      nd}d|› d	�}t        d
|› d�«       t        dt        › d|› d�«       t        «        t        «        d}d}t        d|dz   «      D �]  }	|	dk(  rt        }
nd|	› d�}
t        |
«      }|st        d|	d›d|› d�«       Œ7t        |«      }|st        d|	d›d|› d�«       ŒXd}d}|D ]|  }t        |d   «      r|dz  }|dz  }Œt        |d   «      }|r<|d   xs |d   |d<   |d   xs d|d<   t        |j!                  dd«      «      d d |d<   t#        |«       |dz  }|dz  }Œ~ t        d|	d›d|› dt%        |«      › d|› d|› d�d ¬!«       t'        j(                  d"«       �Œ t        «        t        d#|› d$|› �«       |dkD  rt        «        y t        d%«       y c c}w )&Nr    z--fullz--syncu   å…¨é‡�z--pages=r   ú=u	   å¢žé‡�ï¼ˆu   é¡µï¼‰u"   ðŸ”� ä½›å†ˆé€šçŸ¥å…¬å‘Šçˆ¬è™« â€” u   æ¨¡å¼�u     æ€»é¡µæ•°: u   , æœ¬æ¬¡çˆ¬å�–: u   é¡µz.http://www.fogang.gov.cn/ywdt/gggs/tzgg/index_z.htmlz  [pÚ2drh   u   ] âœ— èŽ·å�–åˆ—è¡¨é¡µå¤±è´¥u   ] âœ— æœªè§£æž�åˆ°æ�¡ç›®r   r'   rA   r#   r]   r\   u   ] âœ“ u   æ�¡ (æ–°å¢žu    è·³è¿‡ú)ú)Úendg      à?u   
ðŸ“Š å®Œæˆ�ï¼�æ–°å¢ž: u    | è·³è¿‡: u     æ— æ–°æ•°æ�®ï¼Œè·³è¿‡å�Œæ­¥)ÚsysÚargvrr   ÚTOTAL_PAGESr2   ÚintÚsplitri   rU   ÚrangeÚLIST_URLr   r=   rZ   rE   rL   r^   rf   rk   ÚtimeÚsleep)ÚargsÚ	full_modeÚ	sync_onlyÚpages_to_crawlÚmodeÚaÚpages_matchÚ	new_totalÚ
skip_totalÚpager   r6   r7   Úpage_newÚ	page_skiprd   Údetails                    r   Úmainr�     sŒ  € Ü�8‰8�A�Bˆ<€DØ˜DÐ €IØ˜DÐ €Iñ ÜÔØáÜ$ˆØ‰à"&ÖC˜Q¨!¯,©,°zÕ*B’qÐCˆÐCÙ>Iœ˜[¨™^×1Ñ1°#Ó6°qÑ9Ô:ÈqˆØ˜>Ð*¨&Ð1ˆä	Ð.¨t¨f°FÐ
;Ô<Ü	ˆMœ+˜Ð&6°~Ð6FÀcÐ
JÔKÜ	„Gä„Nà€IØ€JÜ�a˜¨!Ñ+Ó,ó $ˆØ�1Š9Ü‰CàBÀ4À&ÈÐNˆCä˜‹}ˆÙÜ�D˜˜b˜	  >Ð"2Ð2MÐNÔOØä Ó%ˆÙÜ�D˜˜b˜	  >Ð"2Ð2JÐKÔLØàˆØˆ	Øò 	ˆDÜ˜d 5™kÔ*Ø˜Q‘�	Ø˜a‘�
Øô    U¡Ó,ˆFÙØ & w¡Ò @°4¸±=��W‘Ø"(¨Ñ"3Ò"9°r��Y‘Ü"4°V·Z±ZÀ	È2Ó5NÓ"OÐPTÐQTÐ"U��Y‘ä�tÔØ˜‰MˆHØ˜‰N‰Ið	ô" 	��T˜"�I˜Q˜~Ð.¨f´S¸³Z°LÀÈHÈ:ÐU\Ð]fÐ\gÐghÐiÐosÕtÜ�
‰
�3ŽðI$ôL 
„GÜ	Ð$ Y K¨{¸:¸,Ð
GÔHð �1‚}ÜÕäÐ-Õ.ùòs Ds   ¸HÁHÚ__main__)r   ).Ú__doc__ry   Úosr*   ÚjsonrN   r_   r€   Úbase64Ú
subprocessr6   rI   r   Úurllib.parser   ÚpathÚdirnameÚabspathÚ__file__ÚBASE_DIRÚjoinrP   Ú
SERVER_SSHÚ	SERVER_DBÚSERVER_SEARCH_DBr3   r   r{   Ú	SITE_NAMEr1   ÚsslÚurllib.requestr   Ú_create_unverified_contextr   r   r   r=   rE   rL   rU   rZ   rf   rr   r�   Ú__name__© r>   r   ú<module>r¦      sì   ðñ
÷ W× V× V× V× VÝ Ý  ð �7‰7�?‰?˜2Ÿ7™7Ÿ?™?¨8Ó4Ó5€Ø�W‰W�\‰\˜(Ð$8Ó9€
Ø €
Ø&€	Ø$Ð à%€Ø?€Ø€à#€	Ø	€÷ Ø$€c×$Ñ$Ó&€àð 3ð€ó
ò7òr/òbò"ò(òò.2TòlG/ðR ˆzÒÙ…Fð r>   