Ë
    ¸¬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ZddlZ	ddl
m
Z
mZ ddlmZ  ej                  dd«      ZdZdZed	z   Z e
j&                  «        ed
¬«      z
  j)                  d«      Zdedz   dœZ ej.                  «       Zej2                  j5                  e«       ddddddddœZdZd„ Zd„ Zd„ Zd„ Z d„ Z!d„ Z"e#dk(  r e"«        yy) u)  
crawl_suichang.py â€” é�‚æ˜ŒåŽ¿äººæ°‘æ”¿åºœ-å»ºè®¾é¡¹ç›®çŽ¯å¢ƒå½±å“�è¯„ä»·ä¿¡æ�¯å…¬ç¤º
Site: https://www.suichang.gov.cn/col/col1229856870/index.html
CMS: Hanweb JPAAS 4.5.12.1 (ZJSJYH)
List: API /api-gateway/jpaas-publish-server/front/page/build/unit
Detail: div.zfxxgk_zdgkc > <p> article body
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoupÚ	SEARCH_DBz/root/search.dbu:   suichang.gov.cn-å»ºè®¾é¡¹ç›®çŽ¯å¢ƒå½±å“�è¯„ä»·ä¿¡æ�¯å…¬ç¤ºzhttps://www.suichang.gov.cnz7/api-gateway/jpaas-publish-server/front/page/build/unitiG  )Údaysz%Y-%m-%dz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36z/col/col1229856870/index.html)z
User-AgentÚRefererÚbulidstaticÚ3640ÚcgFjwQ1lk8DUXJTOn8cFrÚcolumnu   æ–‡ç« åˆ—è¡¨ÚnullÚ
1229856870)Ú	parseTypeÚwebIdÚtplSetIdÚpageTypeÚtagIdÚeditTypeÚpageIdé   c                 ó¦   — 	 t         j                  | d¬«      }d|_        |j                  S # t        $ r}t        d| › d|› �«       Y d }~y d }~ww xY w)Né   ©Útimeoutzutf-8z  [ERR] fetch failed: z - )ÚsessionÚgetÚencodingÚtextÚ	ExceptionÚprint)ÚurlÚrÚes      ú#/root/gov_crawler/crawl_suichang.pyÚfetchr%   )   sR   € ðÜ�K‰K˜ RˆKÓ(ˆØˆŒ
Ø�v‰vˆøÜò ÜÐ& s e¨3¨q¨cÐ2Ô3Üûðús   ‚), ¬	AµAÁAc                 ó¸  — t        t        «      }t        j                  | t        dœd¬«      |d<   t
        j                  j                  |«      }t        › d|› �}	 t        j                  |d¬«      }|j                  dk7  ry	|j                  «       }|j                  d
