Ë
    òµ£j—/  ã                   ó„  — 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ZddlmZ dZdZdZdd	d
ddddœZdddddœZdZdZdZddddœZ ej0                  «       Zej4                  j7                  e«        ej8                  ed¬«       d„ Zefd„Zd„ Zd „ Z d!„ Z!d"„ Z"d#„ Z#d$„ Z$d%„ Z%e&d&k(  r e%«        yy)'uÏ   
çˆ¬å�– é•¿å…´åŽ¿äººæ°‘æ”¿åºœ - ä¹¡é•‡ã€�éƒ¨é—¨é�žè§„èŒƒæ€§æ–‡ä»¶
https://www.zjcx.gov.cn/col/col1229518369/index.html
JPAASä¿¡æ�¯å…¬å¼€ç³»ç»Ÿï¼Œé€šè¿‡APIèŽ·å�–åˆ—è¡¨
æ”¯æŒ�é™„ä»¶(docx/xlsx/pdf)æ­£æ–‡æ��å�–
é    N)ÚurljoinÚunquote)ÚBeautifulSoupu4   é•¿å…´åŽ¿äººæ°‘æ”¿åºœ-ä¹¡é•‡éƒ¨é—¨é�žè§„èŒƒæ€§æ–‡ä»¶zhttps://www.zjcx.gov.cnzNhttps://www.zjcx.gov.cn/api-gateway/jpaas-publish-server/front/page/build/unitÚbulidstaticÚ3645Ú
1229518369Úcolumnu   ç»„é…�åˆ†ç±»listÚQIrUapMnq9Avhahnnyp8M)Ú	parseTypeÚwebIdÚpageIdÚpageTypeÚtagIdÚtplSetIdzA001-005Úxxgk_combinationÚ330522000000Ú )ÚxxgkIdÚxxgkTypeÚnodeIdÚ	classNamez/root/search.dbé   z/tmp/zjcx_attachmentszoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.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-LanguageT)Úexist_okc                 ó|   — | j                  dt        f«       | j                  «       D �ch c]  }|d   ’Œ	 c}S c c}w )Nz0SELECT page_url FROM gov_raw WHERE site_name = ?r   )ÚexecuteÚ	SITE_NAMEÚfetchall)ÚcursorÚrows     úcrawl_zjcx.pyÚget_existing_urlsr"   4   s2   € Ø
‡N�NÐEÌ	À|ÔTØ$Ÿo™oÓ/Ö0�sˆC�‹FÒ0Ð0ùÒ0s   ª9c                 óF  — t        j                  t        d¬«      }t        j                  | ||dœd¬«      }i t        ¥d|i¥}t        j                  t        |dd¬«      }|j                  «       }|d   d   }d	}t        j                  d
|«      D ]  }	t        |	j                  d«      «      } n g }
t        j                  d|t        j                  «      D ]Å  }|j                  d«      }t        j                  d|«      }t        j                  d|«      }t        j                  d|«      }|sŒY|j                  d«      }|r|j                  d«      j                  «       nd}|r|j                  d«      nd}t        t        |«      }|
j!                  |||f«       ŒÇ |
|fS )u!   é€šè¿‡JPAAS APIèŽ·å�–æ–‡ç« åˆ—è¡¨F)Úensure_ascii)ÚpageNoÚpageSizeÚsearchÚ	paramJsoné<   )ÚparamsÚtimeoutÚverifyÚdataÚhtmlr   zcount="(\d+)"é   z"<li[^>]*class="cf"[^>]*>(.*?)</li>zhref="([^"]+)"ztitle="([^"]*)"z3<span[^>]*class="fr"[^>]*>(\d{4}[-/]\d{2}[-/]\d{2})r   )ÚjsonÚdumpsÚSEARCHÚ
API_PARAMSÚsessionÚgetÚAPI_URLÚreÚfinditerÚintÚgroupÚDOTALLr'   Ústripr   ÚBASE_URLÚappend)Úpage_noÚ	page_sizeÚ
search_strÚ
param_jsonr*   Úrespr-   r.   ÚtotalÚmÚitemsÚliÚli_htmlÚhref_mÚtitle_mÚdate_mÚhrefÚtitleÚdate_strÚfull_urls                       r!   Úfetch_article_listrP   9   so  € ä—‘œF°Ô7€JÜ—‘ w¸IÐQ[Ñ\ÐkpÔq€Jà4”
Ð4˜K¨Ñ4€FÜ�;‰;”w v°rÀ%ˆ;ÓH€DØ�9‰9‹;€DØ�‰<˜Ñ€Dà€EÜ�[‰[Ð)¨4Ó0ò ˆÜ�A—G‘G˜A“J“ˆÙðð €EÜ�k‰kÐ?ÀÄrÇyÁyÓQò 
6ˆØ—(‘(˜1“+ˆÜ—‘Ð,¨gÓ6ˆÜ—)‘)Ð.°Ó8ˆÜ—‘ÐQÐSZÓ[ˆÚØ—<‘< “?ˆDÙ07�G—M‘M !Ó$×*Ñ*Ô,¸RˆEÙ*0�v—|‘| A”°bˆHÜœx¨Ó.ˆHØ�L‰L˜% ¨8Ð4Õ5ð
6ð �%ˆ<Ðó    c                 óæ  — 	 t         j                  | ddd¬«      }|j                  dk7  ryt        | j	                  d«      d   j	                  d	«      d
   «      }|s dt        t        j                  «       «      › �}t        j                  j                  t        |«      }t        |d«      5 }|j                  d«      D ]  }|j                  |«       Œ 	 ddd«       |S # 1 sw Y   |S xY w#  Y yxY w)u0   ä¸‹è½½é™„ä»¶åˆ°ä¸´æ—¶ç›®å½•ï¼Œè¿”å›žæœ¬åœ°è·¯å¾„r)   FT)r+   r,   ÚstreaméÈ   Nú?r   ú/éÿÿÿÿÚattach_Úwbi    )r4   r5   Ústatus_coder   Úsplitr9   ÚtimeÚosÚpathÚjoinÚ
