Ë
    ¸¬ujË&  ã                   ó¢   — d Z ddlZdd„ZddlZddlZddlZddlmZ ddlmZ d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edk(  r e«        yy)uÛ   
æ²…æ±Ÿå¸‚-å»ºè®¾é¡¹ç›®çŽ¯è¯„
http://www.yuanjiang.gov.cn/20839/index.htm
CMS: è‡ªæœ‰CMS (GB2312)
åˆ†é¡µ: index_N.htm (Nä»Ž0å¼€å§‹ï¼Œé¦–é¡µindex.htmï¼Œç¬¬2é¡µindex_1.htm...ç¬¬10é¡µindex_9.htm)
è¯¦æƒ…: content_{id}.html
é    Nc                 ó  — t        | «      |k  r| S | d| }|j                  d«      }|j                  d«      }d|v rF|j                  d«      }|j                  d«      }||kD  r|d| }|S |j                  d«      dz  dk7  r	 |S )z/Truncate text safely without breaking HTML tagsNú<z</ú>é   r   )ÚlenÚcountÚrfind)ÚtextÚmax_lenÚ	truncatedÚopensÚclosesÚ	last_openÚ
last_closes          ú(/root/gov_crawler/crawl_yuanjiang_eia.pyÚ_safe_summaryr      s›   € ä
ˆ4ƒy�GÒØˆà�X�g�€Ià�O‰O˜CÓ €EØ�_‰_˜TÓ"€Fà
ˆiÑØ—O‘O CÓ(ˆ	Ø—_‘_ SÓ)ˆ
Ø�zÒ!à! * 9Ð-ˆIð Ðð �_‰_˜SÓ! AÑ%¨Ò*àØÐó    )Údatetime)ÚBeautifulSoupz/root/search.dbu   æ²…æ±Ÿå¸‚-å»ºè®¾é¡¹ç›®çŽ¯è¯„z+http://www.yuanjiang.gov.cn/20839/index.htmú"http://www.yuanjiang.gov.cn/20839/Úgov_rawz
User-AgentzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36c                 ó�   — | dk(  rt         }nt        › d| › d�}t        j                  |t        d¬«      }d|_        |j                  S )z;Get list page content for the given page number (0-indexed)r   Úindex_z.htmé   ©ÚheadersÚtimeoutÚgb2312)ÚLIST_URLÚBASE_URLÚrequestsÚgetÚHEADERSÚencodingr
   )ÚpageÚurlÚrs      r   Ú
fetch_pager(   /   sB   € àˆq‚yÜ‰ä�
˜&   dÐ+ˆÜ�‰�S¤'°2Ô6€AØ€A„JØ�6‰6€Mr   c                 ó¤  — t        | d«      }g }|j                  dd¬«      }|s|}|j                  d«      D �]  }|j                  d«      }|r|j                  d«      sŒ)|d   }|j	                  d¬	«      }|rt        |«      d
k  rŒQd|vrŒV|j                  d«      s7|j                  d«      rd|z   }n |j                  d«      rd|› �}n	t        |z   }d}|j                  d«      }	|	r|	j	                  d¬	«      }t        j                  dd|«      }t        j                  dd|«      j                  «       }|j                  |||dœ«       �Œ |S )z.Extract article links and dates from list pageúhtml.parserÚdivÚlists©Úclass_ÚliÚaÚhrefT)Ústripé
   Úcontent_Úhttpú/zhttp://www.yuanjiang.gov.cnú.r   Ú Úspanz\s*\u00a0+\s*ú z\s{2,})Útitler&   Údate)r   ÚfindÚfind_allr"   Úget_textr   Ú
startswithr    ÚreÚsubr2   Úappend)
ÚhtmlÚsoupÚitemsÚ	lists_divr/   Úa_tagr1   r;   Údate_strr9   s
             r   Úextract_itemsrJ   9   sV  € ä˜˜}Ó-€DØ€Eð —	‘	˜%¨�	Ó0€IÙØˆ	ð × Ñ  Ó&ó FˆØ—‘˜“ˆÙ˜EŸI™I fÔ-ØØ�V‰}ˆØ—‘ T�Ó*ˆÙœ˜E›
 RšØØ˜TÑ!Øð �‰˜vÔ&Ø�‰˜sÔ#Ø4°tÑ;‘Ø—‘ Ô%à;¸D¸6ÐB‘ä $‘�ð ˆØ�w‰w�v‹ˆÙØ—}‘}¨4�}Ó0ˆHô —‘Ð'¨¨eÓ4ˆÜ—‘�y # uÓ-×3Ñ3Ó5ˆà�‰˜u¨T¸8ÑDÖEð?FðB €Lr   c           	      ó  — d}d}d}t        j                  d| «      }|ret        |j                  d«      «      }t        |j                  d«      «      }t        |j                  d«      «      }t	        d|› d|› d|› d	�d
