Ë
    È­zjÝ  ã                   ór  — 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
 ej                  j                  dej                  j                  ej                  j                  e«      «      «       ddlmZ dZedz   ZdZdZd	Zd
dedz   dœZdZd„ Zd„ Zefd„Zd„ Zd„ Zd„ Zd„ Zd„ Z e!dk(  r e «        yy)u[  
èŽ·å˜‰åŽ¿äººæ°‘æ”¿åºœ - çŽ¯å¢ƒç®¡ç�† çˆ¬è™«
æ �ç›®: https://www.huojia.gov.cn/htmls/huanjingguanli/list-1.html
å†…å®¹: æ–°ä¹¡å¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€èŽ·å˜‰åˆ†å±€ çŽ¯è¯„æ‰¹å¤�/å®¡æ‰¹æ„�è§�å…¬ç¤º (å·¥ä¸šé¡¹ç›®çŽ¯è¯„)
CMS: èŽ·å˜‰é—¨æˆ· dreamer-pagination (list-N.html é�™æ€�åˆ†é¡µ, 10æ�¡/é¡µ)
åˆ—è¡¨: <li class="list-li"><span class="date">YYYY-MM-DD HH:MM</span><a href="/htmls/huanjingguanli/YYYYMMDD/ID.html">å®Œæ•´æ ‡é¢˜</a>
  æ ‡é¢˜åˆ—è¡¨å�³å®Œæ•´ (æ— æˆªæ–­çœ�ç•¥å�·); URL é›ªèŠ± ID 19ä½� (æ–°) / çŸ­ ID (æ—§)
åˆ†é¡µ: list-1.html é¦–é¡µ, list-2.html ... è¶Šç•Œç©ºé¡µè‡ªåŠ¨å�œ; CUTOFF 3å¹´ â†’ list-13
è¯¦æƒ…: https://www.huojia.gov.cn/htmls/huanjingguanli/YYYYMMDD/ID.html
  h1#title å®Œæ•´æ ‡é¢˜; <i id="pubDate">2025-09-05 15:51</i> æ—¥æœŸ
  æ­£æ–‡: <div class="content"> ... <p><span style="ä»¿å®‹">æ®µè�½</span></p> ...
  âš ï¸� div.content å�Žç´§è·Ÿ ä¸Š/ä¸‹ä¸€ç¯‡ å¯¼èˆª (dreamer-prevnext) â†’ æ­£æ–‡æˆªåˆ°è¯¥æ ‡è®°å‰�
  æ­£æ–‡å†…é™„ä»¶ <a href="*.pdf"> ç›¸å¯¹è·¯å¾„ urljoin(è¯¦æƒ…é¡µURL) ç»�å¯¹åŒ–
ç”¨æ³•:
  python3 crawl_huojia_hjgl.py --pages=1
  python3 crawl_huojia_hjgl.py --pages=13   # CUTOFF 3å¹´çª—å�£
é    N)Úurljoin)Úpush_to_searchdbzhttps://www.huojia.gov.cnz"/htmls/huanjingguanli/list-%d.htmlu"   èŽ·å˜‰åŽ¿äººæ°‘æ”¿åºœ-çŽ¯å¢ƒç®¡ç�†u   çŽ¯å¢ƒç®¡ç�†z
2023-08-11zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36zzh-CN,zh;q=0.9z!/htmls/huanjingguanli/list-1.html)z
User-AgentzAccept-LanguageÚRefereré   c                  ó®  — d} t         j                  dd  D ]¼  }|j                  d«      rt        |j	                  d«      d   «      } Œ2|j                  d«      sŒDt        t         j                  «      t         j                  j                  |«      dz   kD  sŒ�t        t         j                  t         j                  j                  |«      dz      «      } Œ¾ | S )Nr   é   z--pages=ú=z--pages)ÚsysÚargvÚ
startswithÚintÚsplitÚlenÚindex)ÚpagesÚas     ú&/root/gov_crawler/crawl_huojia_hjgl.pyÚ
parse_argsr   )   s›   € Ø€EÜ�X‰X�a�bˆ\ò 9ˆØ�<‰<˜
Ô#Ü˜Ÿ™ › Q™Ó(‰EØ�\‰\˜)Õ$¬¬S¯X©X«¼¿¹¿¹ÈÓ9JÈQÑ9NÓ)NÜœŸ™¤§¡§¡°Ó!2°QÑ!6Ñ7Ó8‰Eð	9ð
 €Ló    c                 óÞ   — t        j                  | xs d«      } t        j                  dd| «      } t        j                  dd| «      } t        j                  dd| «      } | j	                  «       S )NÚ z[\u200b\u200e\u200f\ufeff\xa0]z\s+ú u   ^[â€¢Â·\-â€”]\s*)Úhtml_modÚunescapeÚreÚsubÚstrip)Úts    r   Úclean_titler   3   sZ   € Ü×Ñ˜!š'˜rÓ"€AÜ
