Ë
    ¸¬ujq*  ã                   ó&  — 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 dZedz   Zedz   ZdZdZd	Zd
ZdZddddedœZdZ eej2                  «      D ]k  \  ZZej9                  d«      r	  eej=                  dd«      d   «      ZŒ4edk(  sŒ:edz    e ej2                  «      k  sŒS	  eej2                  edz      «      ZŒm edk\  ren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)u3  
ä¸°åŸŽå¸‚äººæ°‘æ”¿åºœ - äº¤é€šè¿�è¾“å±€Â·å›žåº”å…³åˆ‡ (www.jxfc.gov.cn/fcsrmzf/hygq92/pc/list.html)
CMS: æ•°èž�/UCAP ç³» (jquery.pagination + commonApi.getQueryList)
åˆ—è¡¨: searchManuscript JSON API (POST /searchManuscript)
      body {"channelId":["1996818743475937280"],"pageSize":50,"current":N,
            "sort":"sortNum","order":"desc","notReturnContent":false}
      50æ�¡/é¡µ, å…±77æ�¡/2é¡µ. è¿”å›ž results[]: title/pubDate/content.content(HTMLæ­£æ–‡)/urls.pc
      âš ï¸� requests POST å¿…é¡»å¸¦ User-Agent + Referer (æ—  UA ä¼šè¢« nginx 403)
      âš ï¸� urls å­—æ®µæ˜¯ JSON å­—ç¬¦ä¸²éœ€äºŒæ¬¡è§£æž�
è¯¦æƒ…: API ç›´æŽ¥è¿”å›žå®Œæ•´ HTML æ­£æ–‡ (content.content) â€” æ— éœ€è¯¦æƒ…é¡µæŠ“å�–
      æ­£æ–‡å�« <table> ä¿�ç•™ / <p> æ®µè�½ / <a> é™„ä»¶é“¾æŽ¥
      h1.article-title + è¯¦æƒ…é¡µ div#zoomcon (å¤‡ç”¨)
é    N)ÚBeautifulSoupzhttps://www.jxfc.gov.cnz/fcsrmzf/hygq92/pc/list.htmlz/searchManuscriptÚ1996818743475937280u%   ä¸°åŸŽå¸‚äº¤é€šè¿�è¾“å±€-å›žåº”å…³åˆ‡u   æ±Ÿè¥¿zcrawl_fc_hygq92.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.application/json, text/javascript, */*; q=0.01zzh-CN,zh;q=0.9zapplication/json)z
User-AgentÚAcceptzAccept-LanguagezContent-TypeÚRefereré   z--pages=ú=z--pagesc                 ó  — | syt        j                  | «      } | j                  dd«      j                  dd«      j                  dd«      j                  dd«      } t        j                  dd| «      } | j                  «       S )z;unescape entities + strip zero-width + collapse whitespace.Ú u   â€‹u   â€Œu   â€�u   ï»¿ú\s+ú )Úhtml_libÚunescapeÚreplaceÚreÚsubÚstrip)Úts    ú$/root/gov_crawler/crawl_fc_hygq92.pyÚclean_titler   B   so   € áØÜ×Ñ˜!Ó€AØ	�	‰	�(˜BÓ×'Ñ'¨°"Ó5×=Ñ=¸hÈÓK×SÑSÐT\Ð^`Óa€AÜ
�‰ˆv�s˜AÓ€AØ�7‰7‹9Ðó    c           	      óà  — t        j                  t        gd|ddddœ«      }| j                  t        |t
        d¬«      }|j                  dk7  r(t        d	|j                  › d
|j                  dd › �«      ‚	 |j                  «       d   }|j                  dd«      }g }|j                  dg «      D �]  }t        |j                  dd«      xs |j                  dd«      «      }|j                  d«      xs dj                  «       }	t        j                  d|	«      }
|
r|
j                  d«      nd}d}|j                  d«      }t!        |t"        «      r|j                  d«      xs d}nt!        |t$        «      r|}|j                  dd«      }d}t!        |t$        «      r	 t        j&                  |«      }t!        |t"        «      r|j                  dd«      xs d}|r5|j)                  d«      s$t*        j,                  j/                  t0        |«      }|s�Œg|s�Œk|j3                  ||||f«       �Œ‚ ||fS # t        $ r t        d|j                  dd › �«      ‚w xY w# t        $ r i }Y Œ¶w xY w)z9POST searchManuscript for a page. Returns (items, total).é2   ÚsortNumÚdescF)Ú	channelIdÚpageSizeÚcurrentÚsortÚorderÚnotReturnContenté   )ÚdataÚheadersÚtimeoutéÈ   z	API HTTP z: Nr"   zAPI bad JSON: Útotalr   ÚresultsÚtitler
   Ú	showTitleÚpubDatez(\d{4})-(\d{2})-(\d{2})ÚcontentÚurlsÚpcÚhttp)ÚjsonÚdumpsÚ