¬«       ||fS )z4Extract total count and max page from pagination divr   é   u   å…±(\d+)æ�¡.*?(\d+)/(\d+)é¡µr   é   z  Pagination: u   æ�¡, r6   u   é¡µT©Úflush)rA   ÚsearchÚintÚgroupÚprint)rD   ÚtotalÚmax_pageÚcurrentÚfenye_matchs        r   Úparse_paginationrX   g   s�   € à€EØ€HØ€Gô —)‘)Ð;¸TÓB€KÙÜ�K×%Ñ% aÓ(Ó)ˆÜ�k×'Ñ'¨Ó*Ó+ˆÜ�{×(Ñ(¨Ó+Ó,ˆÜ�˜u˜g U¨7¨)°1°X°J¸cÐBÈ$ÕOà�(ˆ?Ðr   c                 óš  — t        | «      }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	        |d«      }g }|j                  d«      D ]<  }t        |«      }|j                  t        |«      «       |j                  d	|› d
�«       Œ> g }|D ]¿  }dD ]  }t        j                  d|› d�d|«      }Œ t        j                  dd|«      }t        j                  dd|«      }t        j                  dd|«      }t        j                  dd|«      }t        j                  dd|«      }t        j                  dd|«      }|j                  |«       ŒÁ t        |«      }	t        d«      t        d«      z   }
t        d«      }t        j                  d|
|	t        j                  ¬«      }	t        j                  d|
|	t        j                  ¬«      }	t        j                  d||	t        j                  ¬«      }	t        j                  dd|	«      }	ddl
}|j                  |	«      }	t        j                  dt        d«      dz  |	«      }	t        j                  dd|	«      }	t        j                  t        d«      dz   t        d«      |	«      }	t        j                  dt        d«      z   t        d«      |	«      }	|	j                  «       }	t        |«      D ]9  \  }}|	j                  d	|› d
�t        d«      dz  |z   t        d«      dz  z   «      }	Œ; t        j                  dt        d«      dz  |	«      }	t        j                  dd|	«      }	|	j                  «       S )zšExtract content: plain text paragraphs + HTML tables preserved.
    Uses regex-based text extraction (not BS4 get_text) to preserve paragraph breaks.
    z<span[^>]*>r8   )Úflagsz</span>z<font[^>]*>z</font>r*   ÚtableÚ__TABLE_Ú__)	ÚstyleÚclassÚwidthÚheightÚvalignÚalignÚborderÚcellpaddingÚcellspacingr:   z="[^"]*"z<p>\s*z\s*</p>r3   z</p>\s*z	</div>\s*z<br\s*/?>\s*z<[^>]+>r   Nz\n{3,}r   u   [ 	â€‚â€ƒâ€…Â ]+)ÚstrrA   rB   Ú
IGNORECASEr   r>   r   rC   Úreplace_withÚchrrD   Úunescaper2   Ú	enumerateÚreplace)ÚelementÚhtml_strrE   Útablesr[   ÚidxÚclean_tablesÚtÚattrr
   Úreplacement_nl2Úreplacement_nlÚhtml_modÚclean_tables                 r   Ú_extract_clean_textry   w   s  € ô �7‹|€HÜ�v‰v�n b¨(¼"¿-¹-ÔH€HÜ�v‰v�j " h´b·m±mÔD€HÜ�v‰v�n b¨(¼"¿-¹-ÔH€HÜ�v‰v�j " h´b·m±mÔD€Hä˜ =Ó1€Dà€FØ—‘˜wÓ'ò /ˆÜ�&‹kˆØ�‰”c˜%“jÔ!Ø×Ñ˜X c U¨"Ð-Õ.ð/ð
 €LØò 	ˆØtò 	3ˆDÜ—‘˜!˜D˜6 Ð*¨B°Ó2‰Að	3ä�F‰F�9˜b !Ó$ˆÜ�F‰F�:˜r 1Ó%ˆÜ�F‰F�> 2 qÓ)ˆÜ�F‰F�:˜r 1Ó%ˆÜ�F‰F�> 2 qÓ)ˆÜ�F‰F�:˜r 1Ó%ˆØ×Ñ˜AÕð	ô ˆt‹9€Dä˜"“g¤ B£Ñ'€OÜ˜“W€NÜ�6‰6�*˜o¨t¼2¿=¹=ÔI€DÜ�6‰6�, °¼R¿]¹]ÔK€DÜ�6‰6�/ >°4¼r¿}¹}ÔM€Dä�6‰6�*˜b $Ó'€DãØ×Ñ˜TÓ"€Dä�6‰6�)œS ›W Q™Y¨Ó-€DÜ�6‰6Ð% s¨DÓ1€DÜ�6‰6”#�b“'˜C‘-¤ R£¨$Ó/€DÜ�6‰6�#œ˜B›‘-¤ R£¨$Ó/€DØ�:‰:‹<€Dä% lÓ3ò UÑˆˆ[Ø�|‰|˜h s e¨2Ð.´°B³¸±	¸KÑ0GÌ#ÈbË'ÐRSÉ)Ñ0SÓT‰ðUô �6‰6�)œS ›W Q™Y¨Ó-€DÜ�6‰6Ð% s¨DÓ1€DØ�:‰:‹<Ðr   c                 ó>  — 	 t        j                  | t        d¬«      }d|_        t	        |j
                  d«      } |g d¢«      D ]  }|j                  «        Œ |j                  dd¬«      xs= |j                  dd	¬
