Ë
    è‡zjr1  ã                   ó¼  — 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
mZ dZdZeez   ZdZdZdZd	Zd
dddœZdD ]I  Zej,                  j/                  e«      sŒeej,                  vsŒ.ej,                  j1                  de«       ŒK dZ eej6                  «      D ]k  \  ZZej=                  d«      r	  eejA                  dd«      d   «      ZŒ4edk(  sŒ:edz    e"ej6                  «      k  sŒS	  eej6                  edz      «      ZŒm edk\  rendZ#d„ Z$dd„Z%d„ Z&d„ Z'd„ Z(d„ Z)d„ Z*e+dk(  r e*«        yy# e$ r dZY �Œw xY w# e!$ r Y Œ°w xY w# e!$ r Y Œ»w xY w)u�  
ç„¦ä½œå¸‚åŸŽä¹¡ä¸€ä½“åŒ–ç¤ºèŒƒåŒºç®¡å§”ä¼š - å…¬ç¤ºå…¬å‘Š
https://www.jzxq.gov.cn/zwgk/gsgg/

CMS: ç„¦ä½œç»Ÿä¸€å¹³å�° (t.jiaozuo.gov.cn èµ„æº� + paging.js åˆ†é¡µ)
åˆ—è¡¨: div#pageDec > ul > li > a.item[href=/YYYY/MM-DD/N.html] > i + æ ‡é¢˜æ–‡æœ¬ + span æ—¥æœŸ
      æ¯�é¡µ 24 æ�¡ (pageDec pagesize=24 pagecount=1426 â†’ 60é¡µ)
åˆ†é¡µ: é¦–é¡µ /zwgk/gsgg/ (æˆ– index.html)ï¼›ç¬¬ N+1 é¡µ = /zwgk/gsgg/index_{N}.html
      (paging.js goto: page-=1 â†’ reLoadUrl + 'index' + returnp + '.html', 0-based)
è¯¦æƒ…: div.cont > div.newtit (æ ‡é¢˜) + div.newtime span (å�‘è¡¨æ—¶é—´ï¼šYYYY-MM-DD) + div.newc (æ­£æ–‡, p+table)
      meta SiteIDCode=4108900001, newsId hidden å­—æ®µ
é    N)ÚBeautifulSoupzhttps://www.jzxq.gov.cnz/zwgk/zfxxgkml/u1   ç„¦ä½œç¤ºèŒƒåŒºç®¡å§”ä¼š-æ”¿åºœä¿¡æ�¯å…¬å¼€ç›®å½•u   æ²³å�—zcrawl_jzxq_zfxxgkml.pyz/mnt/data/search.dbzkMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36z?text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8zzh-CN,zh;q=0.9)z
User-AgentÚAcceptzAccept-Language)ú/root/gov_crawlerr   é   z--pages=ú=z--pagesc                 óR  — | syt        j                  | «      } t        j                  dd| «      } | j	                  dd«      j	                  dd«      j	                  dd«      j	                  dd«      j	                  dd«      } t        j                  d	d| «      } | j                  «       S )
zYunescape entities + strip &middot;&nbsp; prefix + strip zero-width + collapse whitespace.Ú u   ^\s*[Â·â€¢]+\s*õ   Â ú u   â€‹u   â€Œu   â€�u   ï»¿ú\s+)Úhtml_libÚunescapeÚreÚsubÚreplaceÚstrip)Úts    ú(/root/gov_crawler/crawl_jzxq_zfxxgkml.pyÚclean_titler   B   s‘   € áØÜ×Ñ˜!Ó€AÜ
�‰Ð! 2 qÓ)€AØ	�	‰	�&˜#Ó×&Ñ& x°Ó4×<Ñ<¸XÀrÓJ×RÑRÐS[Ð]_Ó`×hÑhÐiqÐsuÓv€AÜ
�‰ˆv�s˜AÓ€AØ�7‰7‹9Ðó    c                 óJ  — dd l }d }t        |«      D ]d  }	 |xs |j                  | t        |¬«      }|j                  dk(  r|j
                  xs d|_        |c S |}t        j                  d|dz   z  «       Œf t        |t        «      r|‚|S # t        $ r}|}Y d }~ŒAd }~ww xY w)Nr   )ÚheadersÚtimeoutéÈ   zutf-8g      ø?r   )ÚrequestsÚrangeÚgetÚHEADERSÚstatus_codeÚapparent_encodingÚencodingÚ	ExceptionÚtimeÚsleepÚ