CHANNEL_IDÚpostÚAPI_URLÚHEADERSÚstatus_codeÚRuntimeErrorÚtextÚ	ExceptionÚgetr   r   r   ÚmatchÚgroupÚ
isinstanceÚdictÚstrÚloadsÚ
startswithÚurllibÚparseÚurljoinÚBASE_URLÚappend)ÚsessionÚpageÚbodyÚrr"   r&   ÚitemsÚresr(   ÚpubÚdmÚdateÚcontent_htmlÚcr,   Úpage_urls                   r   Ú
fetch_listrR   L   s>  € ä�:‰:Ü �\ØØØØØ!ñó €Dð 	�‰”W 4´À"ˆÓE€AØ‡}�}˜ÒÜ˜Y q§}¡} o°R¸¿¹¸tÀ¸°~ÐFÓGÐGð<Ø�v‰v‹x˜Ñˆð �H‰H�W˜aÓ €EØ€EØ�x‰x˜	 2Ó&ó @ˆÜ˜CŸG™G G¨RÓ0ÒL°C·G±G¸KÈÓ4LÓMˆØ�w‰w�yÓ!Ò' R×.Ñ.Ó0ˆÜ�X‰XÐ0°#Ó6ˆÙ ˆr�x‰x˜Œ{ bˆØˆØ�G‰G�IÓˆÜ�aœÔØŸ5™5 Ó+Ò1¨r‰LÜ˜œ3ÔØˆLØ�w‰w�v˜rÓ"ˆØˆÜ�dœCÔ ðÜ—z‘z $Ó'�ô �dœDÔ!Ø—x‘x  bÓ)Ò/¨RˆHÙ˜H×/Ñ/°Ô7Ü—|‘|×+Ñ+¬H°hÓ?ˆHÛ“XØ�L‰L˜( E¨4°Ð>Ö?ð/@ð0 �%ˆ<Ðøô9 ò <Ü˜^¨A¯F©F°4°C¨L¨>Ð:Ó;Ð;ð<ûô( ò Ø’ðús   Á7H7 Æ!IÈ7%IÉI-É,I-c           
      óÀ	  ‡‡‡‡— | 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        |«      } | }t        j                  dd|t         j                  ¬«      }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-body inner HTML to stored format:
    - keep <table> HTML intact
    - 

 between <p> blocks
    - attachment <a> links embedded with absolute URL
    - strip <script>/<style>/noise + style attrs via BS4
    r
   r   z
<!--.*?-->)Úflagsz<script[^>]*>.*?</script>z<style[^>]*>.*?</style>zhtml.parserT)ÚstyleÚclassÚlangÚdirÚalignÚvalignÚwidthÚheightÚborderÚcellpaddingÚcellspacingNz;<img[^>]*src="[^"]*fileTypeImages/icon_[a-z]+\.gif"[^>]*/?>c                 ó  •— | 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                  ‰|«      }‰j                  ||f«       d	t        ‰«      › d
�}d|› d|› d�‰|<   |S )Nr   é   ú<[^>]+>r
   u   ^é™„ä»¶[:ï¼š]\s*ú?r   u   é™„ä»¶Ú__LINK__Ú__z	<a href="z" target="_blank">z</a>)r;   r   r   r   r   r   ÚosÚpathÚbasenameÚsplitrA   rB   rC   rE   Úlen)	ÚmÚhrefÚinnerÚtxtÚabs_urlÚkeyÚattachmentsÚlink_protectrQ   s	         €€€r   Ú
