Ë
    ó±zj)  ã                   ó�  — 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 ej                  j                  dej                  j                  ej                  j!                  e«      «      «       ddlmZ dZdZeez   dz   ZdZd	Zd
ZdZdZdZddiZd„ Zd„ Zd„ Z dd„Z!d„ Z"d„ Z#d„ Z$d„ Z%d„ Z&d„ Z'e(dk(  r e'«        yy)um  
æ¹–åŒ—çœ�å�‘å±•å’Œæ”¹é�©å§”å‘˜ä¼š - èŠ‚èƒ½å®¡æŸ¥ çˆ¬è™«
æ �ç›®: https://fgw.hubei.gov.cn/fbjd/xxgkml/zdjsxm/pzjgxx/sp/jnscyj/index.shtml
å†…å®¹: çœ�å�‘æ”¹å§”èŠ‚èƒ½å®¡æŸ¥æ„�è§� (é‡�å¤§é¡¹ç›®èŠ‚èƒ½å®¡æŸ¥æ‰¹å¤�)
CMS: TRS WCM + ç‘žæ•°4ä»£ JS challenge WAF (412)
WAF æ–¹æ¡ˆ: playwright chromium headless æ¸²æŸ“åˆ—è¡¨é¡µæ‹¿ç‘žæ•° cookie â†’ requests å¸¦ cookie ç›´æŠ“
  âš ï¸� æœ�åŠ¡å™¨ DNS SERVFAIL â†’ chromium --host-resolver-rules=MAP fgw.hubei.gov.cn 223.75.52.243
  âš ï¸� cookie å�¯èƒ½è¿‡æœŸ (412) â†’ è‡ªåŠ¨é‡�æ–° playwright åˆ· cookie é‡�è¯•
åˆ—è¡¨: TRS é�™æ€�åˆ†é¡µ createPageHTML(39,...) â†’ index_N.shtml (N=0èµ·, index_1=ç¬¬2é¡µ)
  <a href="../../../../../xkfw/xzxkjg/xmspqk/YYYYMM/tYYYYMMDD_ID.shtml" title="å®Œæ•´æ ‡é¢˜">æ ‡é¢˜<span>YYYY-MM-DD</span></a>
  âš ï¸� æ˜¾ç¤ºæ–‡æœ¬æˆªæ–­å¸¦çœ�ç•¥å�· â†’ ç”¨ title å±žæ€§ (å®Œæ•´)
  âš ï¸� href ç›¸å¯¹è·¯å¾„é¡» urljoin(åˆ—è¡¨é¡µURL) ä¿�ç•™å®Œæ•´è·¯å¾„æ®µ (fbjd/xxgkml/xkfw/...)
è¯¦æƒ…: https://fgw.hubei.gov.cn/fbjd/xxgkml/xkfw/xzxkjg/xmspqk/YYYYMM/tYYYYMMDD_ID.shtml
  meta ArticleTitle/PubDate; æ­£æ–‡ id="zwnr" class="zwblock" > div.view.TRS_UEDITOR (>p æ®µè�½)
  é™„ä»¶: //fgw.hubei.gov.cn/pdfconvert/download/{ID}.zip?fileName=æ ‡é¢˜&template=zcwj (urljoin ç»�å¯¹åŒ–)
CUTOFF 3å¹´: 2023-08-11 (page 10-11 è¾¹ç•Œ) â†’ --pages=11 çº¦200æ�¡
ç”¨æ³•:
  python3 crawl_hbfgw_jnscyj.py --pages=1
  python3 crawl_hbfgw_jnscyj.py --pages=11