�‰Ð0°"°aÓ8€AÜ
�‰ˆv�s˜AÓ€AÜ
�‰Ð" B¨Ó*€AØ�7‰7‹9Ðr   c                 óV  — t        d«      D ]Y  }	 t        j                  | t        |¬«      }|j                  dk(  rd|_        |j                  c S 	 t        j                  d	«       Œ[ y # t        $ r6}|dk(  r't        d| › d|› �t        j                  ¬«       Y d }~ y Y d }~ŒRd }~ww xY w)
Né   )ÚheadersÚtimeoutéÈ   zutf-8é   z  [WARN] GET failed z: )Úfileg      ø?)ÚrangeÚrequestsÚgetÚHEADERSÚstatus_codeÚencodingÚtextÚ	ExceptionÚprintr
   ÚstderrÚtimeÚsleep)Úurlr#   ÚattemptÚrÚes        r   Úhttp_getr7   ;   sœ   € Ü˜“8ò 
ˆð	Ü—‘˜S¬'¸7ÔCˆAØ�}‰} Ò#Ø$�”
Ø—v‘v’ð $ô 	�
‰
�3�ð
ð øô ò 	Ø˜!Š|ÜÐ,¨S¨E°°A°3Ð7¼c¿j¹jÕIÝô ûð	ús   �=A)Á)	B(Á2&B#Â#B(c                 ó@   — | j                  d«      r| S t        || «      S )N)zhttp://zhttps://zjavascript:zmailto:ztel:zdata:ú#)r   r   )ÚuÚpage_urls     r   Ú_abs_urlr<   J   s!   € Ø‡|�|Ð[Ô\ØˆÜ�8˜QÓÐr   c                 ó‚  ‡— | syt        j                  dd| «      } t        j                  dd| «      } t        j                  dˆfd„| «      } t        j                  dˆfd„| «      } t        j                  dd	| «      } t        j                  d
d| «      } t        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| «      } | j                  «       S )uX   æ­£æ–‡æ¸…æ´—: ä¿�ç•™ <p> æ®µè�½ HTML, å‰¥ span/font å†…è�”æ ·å¼�, é™„ä»¶/å›¾ç‰‡ç»�å¯¹åŒ–r   z<script[\s\S]*?</script>z<style[\s\S]*?</style>z<a\s+href="([^"]+)"c                 óB   •— dt        | j                  d«      ‰«      › d�S )Nz	<a href="r   ú"©r<   Úgroup©Úmr;   s    €r   ú<lambda>zclean_content.<locals>.<lambda>W   s#   ø€ ¸)ÄHÈQÏWÉWÐUVËZÐYaÓDbÐCcÐcdÐ8e€ r   z<img\s+src="([^"]+)"c                 óB   •— dt        | j                  d«      ‰«      › d�S )Nz
<img src="r   r?   r@   rB   s    €r   rD   zclean_content.<locals>.<lambda>X   s#   ø€ ¸:ÄhÈqÏwÉwÐWXËzÐ[cÓFdÐEeÐefÐ9g€ r   z<p[^>]*>ú<p>z</?span[^>]*>z(<(table|tbody|thead|tr|td|th|br)([^>]*)>c                 ó,   — d| j                  d«      › d�S )Nú<r   ú>©rA   ©rC   s    r   rD   zclean_content.<locals>.<lambda>^   s   € ÈqÐQR×QXÑQXÐYZÓQ[ÐP\Ð\]ÐM^€ r   z"</(table|tbody|thead|tr|td|th|br)>c                 ó,   — d| j                  d«      › d�S )Nz</r   rI   rJ   rK   s    r   rD   zclean_content.<locals>.<lambda>_   s   € ÈÈAÏGÉGÐTUËJÈ<ÐWXÐGY€ r   z)</?(?:font|b|strong|em|u|sup|sub)\b[^>]*>)Úflagsz[\u3000\xa0]r   z<p>\s*(?:&nbsp;)?\s*</p>z\r\nú
)r   r   ÚIr   )Úraw_htmlr;   s    `r   Úclean_contentrQ   P   s  ø€ áØÜ�v‰vÐ1°2°xÓ@€HÜ�v‰vÐ/°°XÓ>€Hä�v‰vÐ,Ó.eÐgoÓp€HÜ�v‰vÐ-Ó/gÐiqÓr€Hä�v‰v�k 5¨(Ó3€Hä�v‰vÐ&¨¨HÓ5€Hä�v‰vÐAÑC^Ð`hÓi€HÜ�v‰vÐ;Ñ=YÐ[cÓd€Hä�v‰vÐBÀBÈÔXZ×X\ÑX\Ô]€Hä�v‰v�o s¨HÓ5€HÜ�v‰vÐ1°2°xÓ@€HÜ�v‰v�g˜t XÓ.€HØ�>‰>ÓÐr   c           	      ó6  — g }t        «       }t        j                  d| t        j                  «      D ]Ë  }|j	                  d«      t        j
                  dd|j	                  d«      «      j                  «       }}t        j                  d|t        j                  «      sd|j                  «       v sŒ€t        ||«      }||vsŒ‘|j                  |«       |j                  |xs |j                  d«      d	   |d