i «      j                  dd«      S # t        $ r}t        d| › d|› �«       Y d	}~y	d	}~ww xY w)zFetch list page from API)ÚpageNoÚpageSizeF)Úensure_asciiÚ	paramJsonú?r   r   éÈ   NÚdataÚhtmlÚ z  [ERR] API page z: )ÚdictÚBASE_PARAMSÚjsonÚdumpsÚ	PAGE_SIZEÚurllibÚparseÚ	urlencodeÚAPI_URLr   r   Ústatus_coder   r    )Úpage_noÚparamsÚqsr!   r"   Údr#   s          r$   Ú	fetch_apir>   3   sÃ   € ä”+Ó€FÜŸ*™*°ÄYÑ%OÐ^cÔd€Fˆ;ÑÜ	�‰×	Ñ	 Ó	'€BÜˆI�Q�r�dÐ
€CðÜ�K‰K˜ RˆKÓ(ˆØ�=‰=˜CÒØØ�F‰F‹HˆØ�u‰u�V˜RÓ ×$Ñ$ V¨RÓ0Ð0øÜò ÜÐ! ' ¨"¨Q¨CÐ0Ô1Üûðús   Á&B5 Â1B5 Â5	CÂ>CÃCc                 ó"  — g }d}t        j                  || «      D ]q  }|j                  d«      }|j                  d«      j                  «       }|j                  d«      }|j	                  d«      s	t
        |z   }|j                  |||f«       Œs |S )z6Parse list HTML, return list of (url, title, date_str)zJ<a href="([^"]+)"\s+title="([^"]*)"[^>]*>.*?</a><b>(\d{4}-\d{2}-\d{2})</b>é   é   é   Úhttp)ÚreÚfinditerÚgroupÚstripÚ
startswithÚBASE_URLÚappend)r.   ÚitemsÚpatternÚmÚhrefÚtitleÚdate_strs          r$   Ú
parse_listrQ   D   s…   € à€Eà[€GÜ�[‰[˜ $Ó'ò .ˆØ�w‰w�q‹zˆØ—‘˜“
× Ñ Ó"ˆØ—7‘7˜1“:ˆØ�‰˜vÔ&Ü˜d‘?ˆDØ�‰�d˜E 8Ð,Õ-ð.ð €Ló    c                 óî  — d}t        j                  d| «      }|r|j                  d«      j                  «       }|s7t        j                  d| «      }|r|j                  d«      j                  «       }d}t        j                  d| «      }|r|j                  d«      }d}| j	                  d«      }|dk  r| j	                  d«      }|dk\  �r%| j	                  d	|«      dz   }d}|}	|	t        | «      k  rþ|dkD  rù| |	|	d
z    dk(  r"| j	                  d|	«      }
|
|	kD  r|
dz   n|	dz   }	Œ@| |	   dk(  r«| |	|	dz    dk(  rŠ|dz  }|dk(  r�| ||	 }|j	                  d|j	                  d«      «      }|dkD  r|dz  }|}nd}t        |«      }dD ]"  }|j	                  ||«      }|dkD  sŒ||k  sŒ!|}Œ$ ||k  r||| j                  «       }n/| |	|	d
z    dk(  r|dz  }|	dz  }	n|	dz  }	|	t        | «      k  r|dkD  rŒù|||fS )z8Parse detail page, return (title, publish_date, content)r/   z+<meta name="ArticleTitle" content="([^"]*)"r@   z<title>(.*?)</title>z1<meta name="PubDate" content="(\d{4}-\d{2}-\d{2})zclass="zn_contM"r   Úzn_contMú>é   z<!--z-->rB   ú<é   z</divz</div>zclass="zcjd"é   )z
class="fj"zclass="fj2"z<div class="ewmBoxz<div)rD   ÚsearchrF   rG   ÚfindÚlen)r.   r!   rO   rM   rP   ÚcontentÚ	znm_startÚ	div_startÚdepthÚiÚendcÚinnerÚzcjd_endÚ
body_startÚbody_endÚmkÚposs                    r$   Úparse_detailri   S   sC  € ð €EÜ
�	‰	Ð@À$ÓG€AÙØ—‘˜“
× Ñ Ó"ˆñ Ü�I‰IÐ-¨tÓ4ˆÙØ—G‘G˜A“J×$Ñ$Ó&ˆEð €HÜ
�	‰	ÐFÈÓM€AÙØ—7‘7˜1“:ˆð €Gà—	‘	Ð,Ó-€IØ�1‚}Ø—I‘I˜jÓ)ˆ	à�Aƒ~à—I‘I˜c 9Ó-°Ñ1ˆ	ð ˆØˆØ”#�d“)Šm ¨¢	Ø�A�a˜‘cˆ{˜fÒ$Ø—y‘y ¨Ó*�Ø $ q¢�D˜1’H¨a°!©e�ØØ�A‰w˜#Š~Ø˜˜!˜A™#�; 'Ò)Ø˜Q‘J�EØ ’zØ $ Y¨qÐ 1˜à#(§:¡:¨h¸¿
¹
À>Ó8RÓ#S˜Ø# aš<Ø$¨™M˜HØ)1™Jà)*˜Jô $' u£:˜Ø"Uò /˜BØ"'§*¡*¨R°Ó"<˜CØ" Q›w¨3°«>Ø+.¡ð/ð
 &¨Ò0Ø&+¨J°xÐ&@×&FÑ&FÓ&H˜GØØ˜!˜A˜a™C�[ FÒ*Ø˜Q‘J�EØ�Q‘‘à�Q‘�ðA ”#�d“)Šm ¨£	ðD �(˜GÐ#Ð#rR   c                  óÐ   — t        d«      } | syt        j                  d| «      }|r@t        |j	                  d«      «      }|t
        z   dz
  t
        z  }t        d|› d|› �«       |S y)z(Get total pages from API page 1 responser@   zcount="(\d+)"z  Total items: z	, pages: )r>   rD   rZ   ÚintrF   r4   r    )r.   rM   ÚtotalÚpagess       r$   Úget_total_pagesrn   š   sg   € ä�Q‹<€DÙØä
�	‰	Ð" DÓ)€AÙÜ�A—G‘G˜A“J“ˆØœÑ" QÑ&¬9Ñ4ˆÜ� ˜w i°¨wÐ7Ô8ØˆØrR   c                  óF  — t        dt        › d�«       t        dt        › �«       t        «       } | dk(  rt        d«       y t	        j
                  t        «      }|j                  d«       |j                  d«       |j                  «       }d}d}t        d| dz   «      D �]¸  }t        d	|› d