ATTACH_DIRÚopenÚiter_contentÚwrite)ÚurlÚrÚurl_pathÚ
local_pathÚfÚchunks         r!   Údownload_attachmentrj   X   sÚ   € ðÜ�K‰K˜ R°¸dˆKÓCˆØ�=‰=˜CÒØä˜3Ÿ9™9 S›>¨!Ñ,×2Ñ2°3Ó7¸Ñ;Ó<ˆÙØ ¤¤T§Y¡Y£[Ó!1Ð 2Ð3ˆHÜ—W‘W—\‘\¤*¨hÓ7ˆ
Ü�*˜dÓ#ð 	 qØŸ™¨Ó-ò �Ø—‘˜•ñ÷	ð Ð÷	ð ÐûðÙús/   ‚(C, «BC, Â,(CÃ	C, ÃC)Ã$C, Ã)C, Ã,C0c                 ó€   — 	 ddl }|j                  | «      }dj                  d„ |j                  D «       «      S #  Y yxY w)u   ç”¨python-docxæ��å�–æ–‡æœ¬r   Nú
c              3   ój   K  — | ]+  }|j                   j                  «       sŒ|j                   –— Œ- y ­w)N)Útextr<   )Ú.0Úps     r!   ú	<genexpr>z)extract_text_from_docx.<locals>.<genexpr>p   s    è ø€ ÒJ A¸1¿6¹6¿<¹<½>˜Ÿ�ÑJùs   ‚3¢3r   )ÚdocxÚDocumentr_   Ú
paragraphs)r^   rr   Údocs      r!   Úextract_text_from_docxrv   k   s;   € ðÛØ�m‰m˜DÓ!ˆØ�y‰yÑJ¨¯©ÔJÓJÐJøðÙús   ‚69 ¹=c                 ó$  — 	 ddl }|j                  | dd¬«      }g }|j                  D ]O  }|j                  «       D ]:  }|D ]3  }|j                  €Œ|j                  t        |j                  «      «       Œ5 Œ< ŒQ dj                  |«      S #  Y yxY w)u   ç”¨openpyxlæ��å�–æ–‡æœ¬r   NT)Ú	read_onlyÚ	data_onlyrl   r   )ÚopenpyxlÚload_workbookÚ
worksheetsÚ	iter_rowsÚvaluer>   Ústrr_   )r^   rz   rY   ÚtextsÚwsr    Úcells          r!   Úextract_text_from_xlsxrƒ   u   s–   € ðÛØ×#Ñ# D°DÀDÐ#ÓIˆØˆØ—-‘-ò 	6ˆBØ—|‘|“~ò 6�Øò 6�DØ—z‘zÑ-ØŸ™¤S¨¯©£_Õ5ñ6ñ6ð	6ð
 �y‰y˜ÓÐøðÙús   ‚AB Á:B ÂBc                 ó~   — 	 t        j                  d| dgddd¬«      }|j                  j                  «       S #  Y yxY w)u   ç”¨pdftotextæ��å�–æ–‡æœ¬Ú	pdftotextú-Té   ©Úcapture_outputrn   r+   r   )Ú