_link_replz html_to_text.<locals>._link_repl—   sè   ø€ Ø�w‰w�q‹zˆØ—‘˜“
ˆÜ�f‰f�Z  UÓ+ˆÜ×Ñ Ó$×*Ñ*Ó,ˆÜ�f‰fÐ(¨"¨cÓ2×8Ñ8Ó:ˆÙÜ—'‘'×"Ñ" 4§:¡:¨c£?°1Ñ#5Ó6ÒB¸(ˆCÜ—,‘,×&Ñ& x°Ó6ˆØ×Ñ˜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   re   )rE   r;   rj   )rk   Ú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

rb   õ   Â r   z&nbsp;z[\s\u200b\u200c\u200d\ufeff]+ru   re   z__LINK__\d+__z__TBL__\d+__z[ \t]+\nz\n{3,}z	[ \t]{2,}r   )r   r   ÚSÚIr   Úfind_allÚattrsÚpopr>   r8   Úsearchri   r   r   r   r   rJ   Ú	enumeraterE   ÚjoinÚsetÚadd)r+   rQ   Ú_soupÚtagÚattrÚcontent2rs   rw   Ú	has_tableÚpartsÚblockÚbÚplainÚkÚvÚiÚtblÚoutÚseenÚfinalÚprp   rq   rr   rv   s    `                    @@@r   Úhtml_to_textr•   z   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Ü�v‰vØFÈÈHÜ�d‰dô€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S Ó	SÓS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 (?,?,?,?,?,?,?,?,?,?)rb   r
   r   r   r%   zTINSERT OR IGNORE INTO gov_search (rowid, title, site_name, summary) VALUES (?,?,?,?)TÚlockedé   )ÚexecuteÚfetchoneÚcrawler_libr˜   r8   Ú	SITE_NAMEÚ
GROUP_NAMEÚSCRIPT_NAMEÚrowcountr   r   r   r   r   Ú	lastrowidÚsqlite3ÚOperationalErrorr>   ÚtimeÚsleepÚstore_record)ÚconnÚurlr(   r+   rN   rˆ   ÚcurÚindustryr˜   ÚsummaryÚes              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            
      ól  — dd l } | j                  «       }|j                  j                  t        «       t        j                  t        d¬«      }|j                  d«       |j                  d«       d}d}t        «       }t        dt        dz   «      D �]   }	 t        ||«      \  }}t        d|› dt        |«      › d|› d�d	¬
«       |st        dd	¬
«        nß|D ]Â  \  }
}}}|
|v rŒ|j!                  |
«       t#        ||
«      \  }}}t        t%        j&                  dd|«      j)                  «       «      }|dk  rt        d|d d › �d	¬
«       |dz  }Œzt+        ||
||||«      }|r|dz  }t        d|d d › d|› d�d	¬
«       n|dz  }t-        j.                  d«       ŒÄ t-        j.                  d«       �Œ# |j1                  «        |j3                  «        t        d|› �d	¬
«       t        d|› �d	¬
«       t        dt4        › d�d	¬
«       y # t        $ r}	t        d|› d|	› �d	¬
«       Y d }	~	 Œxd }	~	ww xY w)Nr   é<   )r$   zPRAGMA busy_timeout=60000zPRAGMA journal_mode=WALr   zPage z fetch error: T)Úflushz: found z items (total=ú)zEmpty page, stop paginationrb   r
   é
   z  skip empty: r!   z  + é(   z (gš™™™™™É?g333333Ó?u   æ–°å¢ž: u   è·³è¿‡: z=== z	 done ===)ÚrequestsÚSessionr#   Úupdater4   r£   ÚconnectÚDB_PATHr›   r‚   ÚrangeÚ_PAGESrR   r8   Úprintrj   rƒ   r•   r   r   r   r§   r¥   r¦   ÚcommitÚcloserž   )r´   Úsr¨   Ú	new_countÚ
skip_countÚ	seen_urlsrG   rJ   r&   r­   ro   r(   rN   rO   r+   rˆ   Ú_Ú	plain_lenÚoks                      r   ÚmainrÅ     s&  € ÛØ×ÑÓ€AØ‡I�I×Ñ”WÔÜ�?‰?œ7¨BÔ/€DØ‡L�LÐ,Ô-Ø‡L�LÐ*Ô+à€IØ€JÜ“€Iä�aœ !™Ó$ó ˆð	Ü% a¨Ó.‰LˆE�5ô 	��d�V˜8¤C¨£J <¨~¸e¸WÀAÐFÈdÕSÙÜÐ/°tÕ<ÙØ27ò 	Ñ.ˆG�U˜D ,Ø˜)Ñ#ØØ�M‰M˜'Ô"Ü$0°¸wÓ$GÑ!ˆG�Y ÜœBŸF™F :¨r°7Ó;×AÑAÓCÓDˆIØ˜2Š~Ü˜ u¨S¨b z lÐ3¸4Õ@Ø˜a‘�
ØÜ˜d G¨U°G¸TÀ9ÓMˆBÙØ˜Q‘�	Ü˜˜U 3 B˜Z˜L¨¨4¨&°Ð2¸$Ö?à˜a‘�
Ü�J‰J�s�Oð!	ô" 	�
‰
�3Žð7ð: 	‡K�K„MØ‡J�J„LÜ	ˆH�Y�KÐ
 ¨Õ-Ü	ˆH�Z�LÐ
!¨Õ.Ü	ˆD”�˜9Ð
%¨TÖ2øô= ò 	Ü�E˜$˜˜~¨a¨SÐ1¸Õ>Ýûð	ús   ÂHÈ	H3ÈH.È.H3Ú__main__)(Ú__doc__Úsysrf   r   r¥   Úhtmlr   r/   Úurllib.parserA   r£   Úbs4r   ÚImportErrorrD   ÚLIST_URLr3   r1   rž   rŸ   r    r¸   r4   Ú
_MAX_PAGESr€   Úargvr�   Úar@   Úintri   Ú
ValueErrorrj   rº   r   rR   r•   r§   rÅ   Ú__name__© r   r   ú<module>rÕ      s}  ðñó Û 	Û 	Û Û Û Û Û ðÝ!ð
 %€ØÐ4Ñ4€Ø
Ð(Ñ
(€Ø"€
Ø3€	Ø€
Ø"€Ø
€ð @Ø>Ø'Ø&Øñ€ð €
Ù�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€òò+ò\b'òJ"òJ-3ð` ˆzÒÙ…Fð øðs ò Ø‚Mðûð6 ò 	Ùð	ûð
 ò 	Ùð	ús5   ¤C0 Á4C=Â0DÃ0C:Ã9C:Ã=DÄDÄDÄD