œ«       ŒÍ |rt        j                  |d¬«      S dS )u8   ä»Žæ­£æ–‡æ��å�–é™„ä»¶é“¾æŽ¥, è¿”å›ž JSON æ•°ç»„å­—ç¬¦ä¸²ú"<a\s+href="([^"]+)"[^>]*>(.*?)</a>r   ú<[^>]+>r   r%   z2\.(pdf|doc|docx|xls|xlsx|zip|rar|wps|7z|txt)(\?|$)Údownloadú/éÿÿÿÿ©Únamer3   F©Úensure_asciiú[])Úsetr   ÚfinditerÚSrA   r   r   ÚsearchrO   Úlowerr<   ÚaddÚappendr   ÚjsonÚdumps)Úcontentr;   ÚattsÚseenÚamÚahrefÚatextr:   s           r   Úextract_attachmentsrl   i   så   € à€DÜ‹5€DÜ�k‰kÐ?ÀÌ"Ï$É$ÓOò KˆØ—x‘x “{¤B§F¡F¨:°r¸2¿8¹8ÀA»;Ó$G×$MÑ$MÓ$OˆuˆÜ�9‰9ÐJÈEÔSU×SWÑSWÔXÐ\fÐjo×juÑjuÓjwÒ\wÜ˜ Ó)ˆAØ˜Š}Ø—‘˜”Ø—‘ UÒ%>¨a¯g©g°c«l¸2Ñ.>ÀqÑIÕJðKñ 48Œ4�:‰:�d¨Ô/ÐA¸TÐAr   c                 ó€  — t        | «      }|sdg fS g }d}t        j                  d|«      }|rt        |j	                  d«      | «      }n3t        j                  d|«      }|rt        |j	                  d«      | «      }t        j
                  d|t        j                  «      D ]—  }|j	                  d«      }t        j                  d|t        j                  «      sŒ:t        j                  dd|j	                  d«      «      j                  «       xs |j                  d	«      d
   }|j                  ||dœ«       Œ™ ||fS )u/   æŠ“è¯¦æƒ…é¡µ: è¿”å›ž (æ­£æ–‡HTML, é™„ä»¶åˆ—è¡¨)r   uh   <div class="content">([\s\S]*?)(?:dreamer-prevnext|<div[^>]*class="dis"|<div[^>]*class="share|åˆ†äº«ï¼š)r   z.<div class="content">([\s\S]*?)</div>\s*</div>rS   z.\.(pdf|doc|docx|xls|xlsx|zip|rar|wps|7z)(\?|$)rT   r%   rV   rW   rX   )r7   r   r`   rQ   rA   r^   r_   rO   r   r   r   rc   )	r3   Ú	html_textrg   ÚbodyrC   Úm2r   rj   rk   s	            r   Úfetch_detailrq   w   s  € ä˜“€IÙØ�2ˆvˆØ€Dà€DÜ
�	‰	Ð}ð  @Ió  	J€AÙÜ˜QŸW™W Q›Z¨Ó-‰ä�Y‰YÐHÈ)ÓTˆÙÜ  §¡¨!£¨cÓ2ˆDä�[‰[Ð>ÀÄbÇdÁdÓKò 7ˆØ—‘˜“
ˆÜ�9‰9ÐFÈÌrÏtÉtÕTÜ—F‘F˜: r¨1¯7©7°1«:Ó6×<Ñ<Ó>ÒVÀ%Ç+Á+ÈcÓBRÐSUÑBVˆEØ�K‰K ¨uÑ5Õ6ð	7ð
 �ˆ:Ðr   c                  óÐ  — t        «       } | sd} g }t        «       }t        d| dz   «      D �]y  }t        t        |z  «      }|st        d|› d�«        �nSt        j                  d|«      }|st        d|› d�«        �n)|D ]å  \  }}}t        t        |«      }	|	|v rŒ|j                  |	«       t        |«      }