subprocessÚrunÚstdoutr<   )r^   Úresults     r!   Úextract_text_from_pdfrŽ   …   sA   € ðÜ—‘ ¨d°CÐ 8ÈÐTXÐbdÔeˆØ�}‰}×"Ñ"Ó$Ð$øðÙús   ‚58 ¸<c                 ó&  — t        | «      }|syd}t        j                  j                  |«      d   j	                  «       }|dk(  rt        |«      }n\|dk(  r7	 t        j                  d|gddd¬«      }|j                  j                  «       }n |d
v rt        |«      }n|dk(  rt        |«      }	 t        j                  |«       |S #  	 t        j                  d	|gddd¬«      }|j                  j                  «       }n#  Y nxY wY ŒZxY w#  Y |S xY w)u   ä¸‹è½½å¹¶æ��å�–é™„ä»¶æ­£æ–‡r   r/   z.docxz.docÚcatdocTr‡   rˆ   Úantiword)z.xlsxz.xlsz.pdf)rj   r]   r^   ÚsplitextÚlowerrv   rŠ   r‹   rŒ   r<   rƒ   rŽ   Úremove)Ú
attach_urlrg   rn   Úextr�   s        r!   Úextract_attachment_textr—   Ž   s  € ä$ ZÓ0€JÙØà€DÜ
�'‰'×
Ñ
˜:Ó
& qÑ
)×
/Ñ
/Ó
1€Cà
ˆg‚~Ü% jÓ1‰Ø	�Šð	Ü—^‘^ X¨zÐ$:È4ÐVZÐdfÔgˆFØ—=‘=×&Ñ&Ó(‰Dð 
Ð!Ñ	!Ü% jÓ1‰Ø	�ŠÜ$ ZÓ0ˆðÜ
�	‰	�*Ôð €Køð#	ðÜ#Ÿ™¨°ZÐ(@ÐQUÐ\`ÐjlÔm�Ø—}‘}×*Ñ*Ó,‘øðÙÿøðØà€Kús0   Á5C Â/D ÃDÃ	5C?Ã>DÃ?DÄDÄDc           	      ó‚  — 	 t         j                  | dd¬«      }d|_        t        |j                  d«      }d}|j                  dd	d
i¬«      }|r$|j                  d«      r|d   j                  «       }|s'|j                  dd¬«      }|r|j                  d¬«      }d}|j                  dd	di¬«      }|r'|j                  d«      r|d   j                  «       dd }d}	g }
|j                  dd¬«      }|�r1|j                  d«      D ]]  }t        j                  d|j                  xs d«      D ]4  }|j                  d«      }t        t         |«      }|
j#                  |«       Œ6 Œ_ |j                  dd¬«      D ]W  }|d   }d|v s&t        j$                  d|t        j&                  «      sŒ2t        t         |«      }||
vsŒG|
j#                  |«       ŒY |j                  d«      D ]  }|j)                  «        Œ t        |«      }|j                  d¬«      }t+        |«      dkD  r|}	|
rdj-                  |
«      nd}d}|	sQ|
rOt/        dt+        |
«      › d �«       |
D ]  }t1        |«      }|sŒ||d!z   z  }Œ |rd"|j3                  d#d$«      z   d%z   }	|||	||dfS # t
        $ r}dddddt        |«      fcY d}~S d}~ww xY w)&uS   çˆ¬å�–è¯¦æƒ…é¡µï¼Œè¿”å›ž (title, date, content_html, attachments_str, attach_texts)r)   F)r+   r,   zutf-8zhtml.parserNr   ÚmetaÚnameÚArticleTitle)ÚattrsÚcontentÚdivÚtitle1)Úclass_T)r<   ÚPubDateé
   ÚzhengwÚscriptzpdfurl\s*=\s*"([^"]+)"r/   Úa)rL   rL   zdocument/downloadz\.(docx?|xlsx?|pdf)$é2   ú,u        æ��å�–é™„ä»¶(u   ä¸ª)...z