isinstance)	ÚurlÚsessionr   Úretriesr   ÚlastÚiÚrÚes	            r   Úfetchr-   M   s©   € ÛØ€DÜ�7‹^ò 	"ˆð	ØÒ$˜H×)Ñ)¨#´wÈÐ)ÓPˆAØ�}‰} Ò#Ø×0Ñ0Ò;°G�”
Ø’ØˆDô 	�
‰
�3˜!˜a™%‘=Õ!ð	"ô �$œ	Ô"Øˆ
Ø€Køô ò 	Ø�Dûð	ús   –ABÁBÂ	B"ÂBÂB"c           
      ór	  ‡‡‡‡— | sddg fS t        j                  dd| t         j                  ¬«      } t        j                  dd| t         j                  t         j                  z  ¬«      } t        j                  dd| t         j                  t         j                  z  ¬«      } t        rQ	 t	        | d«      }|j                  d«      D ]%  }d	D ]  }|j                  j                  |d
«       Œ  Œ' t        |«      } | }g Ši Šˆˆˆfd„}t        j                  d||t         j                  t         j                  z  ¬«      }g Šˆfd„}t        j                  d||t         j                  t         j                  z  ¬«      }t        j                  d| t         j                  «      rdnd}t        j                  dd|t         j                  ¬«      }t        j                  dd|t         j                  ¬«      }t        j                  dd|t         j                  ¬«      }g }	|j                  d«      D ]ï  }
|
j                  «       }|sŒt        j                  dd|«      }t        j                  |«      }|j                  dd«      j                  dd«      }t        j                  dd|«      }|sŒ~‰j!                  «       D ]  \  }}|j                  ||«      }Œ t#        ‰«      D ]  \  }}|j                  d|› d�|«      }Œ |	j%                  |j                  «       «       Œñ dj'                  |	«      }‰j!                  «       D ]  \  }}|j                  ||«      }Œ t#        ‰«      D ]  \  }}|j                  d|› d�|«      }Œ t        j                  dd|«      }t        j                  dd|«      }t        j                  |«      }t        j                  d d|«      }t        j                  d!d|«      }t        j                  d"d|«      }t)        «       }g }|j                  d«      D ]X  }t        j                  d#dt        j                  dd|«      «      }|sŒ2||v rŒ7|j+                  |«       |j%                  |«       ŒZ dj'                  |«      j                  «       }||‰fS # t        $ r Y �Œ»w xY w)$z¢Convert article inner HTML to stored format:
    - keep <table> HTML intact
    - 

 between <p> blocks
    - attachment <a> links embedded with absolute URL
    r	   r   z
<!--.*?-->)Úflagsz<script[^>]*>.*?</script>z<style[^>]*>.*?</style>úhtml.parserT)ÚstyleÚclassÚlangÚdirÚalignÚvalignÚwidthÚheightÚborderÚcellpaddingÚcellspacingNc                 ó:  •— | j                  d«      }| j                  d«      }t        j                  dd|«      }t        j                  |«      j                  «       }t        j                  dd|«      j                  «       }|s5t        j                  j                  |j                  d«      d   «      xs d}t        j                  j                  ‰t        j                  |«      «      }‰j                  ||f«       d	t        ‰«      › d
�}d|› d|› d�‰|<   |S )Nr   é   ú<[^>]+>r	   u   ^é™„ä»¶[:ï¼š]\s*ú?r   u   é™„ä»¶Ú__LINK__Ú__z	<a href="z" target="_blank">z</a>)Úgroupr   r   r   r   r   ÚosÚpathÚbasenameÚsplitÚurllibÚparseÚurljoinÚappendÚlen)	ÚmÚhrefÚinnerÚtxtÚabs_urlÚkeyÚattachmentsÚlink_protectÚpage_urls	         €€€r   Ú
_link_replz html_to_text.<locals>._link_replx   só   ø€ Ø�w‰w�q‹zˆØ—‘˜“
ˆÜ�f‰f�Z  UÓ+ˆÜ×Ñ Ó$×*Ñ*Ó,ˆÜ�f‰fÐ(¨"¨cÓ2×8Ñ8Ó:ˆÙÜ—'‘'×"Ñ" 4§:¡:¨c£?°1Ñ#5Ó6ÒB¸(ˆCÜ—,‘,×&Ñ& x´×1BÑ1BÀ4Ó1HÓIˆØ×Ñ˜G S˜>Ô*Øœ˜\Ó*Ð+¨2Ð.ˆØ'¨ yÐ0BÀ3À%ÀtÐLˆ�SÑØˆ
r   z&<a\s[^>]*href="([^"]+)"[^>]*>(.*?)</a>c                 óh   •— ‰j                  | j                  d«      «       dt        ‰«      dz
  › d�S )Nr   Ú__TBL__r   rA   )rJ   rB   rK   )rL   Útable_protects    €r   Ú	_tbl_replzhtml_to_text.<locals>._tbl_repl‰   s3   ø€ Ø×Ñ˜QŸW™W Q›ZÔ(Øœ˜]Ó+¨AÑ-Ð.¨bÐ1Ð1r   z<table[^>]*>.*?</table>z<table[^>]*>r   z</p>z</p>