|
sŒ;|j                  «       d d }|r
|t        k  rŒZt        |	«      \  }}|}t        j                  dd	|xs d	«      }|r t!        |j                  «       «      dk  r
d
|vrd|
› d�}|rt#        j$                  |d¬«      nd}|j'                  t(        |
|||	|	|d	dœ«       Œç t        d|› dt!        |«      › dt!        |«      › d�«       t+        j,                  d«       �Œ| t        dt!        |«      › d�«       t/        |t0        «       t        dt!        |«      › d�«       y )Né   r   z[PAGE z] fetch failed, stoppingz]<li class="list-li">\s*<span class="date">([^<]+)</span>\s*<a href="([^"]+)"[^>]*>([^<]+)</a>u"   ] 0 items (åˆ†é¡µè¾¹ç•Œ), stoppingé
   z<[^>]*>?r   z<imgrF   z</p>FrZ   r\   )Ú	site_nameÚtitleÚpub_daterf   Ú
source_urlr3   ÚattachmentsÚindustryz] +z items (total ú)g333333ã?u   
æœ‰æ•ˆ u    æ�¡, å…¥åº“...u   å®Œæˆ�! æ–°å¢ž/æ›´æ–° u    æ�¡)r   r]   r'   r7   ÚLIST_TPLr/   r   Úfindallr   ÚBASE_URLrb   r   r   ÚCUTOFFrq   r   r   rd   re   rc   Ú	SITE_NAMEr1   r2   r   ÚCATEGORY)r   Ú	all_itemsrh   Úpgrn   ÚitemsÚdate_rawÚhrefÚ	title_rawr3   rv   rw   ro   rg   rf   Úplainry   s                    r   Úmainr‰   �   sô  € Ü‹L€EÙØˆà€IÜ‹5€DÜ�A�u˜q‘yÓ!ó *ˆÜœX¨™]Ó+ˆ	ÙÜ�F˜2˜$Ð6Ð7Ô8ÚÜ—
‘
ØlØóˆñ Ü�F˜2˜$Ð@ÐAÔBÚØ).ò 	Ñ%ˆH�d˜IÜœ( DÓ)ˆCØ�d‰{ØØ�H‰H�SŒMÜ 	Ó*ˆEÙØØ—~‘~Ó'¨¨Ð,ˆHÙ˜H¤vÒ-Øä% cÓ*‰JˆD�$ØˆGô —F‘F˜;¨¨GªM°rÓ:ˆEÙœs 5§;¡;£=Ó1°BÒ6¸6ÈÑ;PØ ˜w dÐ+�ÙBFœ$Ÿ*™* T¸Õ>ÈDˆKØ×ÑÜ&ØØ$Ø"Ø!ØØ*Øñ	õ 	ð)	ô< 	��r�d˜#œc %›j˜\¨¼¸I»Ð7GÀqÐIÔJÜ�
‰
�3ŽðU*ôX 
ˆI”c˜)“nÐ% _Ð
5Ô6Ü�Y¤Ô)Ü	Ð"¤3 y£>Ð"2°$Ð
7Õ8r   Ú__main__)"Ú__doc__Úosr
   r   r1   rd   Úhtmlr   r(   Úurllib.parser   ÚpathÚinsertÚdirnameÚabspathÚ__file__Úcrawler_libr   r~   r|   r€   r�   r   r*   ÚTIMEOUTr   r   r7   r<   rQ   rl   rq   r‰   Ú__name__© r   r   ú<module>r˜      sÌ   ðñ÷" 1× 0× 0Û Ý  à ‡�‡���2—7‘7—?‘? 2§7¡7§?¡?°8Ó#<Ó=Ô >Ý (à&€ØÐ:Ñ:€Ø0€	Ø€Ø	€ð DØ'ØÐ=Ñ=ñ€ð
 €òòð "ó ò òò2Bòò059ðp ˆzÒÙ…Fð r   