z<div class="zhengw"><p>rl   z</p><p>z
</p></div>)r4   r5   Úencodingr   rn   Ú	Exceptionr   Úfindr<   Úget_textÚfind_allr7   r8   Ústringr:   r   r=   r>   r'   ÚIÚ	decomposeÚlenr_   Úprintr—   Úreplace)Ú
detail_urlrC   ÚsoupÚerM   ÚmtÚ	title_divrN   Úmt2Úcontent_htmlÚattachments_listÚzwr¤   rE   r•   Úfull_attachÚa_tagrL   rO   ÚsÚcontent_html_rawÚtext_contentÚattachmentsÚattach_textÚauÚtxts                             r!   Úcrawl_detailrÅ   ±   sã  € ð2Ü�{‰{˜:¨r¸%ˆ{Ó@ˆØˆŒÜ˜TŸY™Y¨Ó6ˆð
 €EØ	�‰�6 &¨.Ð!9ˆÓ	:€BÙ	ˆb�f‰f�YÔØ�9‘×#Ñ#Ó%ˆÙØ—I‘I˜e¨H�IÓ5ˆ	ÙØ×&Ñ&¨TÐ&Ó2ˆEð €HØ
�)‰)�F 6¨9Ð"5ˆ)Ó
6€CÙ
ˆs�w‰w�yÔ!Ø�y‘>×'Ñ'Ó)¨#¨2Ð.ˆð €LØÐØ	�‰�5 ˆÓ	*€BÚ	à—k‘k (Ó+ò 	5ˆFÜ—[‘[Ð!:¸F¿M¹MÒ<OÈRÓPò 5�ØŸW™W Q›Z�
Ü%¤h°
Ó;�Ø ×'Ñ'¨Õ4ñ5ð	5ð —[‘[ ¨4�[Ó0ò 	6ˆEØ˜‘=ˆDà" dÑ*¬b¯i©iÐ8OÐQUÔWY×W[ÑW[Õ.\Ü"¤8¨TÓ2�ØÐ#3Ò3Ø$×+Ñ+¨HÕ5ð	6ð —‘˜XÓ&ò 	ˆAØ�K‰K�Mð	ô ˜r›7ÐØ—{‘{¨�{Ó.ˆÜˆ|Ó˜rÒ!Ø+ˆLá0@�#—(‘(Ð+Ô,Àb€Kð €KÙÑ,ÜÐ"¤3Ð'7Ó#8Ð"9¸ÐAÔBØ"ò 	,ˆBÜ)¨"Ó-ˆCÚØ˜s V™|Ñ+‘ð	,ñ à6¸×9LÑ9LÈTÐS\Ó9]Ñ]Ð`lÑlˆLà�(˜L¨+°{ÀDÐHÐHøôA ò 2Ø�T˜4  r¬3¨q«6Ð1Õ1ûð2ús   ‚5J Ê	J>Ê#J9Ê3J>Ê9J>c                  ó   — d} d}t         j                  dd  D ]&  }|dk(  rd} Œ|j                  «       sŒt        |«      }Œ( t	        j
                  t        «      }|j                  «       }|j                  d«       |j                  «        t        |«      }t        dt        |«      › d�«       d	}| rBd