| › d�«       t        |«      }|st        d|› d�«       Œ3t        |«      }|st        d|› d�«       ŒPt        dt        |«      › d�«       d}|D �]  \  }	}
}|j                  d|	f«       |j                  «       r|dz  }Œ1|t        k  r|dz  }Œ@t        |	«      }|s|dz  }ŒSt        ||	«      \  }}}|s|
}|xs |}|r	|t        k  r|dz  }Œ~|j!                  «       }|s|dz  }Œ–d}|r#t#        |d«      }|j%                  d¬«      }|d d }	 |j                  dt        ||	||t'        |j)                  dd«      «      df«       |j*                  dkD  r
|dz  }|dz  }�Œ |j/                  «        t        d|› d|› d|› d|› d�	«       t1        j2                  d «       �Œ» |j5                  «        t        d!|› d"|› d#�«       y # t,        $ r}t        d|› �«       Y d }~�Œ�d }~ww xY w)$Nz=== z ===zCutoff: r   zERROR: No pages foundzPRAGMA journal_mode=WALzPRAGMA busy_timeout=10000r@   z
Page ú/z...z  [SKIP] page z API failedz	 no itemsz  Found z itemsz)SELECT id FROM gov_raw WHERE page_url = ?r/   zhtml.parserT)rG   r,   zƒINSERT OR IGNORE INTO gov_raw (site_name, title, page_url, publish_date, content, date_rank, category) VALUES (?, ?, ?, ?, ?, ?, ?)ú-Útzggz  [ERR] insert: z  Page z: +z new (total z, skip ú)g333333Ó?z
=== Done: z new, z skipped ===)r    Ú	SITE_NAMEÚCUTOFFrn   Úsqlite3Úconnectr   ÚexecuteÚcursorÚranger>   rQ   r\   Úfetchoner%   ri   rG   r   Úget_textrk   ÚreplaceÚrowcountr   ÚcommitÚtimeÚsleepÚclose)Útotal_pagesÚconnÚcurÚ	total_newÚ
total_skipÚpager.   rK   Úpage_newr!   rO   rP   Údetail_htmlÚ
full_titleÚdetail_dater]   Ú
final_dateÚsummaryÚ	text_soupÚplainr#   s                        r$   Úmainr‘   ©   sã  € Ü	ˆD”�˜4Ð
 Ô!Ü	ˆH”V�HÐ
Ôä!Ó#€KØ�aÒÜÐ%Ô&Øä�?‰?œ9Ó%€DØ‡L�LÐ*Ô+Ø‡L�LÐ,Ô-Ø
�+‰+‹-€Cà€IØ€Jä�a˜ q™Ó)ó GˆÜ�˜�v˜Q˜{˜m¨3Ð/Ô0Ü˜‹ˆÙÜ�N 4 &¨Ð4Ô5Øä˜4Ó ˆÙÜ�N 4 &¨	Ð2Ô3Øä�œ˜U›˜ FÐ+Ô,àˆØ$)ó 4	.Ñ ˆC�˜à�K‰KÐCÀcÀVÔLØ�|‰|Œ~Ø˜a‘�
Øð œ&Ò Ø˜a‘�
Øô   ›*ˆKÙØ˜a‘�
Øä/;¸KÈÓ/MÑ,ˆJ˜ WáØ"�
à$Ò0¨ˆJÙ ¬fÒ!4Ø˜a‘�
Øà—m‘m“oˆGÙØ˜a‘�
Øð ˆGÙÜ)¨'°=ÓA�	Ø!×*Ñ*°Ð*Ó6�Ø  ˜+�ð.Ø—‘ð3ô  
¨C°¸WÜ˜×+Ñ+¨C°Ó4Ó5°vð?ô	ð —<‘< !Ò#Ø ‘M�HØ ‘N�Iùðe4	.ðl 	�‰ŒÜ�˜�v˜S  
¨,°y°kÀÈÈÐTUÐVÔWÜ�
‰
�3ŽðOGðR 	‡J�J„LÜ	ˆL˜˜ 6¨*¨°\Ð
BÕCøô ò .ÜÐ(¨¨Ð,×-Ò-ûð.ús   Ç	AI>É>	J ÊJÊJ Ú__main__)$Ú__doc__rD   ÚosÚsysr€   r2   rv   ÚrequestsÚurllib.parser5   r   r   Úbs4r   Úgetenvr   rt   rI   r8   ÚnowÚstrftimeru   ÚHEADERSÚSessionr   ÚheadersÚupdater1   r4   r%   r>   rQ   ri   rn   r‘   Ú__name__© rR   r$   ú<module>r¢      sÿ   ðñ÷ @× ?× ?× ?ß (Ý àˆB�I‰I�kÐ#4Ó5€	ØH€	Ø(€Ø
ÐNÑ
N€Ø
ˆ(�,‰,‹.™9¨%Ô0Ñ
0×	:Ñ	:¸:Ó	F€ð QØÐ9Ñ9ñ€ð
 ˆ(×
Ñ
Ó
€Ø ‡�× Ñ �wÔ ð ØØ'ØØØØñ€ð €	òòò"òD$òNò[Dð| ˆzÒÙ…Fð rR   