«      xs( |j                  dd¬
«      xs |j                  dd¬«      }t        |r|n|«      }t        j                  dd|«      }t        j                  dd|«      }|j                  «       S # t        $ r}t        d|› �d¬«       Y d}~yd}~ww xY w)zFetch detail page contentr   r   r   r*   )Úscriptr^   ÚnavÚfooterÚheaderÚasider+   Úzoom)Úidzyea-conr-   zarticle-conÚcontentz
{3,}z

z {2,}r:   z  [ERROR] detail: TrN   Nr8   )r!   r"   r#   r$   r   r
   Ú	decomposer=   ry   rA   rB   r2   Ú	ExceptionrS   )r&   r'   rE   ÚtagÚcontent_divr‚   Úes          r   Úfetch_detailrˆ   ¯   s  € ðÜ�L‰L˜¤g°rÔ:ˆØˆŒ
Ü˜QŸV™V ]Ó3ˆáÒOÓPò 	ˆCØ�M‰M�Oð	ð �I‰I�e ˆIÓ'ò .Ø�y‰y˜ yˆyÓ1ò.à�y‰y˜ }ˆyÓ5ò.ð �y‰y˜ 9ˆyÓ-ð	 	ô &±[¡kÀdÓKˆä—&‘&˜ 6¨7Ó3ˆÜ—&‘&˜ 3¨Ó0ˆà�}‰}‹ÐøÜò ÜÐ" 1 #Ð&¨dÕ3Üûðús   ‚C6C9 Ã9	DÄDÄDc                  ó¸  — t        j                  t        «      } | j                  «       }t	        «       }|j                  dt        f«      D ]  }|j                  |d   «       Œ d}|j                  dt        f«      j                  «       }|r
|d   r|d   }| j                  «        t        d|› �d¬«       t        dt        |«      › �d¬«       t        d«      }t        |«      \  }}t        d	|› d
|› �d¬«       g }t        |«      D ]Q  }	|	dkD  rt        |	«      }t        |«      }
t        d|	dz   › d|› dt        |
«      › d�d¬«       |j!                  |
«       ŒS t        dt        |«      › �d¬«       d}d}d}t        j                  t        «      } | j                  «       }|D �]�  }|d   }|d   }|d   }||v r|dz  }Œt#        |«      }|rt        |«      dk  r(t        d|d d › dt        |«      › d�d¬«       |s|dz  }Œ`|sg	 t%        j&                  |t(        d¬«      }d|_        t-        j.                  d|j0                  «      }|r!|j3                  d«      j5                  dd«      }|s#t7        j8                  «       j;                  d«      }t-        j<                  dd |«      d d! }|j                  d"t        t>        jA                  d«      ||||tC        |«      tE        |j5                  dd «      «      f«       |dz  }|d#z  dk(  s�Œj| jG                  «        t        d$|› d%|› d&�d¬«       �Œ� | jG                  «        | j                  «        t        d'd(› �d¬«       t        d)t        › �d¬«       t        dt        |«      › �d¬«       t        d*|› �d¬«       t        d+|› �d¬«       t        d,|› �d¬«       t        d(› d¬«       y #  Y �ŒixY w)-Nz.SELECT page_url FROM gov_raw WHERE site_name=?r   z
1900-01-01z7SELECT MAX(publish_date) FROM gov_raw WHERE site_name=?zLatest DB date: TrN   zExisting URLs: zTotal pages: z, Expected total: z  Page rL   r6   z: z itemszTotal list items: r&   r;   r<   éd   z
  [SHORT] r   z... (ú)é   r   r   z(\d{4}[-/]\d{1,2}[-/]\d{1,2})ú-z%Y-%m-%dz[^\d-]r8   r3   z³
            INSERT OR IGNORE INTO gov_raw (site_name, source_url, page_url, title, publish_date, content, summary, date_rank)
            VALUES (?, ?, ?, ?, ?, ?, ?, ?)
        é   z  Progress: z new / z skipú