é    N)ÚurljoinÚquote)Úpush_to_searchdbzhttps://fgw.hubei.gov.cnz$/fbjd/xxgkml/zdjsxm/pzjgxx/sp/jnscyjz/index.shtmlu   æ¹–åŒ—çœ�å�‘æ”¹å§”-èŠ‚èƒ½å®¡æŸ¥u   èŠ‚èƒ½å®¡æŸ¥z
2023-08-11z223.75.52.243zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36é   ÚstrÚ 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_hbfgw_jnscyj.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 )Nr   z[\u200b\u200e\u200f\ufeff\xa0]z\s+ú u   ^[â€¢Â·\-â€”]\s*)Úhtml_modÚunescapeÚreÚsubÚstrip)Úts    r   Úclean_titler    7   sZ   € Ü×Ñ˜!š'˜rÓ"€AÜ
�‰Ð0°"°aÓ8€AÜ
�‰ˆv�s˜AÓ€AÜ
�‰Ð" B¨Ó*€AØ�7‰7‹9Ðr   c            	      ó  — ddl m}   | «       5 }|j                  j                  dddt        › �g¬«      }|j                  t        d¬«      }|j                  «       }|j                  t        d	d
¬«       |j                  d«       |j                  «       }|j                  «        ddd«       dj                  D �cg c]  }|d   › d|d   › �‘Œ c}«      t        d<   t        dt!        |«      › d�«       y# 1 sw Y   ŒSxY wc c}w )ub   playwright æ¸²æŸ“åˆ—è¡¨é¡µæ‹¿ç‘žæ•° cookie (æœ�åŠ¡å™¨ DNS SERVFAIL é¡» host-resolver-rules æ˜ å°„)r   )Úsync_playwrightTz---disable-blink-features=AutomationControlledz+--host-resolver-rules=MAP fgw.hubei.gov.cn )ÚheadlessÚargszzh-CN)Ú
user_agentÚlocaleÚloadi`ê  )Ú
wait_untilÚtimeouti   Nz; Únamer   Úvaluer   u     [cookie] åˆ·æ–°æˆ�åŠŸ u    ä¸ª cookie)Úplaywright.sync_apir"   ÚchromiumÚlaunchÚIPV4Únew_contextÚUAÚnew_pageÚgotoÚLIST_URLÚwait_for_timeoutÚcookiesÚcloseÚjoinÚ
RUI_COOKIEÚprintr   )r"   ÚpÚbrowserÚctxÚpager6   Úcs          r   Úrefresh_ruishu_cookier@   ?   sô   € å3Ù	Ó	ð ˜aØ—*‘*×#Ñ#Øà?Ø=¼d¸VÐDðð $ó 
ˆð ×!Ñ!¬R¸Ð!Ó@ˆØ�|‰|‹~ˆØ�	‰	”( v°uˆ	Ô=Ø×Ñ˜dÔ#Ø—+‘+“-ˆØ�‰Œ÷ð Ÿ	™	ÈÖ"PÀ1 a¨¡i [°°!°G±*°Ò#>Ò"PÓQ„JˆuÑÜ	Ð$¤S¨£\ N°+Ð
>Õ?÷ð üò #Qs   ŽBC7Â<DÃ7D c                 óê  — t        d«      D �]"  }t        d   s
t        «        t        t        d   |xs t        ddœ}	 t        j                  | |t        ¬«      }|j                  dk(  rmd|j                  dd	 v sd
|j                  dd	 v r6|r2|dk  r-t        d|dz   › d�t        j                  ¬«       t        «        Œ³ yd|_        |j                  c S |j                  dk(  r5|r3|dk  r.t        d|dz   › d�t        j                  ¬«       t        «        �Œt        j                   d«       �Œ% y# t        $ r6}|dk(  r't        d| › d|› �t        j                  ¬«       Y d}~ yY d}~ŒSd}~ww xY w)u@   requests å¸¦ç‘žæ•° cookie æŠ“å�–; 412 æ—¶è‡ªåŠ¨åˆ· cookie é‡�è¯•é   r   zzh-CN,zh;q=0.9)z
User-AgentÚCookieÚRefererzAccept-Language)Úheadersr)   éÈ   z_$ssNiÐ  zEnvironment Checkingé   u%     [WARN] WAF é¡µ, åˆ· cookie é‡�è¯• (r
   ú))Úfilezutf-8iœ  u!     [WARN] 412, åˆ· cookie é‡�è¯• (z  [WARN] GET failed z: g      ð?)Úranger9   r@   r1   r4   ÚrequestsÚgetÚTIMEOUTÚstatus_codeÚtextr:   r   ÚstderrÚencodingÚ	ExceptionÚtimeÚsleep)ÚurlÚrefererÚ	retry_wafÚattemptrE   ÚrÚes          r   Úhttp_getr[   T   sU  € ä˜“8ó ˆÜ˜%Ò Ü!Ô#äÜ  Ñ'ØÒ*¤(Ø/ñ	
ˆð	Ü—‘˜S¨'¼7ÔCˆAØ�}‰} Ò#Ø˜QŸV™V E T˜]Ñ*Ð.DÈÏÉÈuÐPTÈÑ.UÙ  W¨q¢[ÜÐ EÀgÈaÁiÀ[ÐPQÐRÔY\×YcÑYcÕdÜ-Ô/Ø ÙØ$�”
Ø—v‘v’Ø�}‰} Ò#©	°gÀ²kÜÐ9¸'À!¹)¸ÀAÐFÌSÏZÉZÕXÜ%Ô'Ùô
 	�
‰
�3Žð9ð: øô ò 	Ø˜!Š|ÜÐ,¨S¨E°°A°3Ð7¼c¿j¹jÕIÝô ûð	ús%   ¾B D3ÃD3ÃAD3Ä3	E2Ä<&E-Å-E2c                 ól   — | j                  d«      r| S | j                  d«      rd| z   S t        || «      S )N)zhttp://zhttps://zjavascript:zmailto:ztel:zdata:ú#z//zhttps:)r   r   )ÚuÚpage_urls     r   Ú_abs_urlr`   v   s7   € Ø‡|�|Ð[Ô\ØˆØ‡|�|�DÔØ˜!‰|ÐÜ�8˜QÓÐr   c                 ó°  ‡— | syt        j                  dd| «      } 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<iframe[\s\S]*?</iframe>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>…   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
   rc   rd   rf   s    €r   rh   zclean_content.<locals>.<lambda>†   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
   ú>©re   ©rg   s    r   rh   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
   rm   rn   ro   s    r   rh   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_contentru   ~   s  ø€ áØÜ�v‰vÐ1°2°xÓ@€HÜ�v‰vÐ/°°XÓ>€HÜ�v‰vÐ1°2°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           	      óÐ  — 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d|j                  «       v sŒ“t        ||«      }||vsŒ¤|j                  |«       t        j                  d	|«      }|}	|	s|rt        |j	                  d«      «      d