dlm}m} |j                  «        ||¬«      z
  }	|	j!                  d«      }t        d|› d�«       t#        d«      \  }
}t        d|› �«       |st        d«       |j%                  «        y |t&        z   dz
  t&        z  }t        d|› �«       g }t)        d|dz   «      D ]a  }t        d|› d|› d�«       	 t#        |«      \  }}|j+                  |«       t        dt        |«      › d�«       t/        j0                  d«       Œc t        dt        |«      › d�«       d
}d
}d
}d
}t3        |d«      D �]A  \  }\  }}}| r,|r*|r(||k  r#|dz  }|dk(  rt        d|› d|d d › d|› d�«       Œ9||v r|dz  }ŒCt        d |› dt        |«      › d!|d d › d"�«       t5        |«      \  }}}}}}|xs |} |xs |}!|j7                  «       d	k7  }"|xr t        |j7                  «       «      d#kD  }#|#s|"st        d$«       |dz  }ŒÊd	}$|#s|"rd%|z   }$n|#rd	}$|r|dz  }|j                  d&| |!||xs d	|$t8        f«       |dz  }|d'z  d
k(  r|j                  «        t        d(|› d�«       t/        j0                  d)«       �ŒD |j                  «        t        d*«       |j%                  «        t        d+«       t        d,|› d�«       t        d-|› d�«       t        d.|› d�«       t        d/|› d�«       y # t,        $ r}t        d|› d|› �«       Y d }~�Œd }~ww xY w)0NFr‡   r/   z--incrementalTa/  
        CREATE TABLE IF NOT EXISTS gov_raw (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            title TEXT,
            date_str TEXT,
            page_url TEXT UNIQUE,
            content TEXT,
            source TEXT,
            site_name TEXT,
            attachments TEXT
        )
    u   å·²æœ‰ u
    æ�¡è®°å½•r   r   )ÚdatetimeÚ	timedelta)Údaysz%Y-%m-%du   å¢žé‡�æ¨¡å¼�ï¼šä»…çˆ¬å�– u    ä¹‹å�Žçš„æ–‡ç« u   æ€»æ�¡æ•°: u   [ERROR] æ— æ³•èŽ·å�–æ€»æ�¡æ•°u   æ€»é¡µæ•°: u
   èŽ·å�–ç¬¬ rV   u    é¡µ...u	     æœ¬é¡µ u    æ�¡u     [ERROR] ç¬¬ u    é¡µå¼‚å¸¸: g      à?u   