z2==================================================zSite: zNew: zSkipped (existing): zErrors: )$Úsqlite3ÚconnectÚDB_PATHÚcursorÚsetÚexecuteÚ	SITE_NAMEÚaddÚfetchoneÚcloserS   r   r(   rX   ÚrangerJ   Úextendrˆ   r!   r"   r#   r$   rA   rP   r
   rR   rm   r   ÚnowÚstrftimerB   r    r2   r   rQ   Úcommit)ÚconnÚcÚexistingÚrowÚlatest_db_daterD   Útotal_countrU   Ú	all_itemsr%   rF   Ú	new_countÚ
skip_countÚerror_countÚitemr&   r;   rI   r‚   Úr2Údate_ms                        r   Úmainr¬   Ê   sÕ  € Ü�?‰?œ7Ó#€DØ�‰‹€Aô ‹u€HØ�y‰yÐIÌIÈ<ÓXò ˆØ�‰�S˜‘VÕðð "€NØ
�)‰)ÐMÔPYÈ|Ó
\×
eÑ
eÓ
g€CÙ
ˆs�1ŠvØ˜Q™ˆØ‡J�J„Lä	Ð˜^Ð,Ð
-°TÕ:Ü	ˆOœC ›M˜?Ð
+°4Õ8ô �a‹=€DÜ,¨TÓ2Ñ€K�Ü	ˆM˜(˜Ð#5°k°]Ð
CÈ4ÕPð €IÜ�h“ò  ˆØ�!Š8Ü˜dÓ#ˆDÜ˜dÓ#ˆÜ�˜˜Q™�x˜q  
¨"¬S°«Z¨L¸Ð?ÀtÕLØ×Ñ˜Õð ô 
Ðœs 9›~Ð.Ð
/°tÕ<ð €IØ€JØ€Kä�?‰?œ7Ó#€DØ�‰‹€Aàó 'RˆØ�5‰kˆØ�W‘ˆØ˜‘<ˆà�(‰?Ø˜!‰OˆJØä˜sÓ#ˆÙœ#˜g›,¨Ò,Ü�J˜u S b˜z˜l¨%´°G³¨~¸QÐ?ÀtÕLÙØ˜qÑ �ØáðÜ—\‘\ #¬wÀÔC�Ø&�”ÜŸ™Ð#CÀRÇWÁWÓM�ÙØ%Ÿ|™|¨A›×6Ñ6°s¸CÓ@�Hñ Ü—|‘|“~×.Ñ.¨zÓ:ˆHä—6‘6˜) R¨Ó2°3°BÐ7ˆà	�	‰	ð ô œŸ™¨Ó,¨c°5¸(ÀGÌ]Ð[bÓMcÔehÐiq×iyÑiyÐz}ð  @Bó  jCó  fDð  Eô	Fð 	�Q‰ˆ	à�r‰>˜QÔØ�K‰KŒMÜ�L  ¨7°:°,¸eÐDÈD×QðO'RðR 	‡K�K„MØ‡J�J„Lä	ˆBˆvˆhˆ-˜tÕ$Ü	ˆF”9�+Ð
 dÕ+Ü	Ðœs 9›~Ð.Ð
/°tÕ<Ü	ˆE�)�Ð
 TÕ*Ü	Ð   Ð
-°TÕ:Ü	ˆH�[�MÐ
"¨$Õ/Ü	ˆVˆH˜TÖ"øð7Úús   È
A&OÏOÚ__main__)iô  )Ú__doc__r!   r   r�   rA   Úosr   Úbs4r   r’   r–   r   r    Ú
TABLE_NAMEr#   r(   rJ   rX   ry   rˆ   r¬   Ú__name__© r   r   ú<module>r´      s„   ðñó óó* Û 	Û 	Ý Ý à
€Ø*€	Ø8€Ø/€Ø€
àð  Dð€òò,ò\ò 6òpò6\#ð| ˆzÒÙ…Fð r   