z	<br\s*/?>ú
z(</?(?:span|font|o:p|st1?:[a-z]+)\b[^>]*>z

r>   r
   r   z&nbsp;z[\s\u200b\u200c\u200d\ufeff]+rW   rA   z__LINK__\d+__z__TBL__\d+__z[ \t]+\nz\n{3,}z	[ \t]{2,}r   )r   r   ÚSÚIr   Úfind_allÚattrsÚpopÚstrr"   ÚsearchrF   r   r   r   r   ÚitemsÚ	enumeraterJ   ÚjoinÚsetÚadd)ÚcontentrT   Ú_soupÚtagÚattrÚcontent2rU   rY   Ú	has_tableÚpartsÚblockÚbÚplainÚkÚvr*   ÚtblÚoutÚseenÚfinalÚprQ   rR   rS   rX   s    `                    @@@r   Úhtml_to_textrx   _   s  û€ ñ Ø�1�bˆyÐÜ�f‰f�] B¨´r·t±tÔ<€GÜ�f‰fÐ1°2°wÄbÇdÁdÌRÏTÉTÁkÔR€GÜ�f‰fÐ/°°WÄBÇDÁDÌ2Ï4É4ÁKÔP€GÝð	Ü! '¨=Ó9ˆEØ—~‘~ dÓ+ò .�ð Lò .�DØ—I‘I—M‘M $¨Õ-ñ.ð.ô ˜%“jˆGð
 €HØ€KØ€Löô �v‰vÐ?ÀÈXÔ]_×]aÑ]aÔdf×dhÑdhÑ]hÔi€Hð €Mô2ô �v‰vÐ0°)¸XÌRÏTÉTÔTV×TXÑTXÉ[ÔY€HÜ—Y‘Y˜°¼¿¹Ô>‘ÀA€Iä�v‰v�g˜z¨8¼2¿4¹4Ô@€HÜ�v‰v�l D¨(¼"¿$¹$Ô?€HÜ�v‰vÐAÀ2ÀxÔWY×W[ÑW[Ô\€Hà€EØ—‘ Ó'ò  ˆØ�K‰K‹MˆÙØÜ—‘�z 2 qÓ)ˆÜ×!Ñ! %Ó(ˆØ—‘˜f cÓ*×2Ñ2°8¸SÓAˆÜ—‘Ð7¸¸UÓCˆÙØØ ×&Ñ&Ó(ò 	 ‰DˆAˆqØ—	‘	˜!˜Q“‰Að	 ä Ó.ò 	0‰FˆAˆsØ—	‘	˜G A 3 b˜/¨3Ó/‰Að	0à�‰�Q—W‘W“YÕð ð  �+‰+�eÓ
€CØ×"Ñ"Ó$ò  ‰ˆˆ1Ø�k‰k˜!˜QÓ‰ð ä˜MÓ*ò 0‰ˆˆ3Ø�k‰k˜G A 3 b˜/¨3Ó/‰ð0ô �&‰&Ð! 2 sÓ
+€CÜ
�&‰&� " cÓ
*€Cä
×
Ñ
˜CÓ
 €CÜ
�&‰&�˜d CÓ
(€CÜ
�&‰&�˜F CÓ
(€CÜ
�&‰&�˜s CÓ
(€Cô ‹5€DØ€EØ�Y‰Y�vÓò ˆÜ�f‰f�V˜R¤§¡¨
°B¸Ó!:Ó;ˆÙØØ�$‰;ØØ�‰�ŒØ�‰�Q�ðð �+‰+�eÓ
×
"Ñ
"Ó
$€Cà�	˜;Ð&Ð&øô] ò 	Úð	ús   Â*AR) Ò)	R6Ò5R6c           	      ó®  — g }t         �r#t        | d«      }|j                  dt        j                  d«      ¬«      D ]î  }|j	                  dd«      j                  «       }t        j                  d|«      sŒ:t        j                  j                  t        |«      }t        |j                  dd	¬
«      «      }|j                  d«      }d}	|rL|j                  d«      }
|
r9t        j                  d|
j                  d	¬
«      «      }|r|j!                  d«      }	|j#                  |||	f«       Œð |s¦t        j$                  d| t        j&                  «      D ]~  }t        j                  j                  t        |j!                  d«      «      }|j#                  |t        |j!                  d«      «      |j!                  d«      j                  «       f«       Œ€ |S )z*Extract (url, title, date) from list page.r0   ÚaÚitem©Úclass_rM   r	   z/\d{4}/\d{2}-\d{2}/\d+\.html$r   T©r   ÚliÚspanz^(\d{4}-\d{2}-\d{2})r   z‚<a[^>]*class="item"[^>]*href="([^"]*?/\d{4}/\d{2}-\d{2}/\d+\.html)"[^>]*>(?:<i[^>]*></i>)?([^<]*?)</a>\s*<span[^>]*>([^<]*)</span>r=   é   )r   r]   r   Úcompiler   r   ra   rG   rH   rI   ÚLIST_URLr   Úget_textÚfind_parentÚfindÚmatchrB   rJ   Úfinditerr[   )Ú	html_textrT   rb   Úsouprz   rM   rP   Útitler   ÚdateÚsprL   s               r   Ú
parse_listrŽ   Â   s~  € à€EÞÜ˜Y¨Ó6ˆà—‘˜s¬2¯:©:°gÓ+>�Ó?ò 	1ˆAØ—5‘5˜ Ó$×*Ñ*Ó,ˆDÜ—9‘9Ð=¸tÔDØÜ—l‘l×*Ñ*¬8°TÓ:ˆGÜ §
¡
¨3°d 
Ó ;Ó<ˆEà—‘˜tÓ$ˆBØˆDÙØ—W‘W˜V“_�ÙÜŸ™Ð!8¸"¿+¹+ÈD¸+Ó:QÓR�AÙØ Ÿw™w q›z˜Ø�L‰L˜' 5¨$Ð/Õ0ð	1ñ  ä—‘ð RØ”r—t‘tó
ò 	QˆAô —l‘l×*Ñ*¬8°Q·W±W¸Q³ZÓ@ˆGØ�L‰L˜'¤;¨q¯w©w°q«zÓ#:¸A¿G¹GÀA»J×<LÑ<LÓ<NÐOÕPð	Qð €Lr   c           	      óh  — d}d}d}t         rçt        | d«      }|j                  dt        j                  d«      ¬«      }|rt	        |j                  dd¬«      «      }|j                  dt        j                  d	«      ¬«      }|r<|j                  dd¬«      }t        j                  d
|«      }	|	r|	j                  d«      }|j                  dt        j                  d«      ¬«      }
|
rt        |
«      }|r|s·t        j                  d| t        j                  «      }	|	r/t	        t        j                  dd|	j                  d«      «      «      }t        j                  d| «      }	|	r|	j                  d«      }t        j                  d| t        j                  «      }	|	r|	j                  d«      }|||fS )z.Extract title, date, content from detail page.r	   r0   ÚdivÚnewtitr|   r   Tr~   Únewtimez(\d{4})-(\d{2})-(\d{2})r   Únewcz<div class="newtit">(.*?)</div>r>   r   u(   å�‘è¡¨æ—¶é—´[ï¼š:]\s*(\d{4}-\d{2}-\d{2})z(<div class="newc">(.*?)<div class="ht10")r   r†   r   r‚   r   r„   ra   rB   r`   r[   r   )r‰   rT   r‹   rŒ   Úcontent_htmlrŠ   ÚntÚntmrO   rL   Úncs              r   Úparse_detailr˜   ã   s`  € à€EØ€DØ€LÝÜ˜Y¨Ó6ˆà�Y‰Y�u¤R§Z¡Z°	Ó%:ˆYÓ;ˆÙÜ §¡¨C°t Ó <Ó=ˆEà�i‰i˜¤b§j¡j°Ó&<ˆiÓ=ˆÙØ—,‘,˜s¨$�,Ó/ˆCÜ—	‘	Ð4°cÓ:ˆAÙØ—w‘w˜q“z�à�Y‰Y�u¤R§Z¡Z°Ó%8ˆYÓ9ˆÙÜ˜r›7ˆLÙ™ä�I‰IÐ8¸)ÄRÇTÁTÓJˆÙÜ¤§¡ z°2°q·w±w¸q³zÓ BÓCˆEÜ�I‰IÐAÀ9ÓMˆÙØ—7‘7˜1“:ˆDÜ�I‰IÐAÀ9ÌbÏdÉdÓSˆÙØŸ7™7 1›:ˆLØ�$˜Ð$Ð$r   c                 ó”  — | j                  d|f«      }|j                  «       ry	 d}	 ddlm}  ||«      }| j                  d|||||t
        t        t        ||f