d }	|j                  |	xs |j                  d«      d   |dœ«       �Œ |rt        j                   |d¬«      S dS )u5   ä»Žæ­£æ–‡æ��å�–é™„ä»¶é“¾æŽ¥ (pdfconvert/ä¸‹è½½é“¾æŽ¥)z"<a\s+href="([^"]+)"[^>]*>(.*?)</a>r
   z<[^>]+>r   é   z2\.(pdf|doc|docx|xls|xlsx|zip|rar|wps|7z|txt)(\?|$)ÚdownloadÚ
pdfconvertú[?&]fileName=([^&]+)Né<   ú/éÿÿÿÿ©r*   rU   F©Úensure_asciiú[])Úsetr   ÚfinditerÚSre   r   r   Úsearchrs   Úlowerr`   ÚaddÚurllib_parse_unquoteÚappendr   ÚjsonÚdumps)
Úcontentr_   ÚattsÚseenÚamÚahrefÚatextr^   Úfmr*   s
             r   Úextract_attachmentsr“   ’   sC  € à€DÜ‹5€DÜ�k‰kÐ?ÀÌ"Ï$É$ÓOó JˆØ—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ð  |Hð  LQ÷  LWñ  LWó  LYò  |YÜ˜ Ó)ˆAØ˜Š}Ø—‘˜”ä—Y‘YÐ6¸Ó:�Ø�Ù¡Ü/°·±¸³Ó<¸S¸bÐA�DØ—‘ TÒ%=¨Q¯W©W°S«\¸"Ñ-=ÀaÑHÖIðJñ 48Œ4�:‰:�d¨Ô/ÐA¸TÐAr   c                 ó   — ddl m}  || «      S )Nr   )Úunquote)Úurllib.parser•   )Úsr•   s     r   rˆ   rˆ   ¥   s   € Ý$Ù�1‹:Ðr   c                 ó>  ‡	— t        | «      }|sdg fS g }d}t        j                  d|«      }|st        j                  d|«      }|rt        |j	                  d«      | «      }t        j
                  d|t        j                  «      D ]‘  }|j	                  d«      }t        || «      Š	t        j                  d‰	«      }|rt        |j	                  d«      «      dd n‰	j                  d	«      d
   }t        ˆ	fd„|D «       «      rŒ~|j                  |‰	dœ«       Œ“ ||fS )u$   æŠ“è¯¦æƒ…é¡µ: (æ­£æ–‡, é™„ä»¶åˆ—è¡¨)r   u›   <div[^>]*id="zwnr"[^>]*>([\s\S]*?)</div>\s*(?:<div[^>]*id="fjtp"|<div[^>]*class="[^"]*appendix|<div[^>]*class="[^"]*article_qrcode|<!--\s*content ç»“æ�Ÿ|$)zid="zwnr"[^>]*>([\s\S]*?)</div>r
   z'href="([^"]*pdfconvert/download/[^"]+)"rz   NéP   r|   r}   c              3   ó.   •K  — | ]  }|d    ‰k(  –— Œ y­w)rU   N© )Ú.0r   r^   s     €r   ú	<genexpr>zfetch_detail.<locals>.<genexpr>½   s   øè ø€ Ò/ Q�1�U‘8˜q•=Ñ/ùs   ƒr~   )r[   r   r…   ru   re   rƒ   rs   r`   rˆ   r   Úanyr‰   )
rU   Ú	html_textr�   Úbodyrg   r�   r�   r’   r*   r^   s
            @r   Úfetch_detailr¡   ª   s  ø€ ä˜“€IÙØ�2ˆvˆØ€Dà€DÜ