åˆ—è¡¨å…± u     è·³è¿‡æ—§æ•°æ�®ï¼ˆæ—©äºŽ u   ï¼‰ï¼Œé¦–ä¸ª: z (ú)z  [z] z...r¦   u&       âš  æ— æ­£æ–‡ä¹Ÿæ— é™„ä»¶ï¼Œè·³è¿‡u   ã€�é™„ä»¶ã€‘z”INSERT OR IGNORE INTO gov_raw (title, publish_date, page_url, content, summary, site_name, date_rank, status) VALUES (?, ?, ?, ?, ?, ?, 0, 'normal')r¢   u       âœ“ å·²æ��äº¤ g333333Ó?u+   
FTS ç”±è§¦å�‘å™¨ç»´æŠ¤, è·³è¿‡æœ¬åœ°é‡�å»ºu   
=== å®Œæˆ� ===u   æ–°å¢ž: u   é™„ä»¶æ��å�–: u   è·³è¿‡: u   é”™è¯¯: )ÚsysÚargvÚisdigitr9   Úsqlite3ÚconnectÚDB_PATHr   r   Úcommitr"   r±   r°   rÇ   rÈ   ÚnowÚstrftimerP   ÚcloseÚ	PAGE_SIZEÚrangeÚextendr©   r\   ÚsleepÚ	enumeraterÅ   r<   r   )%ÚincrementalÚincremental_daysÚargÚconnr   Úexisting_urlsÚcutoff_daterÇ   rÈ   ÚcutoffÚfirst_itemsrD   Útotal_pagesÚ	all_itemsÚpagerF   Ú_rµ   Ú	new_countÚ
skip_countÚerror_countÚattach_extractedÚirM   rN   r³   Údt_titleÚdt_dater¹   rÁ   rÂ   ÚerrÚfinal_titleÚ
final_dateÚ
has_attachÚhas_contentÚsummary_texts%                                        r!   Úmainró   ú   s.  € Ø€KØÐÜ�x‰x˜˜ˆ|ò (ˆØ�/Ò!Ø‰KØ�[‰[�]Ü" 3›xÑð	(ô �?‰?œ7Ó#€DØ�[‰[‹]€Fà
‡N�Nð ô 	ð 	‡K�K„Mä% fÓ-€MÜ	ˆG”C˜Ó&Ð' zÐ
2Ô3à€KÙß0Ø—‘“¡)Ð1AÔ"BÑBˆØ—o‘o jÓ1ˆÜÐ)¨+¨Ð6FÐGÔHô ,¨AÓ.Ñ€K�Ü	ˆK˜�wÐ
Ô áÜÐ-Ô.Ø�
‰
ŒØàœ9Ñ$ qÑ(¬YÑ6€KÜ	ˆK˜�}Ð
%Ô&ð €IÜ�a˜ q™Ó)ò ˆÜ�
˜4˜&  + ¨gÐ6Ô7ð	:Ü)¨$Ó/‰HˆE�1Ø×Ñ˜UÔ#Ü�Iœc %›j˜\¨Ð.Ô/ô 	�
‰
�3�ðô 
ˆLœ˜Y›Ð(¨Ð
-Ô.ð €IØ€JØ€KØÐä,5°iÀÓ,Có .Ñ(ˆÑ(ˆE�8˜Zá™;©8¸À;Ò8NØ˜!‰OˆJØ˜QŠÜÐ3°K°=ÀÈuÐUXÐVXÈzÈlÐZ\Ð]eÐ\fÐfgÐhÔiØà˜Ñ&Ø˜!‰OˆJØä��A�3�aœ˜I›Ð' r¨%°°¨*¨°SÐ9Ô:ÜIUÐV`ÓIaÑFˆ�'˜<¨°kÀ3àÒ' %ˆØÒ( ˆ
à ×&Ñ&Ó(¨BÑ.ˆ
Ø"ÒE¤s¨<×+=Ñ+=Ó+?Ó'@À2Ñ'Eˆá¡:ÜÐ:Ô<Ø˜1ÑˆKØàˆÙ™zØ)¨KÑ7‰LÙØˆLáØ Ñ!Ðà�‰ð5à˜* j°,Ò2DÀ"ÀlÔT]Ð^ô	
ð
 	�Q‰ˆ	à�r‰>˜QÒØ�K‰KŒMÜÐ& y k°Ð6Ô7ä�
‰
�3Žð].ð` 	‡K�K„Mô 
Ð
8Ô9à‡J�J„Lä	ÐÔÜ	ˆH�Y�K˜tÐ
$Ô%Ü	ˆNÐ+Ð,¨DÐ
1Ô2Ü	ˆH�Z�L Ð
%Ô&Ü	ˆH�[�M Ð
&Õ'øôO ò 	:Ü�N 4 &¨°Q°CÐ8×9Ò9ûð	:ús   Å67N(Î(	OÎ1OÏOÚ__main__)'Ú__doc__r0   r7   rË   r\   r]   rÎ   rŠ   ÚtempfileÚurllib.parser   r   ÚrequestsÚbs4r   r   r=   r6   r3   r2   rÐ   rÕ   r`   ÚHEADERSÚSessionr4   ÚheadersÚupdateÚmakedirsr"   rP   rj   rv   rƒ   rŽ   r—   rÅ   ró   Ú__name__© rQ   r!   ú<module>r     s  ðñó Û 	Û 
Û Û 	Û Û Û ß )ã Ý ð C€	Ø$€Ø
Z€àØØØØØ'ñ€
ð Ð,>È.ÐgiÑ	j€Ø
€Ø€	Ø$€
ðGàOØ'ñ	€ð ˆ(×
Ñ
Ó
€Ø ‡�× Ñ �wÔ Ø €‡�ˆJ Õ &ò1ð
 +4ó ò>ò&òò ò òFFIòR(ðD ˆzÒÙ…Fð rQ   