«      }|j                  dkD  ryt        j                  dd|«      }	t        j                  |	«      }	t        j                  d	d
|	«      j                  «       d d }	| j                  d|j                  |t
        |	f«       yy# t        $ r Y Œ¼w xY w# t        j                   $ r=}
dt#        |
«      v r*t%        j&                  d«       t)        | |||||«      cY d }
~
S ‚ d }
~
ww xY w)Nz'SELECT id FROM gov_raw WHERE page_url=?FÚotherr   )Úclassify_industryz¨INSERT OR IGNORE INTO gov_raw (page_url, source_url, title, content, publish_date, site_name, group_name, script_name, has_table, industry) VALUES (?,?,?,?,?,?,?,?,?,?)r>   r	   r   r   r   zTINSERT OR IGNORE INTO gov_search (rowid, title, site_name, summary) VALUES (?,?,?,?)TÚlockedr�   )ÚexecuteÚfetchoneÚcrawler_libr›   r"   Ú	SITE_NAMEÚ
GROUP_NAMEÚSCRIPT_NAMEÚrowcountr   r   r   r   r   Ú	lastrowidÚsqlite3ÚOperationalErrorr`   r#   r$   Ústore_record)Úconnr&   r‹   rg   rŒ   rl   ÚcurÚindustryr›   Úsummaryr,   s              r   r§   r§     sF  € Ø
�,‰,Ø1Ø	ˆó€Cð ‡|�|„~ØðØˆð	Ý5Ù(¨Ó/ˆHð �l‰lð+ð �#�u˜g t¬Y¼
ÄKÐQZÐ\dÐeó	
ˆð �<‰<˜!ÒÜ—f‘f˜Z¨¨WÓ5ˆGÜ×'Ñ'¨Ó0ˆGÜ—f‘f˜V S¨'Ó2×8Ñ8Ó:¸4¸CÐ@ˆGØ�L‰LØfØ—‘ ¤y°'Ð:ôð Øøô# ò 	Ùð	ûô$ ×#Ñ#ò Ø”s˜1“vÑÜ�J‰J�qŒMÜ  c¨5°'¸4ÀÓKÕKØûð	úsF   ¦C7 ©C( ·B/C7 Ã(	C4Ã1C7 Ã3C4Ã4C7 Ã7EÄ
1EÄ;EÅEÅEc            
      óÔ  — dd l } | j                  «       }|j                  j                  t        «       t        j                  t        d¬«      }|j                  d«       |j                  d«       d}d}t        «       }t        }t        ||«      }|st        d«       y |j                  }t        dt        dz   «      D ]Î  }	|	dkD  r+t        › d|	dz
  › d	�}
t        |
|«      }|sŒ&|j                  }n|}
t!        ||
«      }|sŒD|D ]†  \  }}}||v rŒ|j#                  |«       	 t        ||«      }|s|dz  }Œ2t'        |j                  |«      \  }}}|s|}|s|}t)        ||«      \  }}}|s|dz  }Œlt+        ||||||«      r|dz  }Œ‚|dz  }Œˆ ŒÐ |j-                  «        |j/                  «        t        d|› �«       y # t$        $ r }t        d
|› d|› �«       |dz  }Y d }~ŒÞd }~ww xY w)Nr   é<   )r   zPRAGMA busy_timeout=60000zPRAGMA journal_mode=WALu	   æ–°å¢ž: 0r   Úindex_z.htmlz  [ERR] z: u   æ–°å¢ž: )r   ÚSessionr   Úupdater   r¥   ÚconnectÚDB_PATHr�   re   rƒ   r-   ÚprintÚtextr   Ú_PAGESrŽ   rf   r"   r˜   rx   r§   ÚcommitÚclose)r   Úsr¨   Ú	new_countÚ
skip_countÚ	seen_urlsÚlist_urlr+   r‰   ÚpagerT   rb   r&   r‹   rŒ   Údrr,   Úd_titleÚd_dateÚd_htmlrg   rl   rR   s                          r   ÚmainrÂ   ,  s  € ÛØ×ÑÓ€AØ‡I�I×Ñ”WÔÜ�?‰?œ7¨BÔ/€DØ‡L�LÐ,Ô-Ø‡L�LÐ*Ô+à€IØ€JÜ“€Iô €HÜˆh˜Ó€AÙÜˆkÔØØ—‘€Iä�aœ !™Ó$ò & ˆØ�!Š8ä"˜ 6¨$¨q©&¨°Ð7ˆHÜ�h Ó"ˆAÙØØŸ™‰IàˆHÜ˜9 hÓ/ˆÙØØ %ò 	 ÑˆC�˜Ø�iÑØØ�M‰M˜#ÔðÜ˜3 “]�ñ
 Ø˜a‘�
ØÜ&2°2·7±7¸CÓ&@Ñ#ˆG�V˜VÙØ�ÙØ�Ü.:¸6À3Ó.GÑ+ˆG�Y ÙØ˜a‘�
ØÜ˜D # w°¸ÀÔKØ˜Q‘‘	à˜a‘‘
ñ3	 ð& ðP 	‡K�K„MØ‡J�J„LÜ	ˆH�Y�KÐ
 Õ!øô/ ò Ü˜   R¨ sÐ+Ô,Ø˜a‘�
Üûðús   Ä"F>Æ>	G'ÇG"Ç"G'Ú__main__)Né   r�   ),Ú__doc__ÚsysrC   r   r#   Úhtmlr   Úurllib.parserG   r¥   Úbs4r   ÚImportErrorÚBASE_URLÚ	LIST_PATHrƒ   r    r¡   r¢   r²   r   Ú_prD   ÚisdirÚinsertÚ
_MAX_PAGESrc   Úargvr*   rz   Ú
startswithÚintrF   Ú
ValueErrorrK   rµ   r   r-   rx   rŽ   r˜   r§   rÂ   Ú__name__© r   r   ú<module>r×      s±  ðñó Û 	Û 	Û Û Û Û ðÝ!ð
 %€Ø€	Ø�iÑ€Ø?€	Ø€
Ø&€Ø
€ð @ØOØ'ñ€ð 5ò €BØ	‡w�w‡}�}�RÕ˜R s§x¡xÒ/Ø�‰�‰˜˜2Õðð
 €
Ù�c—h‘hÓò 
�D€A€qØ‡|�|�JÔð	Ù˜QŸW™W S¨!›_¨QÑ/Ó0‰Jð 
ˆi‹˜A ™E¡C¨¯©£MÓ1ð	Ù˜SŸX™X a¨!¡e™_Ó-‰Jð
ð " Q’‰¨A€òóò$`'òFòB!%òH"òJ>"ðB ˆzÒÙ…Fð øði
 ò ØƒMðûð: ò 	Ùð	ûð
 ò 	Ùð	ús5    D: Â7EÃ3EÄ:EÅEÅEÅEÅEÅE