�	‰	ð  qð  s|ó  	}€AÙÜ�I‰IÐ8¸)ÓDˆÙÜ˜QŸW™W Q›Z¨Ó-ˆä�k‰kÐDÀiÔQS×QUÑQUÓVò 2ˆØ—‘˜“ˆÜ�U˜CÓ ˆÜ�Y‰YÐ.°Ó2ˆÙ9;Ô# B§H¡H¨Q£KÓ0°°"Ñ5ÀÇÁÈÃÈbÑAQˆÜÓ/¨$Ô/Õ/Ø�K‰K ¨aÑ0Õ1ð2ð �ˆ:Ðr   c                  óþ  — t        «       } | sd} g }t        «       }t        d| dz   «      D �]�  }|dk(  rt        }nt        › t
        › d|dz
  › d�}t        |t        ¬«      }|st        d|› d�«        �nJt        j                  d|«      }|st        d|› d	�«        �n |D ]Ü  \  }}}	t        ||«      }||v rŒ|j                  |«       t        |«      }
|
sŒ7|	j                  «       }|r
|t        k  rŒSt        |«      \  }}|}|r9t!        t        j"                  d
d|xs d«      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�«       t1        |t2        «       t        dt!        |«      › d�«       y )Né   r
   z/index_z.shtml)rV   z[PAGE z] fetch failed, stoppingzj<a[^>]*href="([^"]*t20\d{6}_\d+\.shtml)"[^>]*title="([^"]*)"[^>]*>[\s\S]*?<span>(\d{4}-\d{2}-\d{2})</span>u"   ] 0 items (åˆ†é¡µè¾¹ç•Œ), stoppingz<[^>]*>?r   é
   z<imgrj   z</p>Fr   r�   )Ú	site_nameÚtitleÚpub_daterŒ   Ú
source_urlrU   ÚattachmentsÚindustryz] +z items (total rH   g      à?u   
æœ‰æ•ˆ u    æ�¡, å…¥åº“...u   å®Œæˆ�! æ–°å¢ž/æ›´æ–° u    æ�¡)r   r‚   rJ   r4   ÚBASE_URLÚLIST_DIRr[   r:   r   Úfindallr   r‡   r    r   ÚCUTOFFr¡   r   r   rŠ   r‹   r‰   Ú	SITE_NAMErS   rT   r   ÚCATEGORY)r   Ú	all_itemsrŽ   ÚpgrU   rŸ   ÚitemsÚhrefÚ	title_rawÚdate_rawr¦   r§   r    r�   rŒ   r©   s                   r   Úmainr·   Â   s  € Ü‹L€EÙØˆà€IÜ‹5€DÜ�A�u˜q‘yÓ!ó *ˆØ�Š7Ü‰Cä�Jœx˜j¨°°1±¨v°VÐ<ˆCÜ˜S¬(Ô3ˆ	ÙÜ�F˜2˜$Ð6Ð7Ô8ÚÜ—
‘
ØyØóˆñ Ü�F˜2˜$Ð@ÐAÔBÚØ).ò 	Ñ%ˆD�)˜XÜ˜#˜tÓ$ˆCØ�d‰{ØØ�H‰H�SŒMÜ 	Ó*ˆEÙØØ—~‘~Ó'ˆHÙ˜H¤vÒ-ØÜ% cÓ*‰JˆD�$ØˆGÙœs¤2§6¡6¨+°r¸7º=ÀbÓ#I×#OÑ#OÓ#QÓRÐUWÒWÐ\bÐjqÑ\qØ ˜w dÐ+�ÙBFœ$Ÿ*™* T¸Õ>ÈDˆKØ×ÑÜ&ØØ$Ø"Ø!ØØ*Øñ	õ 	ð!	ô4 	��r�d˜#œc %›j˜\¨¼¸I»Ð7GÀqÐIÔJÜ�
‰
�3ŽðU*ôX 
ˆI”c˜)“nÐ% _Ð
5Ô6Ü�Y¤Ô)Ü	Ð"¤3 y£>Ð"2°$Ð
7Õ8r   Ú__main__)NT))Ú__doc__Úosr   r   rS   rŠ   Úhtmlr   Ú
subprocessrK   r–   r   r   ÚpathÚinsertÚdirnameÚabspathÚ__file__Úcrawler_libr   r«   r¬   r4   r¯   r°   r®   r/   r1   rM   r9   r   r    r@   r[   r`   ru   r“   rˆ   r¡   r·   Ú__name__r›   r   r   ú<module>rÄ      sÙ   ðñ÷( =× <× <Ó <Û ß 'à ‡�‡���2—7‘7—?‘? 2§7¡7§?¡?°8Ó#<Ó=Ô >Ý (à%€Ø1€Ø�hÑ Ñ/€Ø-€	Ø€Ø	€Ø€àv€Ø
€ð �Rˆ[€
òòò@ó*òD òò(Bò&ò
ò059ðp ˆzÒÙ…Fð r   