Ë
    VA…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mZmZ ddl	m
Z
 ej                  j                  dej                  j                  ej                  j                  e«      «      «       ddlmZmZ ddlZddlZ ej*                  d«       dZdZd	d
ddddedz   dœddddddedz   dœdœZ ej2                  «        ed¬«      z
  j5                  d«      Zdedz   dœZedz   ZdZdZ ej@                  «       Z!e!jD                  jG                  e«       d0d„Z$d „ Z%d!„ Z&d1d$„Z'e(d%k(  rº ejR                  «       Z*e*jW                  d&e,d"¬'«       e*jW                  d(e-d# e.ej_                  «       «      ¬)«       e*jW                  d*d+¬,«       e*ja                  «       Z1e1jd                  r ejf                  d«        e'e1jh                  e1jj                  ¬-«      Z6 e7d.e6› d/�«       yy)2u�  crawl_pj_hpgs.py - æµ¦æ±ŸåŽ¿æ”¿åŠ¡å…¬å¼€ (æµ™æ±Ÿ JPAAS é›†çº¦åŒ–)

ç«™ç‚¹: https://www.pj.gov.cn (æ—  WAF åŸŸå��, ä¸»ç«™ pujiang.gov.cn è¢«åˆ›å®‡ç›¾ä¿�æŠ¤)
CMS: å¤§æ±‰ jcms1 (æµ™æ±Ÿæ”¿åŠ¡ç½‘é›†çº¦åŒ– JPAAS), webId=3609
åˆ—è¡¨: unitbuild API GET /api-gateway/jpaas-publish-server/front/page/build/unit
      tagId=ç»„é…�åˆ†ç±»list + paramJson={pageNo, pageSize:15, search:{xxgkId,xxgkType,className}}
      æ�¡ç›® <a class="fl" href title>æ ‡é¢˜</a> + <span class="fr">æ—¥æœŸ</span>
åˆ†é¡µ: layui.laypage, pageSize=15
è¯¦æƒ…: div.content > div.art_tit(æ ‡é¢˜) + div.wenz(æ­£æ–‡), meta[PubDate], é™„ä»¶ /api-gateway/jpaas-web-server/front/document/download?fileUrl=...
æ �ç›®:
  --col hpgs    çŽ¯è¯„å…¬ç¤º:  xxgkId=PJ001 className=å»ºè®¾é¡¹ç›®çŽ¯å¢ƒå½±å“�è¯„ä»·ä¿¡æ�¯å…¬ç¤º (18æ�¡)
  --col ecology çŽ¯å¢ƒä¿�æŠ¤:  xxgkId=T001-27 xxgkType=xxgk_combination className=ç”Ÿæ€�çŽ¯å¢ƒ (121æ�¡, çŽ¯å¢ƒè´¨é‡�/å…¬æŠ¥/å†³ç­–)
é    N)ÚdatetimeÚ	timedelta)Úurljoin)Úpush_to_searchdbÚnormalize_pub_dateÚignorezhttps://www.pj.gov.cnu   æµ™æ±Ÿu4   æµ¦æ±ŸåŽ¿-å»ºè®¾é¡¹ç›®çŽ¯å¢ƒå½±å“�è¯„ä»·ä¿¡æ�¯å…¬ç¤ºÚ
1229856886ÚPJ001Ú u*   å»ºè®¾é¡¹ç›®çŽ¯å¢ƒå½±å“�è¯„ä»·ä¿¡æ�¯å…¬ç¤ºiG  z)/col/col1229856886/index.html?isshow=fdgk)Ú	site_nameÚpage_idÚxxgk_idÚ	xxgk_typeÚ
class_nameÚcutoff_daysÚrefereru   æµ¦æ±ŸåŽ¿-çŽ¯å¢ƒä¿�æŠ¤Ú
1229196496zT001-27Úxxgk_combinationu   ç”Ÿæ€�çŽ¯å¢ƒiB  z,/col/col1229196496/index.html?number=B001-03)ÚhpgsÚecology©Údaysú%Y-%m-%dzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36)z
User-AgentÚRefererz7/api-gateway/jpaas-publish-server/front/page/build/unité   c                 óÜ  — t        j                  |d   |d   |d   dœd¬«      }ddd	d
dd|d   t        j                  | t        |dœd¬«      dœ}t        |«      D �]8  }	 t        j                  t        |dd¬«      }|j                  «       }|j                  di «      j                  dd«      }g }	t        j                  d|t        j                  «      D ]¹  }
|
j                  «       \  }}}}t        j                  dd|«      j                  «       }|s|j                  «       }t        j                  dd|«      j                  «       }|j                  d«      r|nt        t        |«      }|	j!                  |||j                  «       dœ«       Œ» |	c S  g S # t"        $ rI}||dz
  k  rt%        j&                  d|dz   z  «       nt)        d| › d|› �«       g cY d}~c S Y d}~�Œ‹d}~ww xY w)u$   è°ƒç”¨ unitbuild API èŽ·å�–åˆ—è¡¨é¡µr   r   r   )ÚxxgkIdÚxxgkTypeÚ	classNameF©Úensure_asciiÚbulidstaticÚ3609Úyt8rdEAl5gTL95ioBNtPNÚcolumnu   ç»„é…�åˆ†ç±»listÚnullr   )ÚpageNoÚpageSizeÚsearch)Ú	parseTypeÚwebIdÚtplSetIdÚpageTypeÚtagIdÚeditTypeÚpageIdÚ	paramJsoné   )ÚparamsÚtimeoutÚverifyÚdataÚhtmlr   za<a class="fl" href="([^"]+)"[^>]*title="([^"]*)"[^>]*>(.*?)</a>\s*<span class="fr">([^<]*)</span>z<[^>]+>õ   ^[â€¢Â·]\s*Úhttp)ÚurlÚtitleÚpub_dateé   é   z    [WARN] list page z error: N)ÚjsonÚdumpsÚ	PAGE_SIZEÚrangeÚsessionÚgetÚAPIÚreÚfinditerÚSÚgroupsÚsubÚstripÚ
startswithr   ÚBASEÚappendÚ	ExceptionÚtimeÚsleepÚprint)Úpage_noÚcol_cfgÚmax_retriesr)   r3   ÚattemptÚrÚdr7   ÚitemsÚmÚhrefr;   ÚbodyÚdateÚtr:   Úes                     ú"/root/gov_crawler/crawl_pj_hpgs.pyÚ
fetch_listra   A   sÚ  € ä�Z‰Z 7¨9Ñ#5À7È;ÑCWÐfmÐnzÑf{Ñ|ð  LQô  R€Fà"¨VÐAXØÐ'9ÀvÐY`ÐajÑYkÜ—Z‘Z¨7Ä	ÐU[Ñ \ÐkpÔqñ€Fô
 ˜Ó%ó ˆð	Ü—‘œC¨¸À5�ÓIˆAØ—‘“ˆAØ—5‘5˜ Ó$×(Ñ(¨°Ó4ˆDàˆEÜ—[‘[ØtØ”b—d‘dóò 	Q�ð +,¯(©(«*Ñ'��e˜T 4Ü—F‘F˜: r¨4Ó0×6Ñ6Ó8�ÙØŸ™›�AÜ—F‘F˜>¨2¨qÓ1×7Ñ7Ó9�Ø"Ÿo™o¨fÔ5‘d¼7Ä4ÈÓ;N�Ø—‘ S°1À$Ç*Á*Ã,ÑOÕPð	Qð ŠLð#ð0 €Iøô ò 	Ø˜ q™Ò(Ü—
‘
˜1 ¨!¡Ñ,Õ-äÐ-¨g¨Y°h¸q¸cÐBÔCØ—	õ .ûð	ús   Á D3FÆ	G+Æ"6G&ÇG+Ç&G+c                 ód  — t        j                  || «      }|sy| j                  d|j                  «       «      }|dk(  ry|dz   }d}t        j                  d| |d «      D ]J  }|j                  d«      j                  d«      r|dz  }Œ)|dz  }|dk(  sŒ4| |||j                  «       z    c S  | |d S )	u   å¹³è¡¡ div åŒ¹é…�r   ú>éÿÿÿÿr=   z<div[\s>]|</div>Nr   z<div)rF   r)   ÚfindÚstartrG   ÚgrouprL   )r7   Úopen_tag_rerZ   ÚgtÚiÚdepthÚmms          r`   Úextract_balanced_divrm   d   sº   € ä
�	‰	�+˜tÓ$€AÙØØ	�‰�3˜Ÿ™›	Ó	"€BØ	ˆR‚xØØ
ˆQ‰€AØ€EÜ�k‰kÐ-¨t°A°B¨xÓ8ò .ˆØ�8‰8�A‹;×!Ñ! &Ô)Ø�Q‰J‰Eà�Q‰JˆEØ˜‹zØ˜A˜a "§(¡(£*™nÐ-Ò-ð.ð ��ˆ8€Oó    c                 óª  ‡
— t        d«      D ]=  }	 t        j                  | dd¬«      }|j                  xs d|_        |j
                  } n syd}t        j                  d	|t        j                  «      }|r|j                  d«      j                  «       }|sFt        j                  d
|t        j                  «      }|r|j                  d«      j                  «       }|s‚t        j                  d|t        j                  «      }|r[t        j                   dd|j                  d«      «      j                  «       }t        j"                  d|«      d   j                  «       }t        j                   dd|«      j                  «       }t        j                   dd|«      j                  «       }d}t        j                  d|t        j                  «      }|r"|j                  d«      j                  «       dd }|sIt        j                  d|t        j                  «      }|r"|j                  d«      j                  «       dd }t%        |d«      }|j                  «       st%        |d«      }|j                  «       rœt        j                   dd|«      }t        j                   dd|«      }t        j                   dd|«      }t        j                   dd|«      }t        j                   dd„ |«      }t        j                   dd„ |«      }|j                  «       }g }t        j&                  d|xs d«      D ]\  }|j                  d«      |j                  d «      j                  «       cŠ
}	t)        ˆ
fd!„d"D «       «      sŒI|j+                  |	‰
d#œ«       Œ^ |||t-        j.                  |d¬$«      fS # t        $ r d}t        j                  d«       Y �ŒÄw xY w)%u)   æŠ“è¯¦æƒ…é¡µ: æ ‡é¢˜/æ—¥æœŸ/æ­£æ–‡/é™„ä»¶é   r2   F)r4   r5   zutf-8r   r=   )r   r   r   r   z3<meta[^>]*name="ArticleTitle"[^>]*content="([^"]*)"z)<div class="art_tit">\s*([^<]+?)\s*</div>z<title>\s*([^<]+?)\s*</title>z\s+u   [-â€“â€”|_]r   z[\u200b\ufeff]r8   z.<meta[^>]*name="PubDate"[^>]*content="([^"]*)"Né
   z.<meta[^>]*name="pubDate"[^>]*content="([^"]*)"z<div[^>]*class="wenz"[^>]*>z<div[^>]*class="content"[^>]*>z<script[\s\S]*?</script>z<style[\s\S]*?</style>u   <!--\s*pdfæ–‡ä»¶é¢„è§ˆ\s*-->z<!--[\s\S]*?-->z<(href|src)="(?!/?(?:https?:|//|javascript:|#|data:))([^"]*)"c                 ój   — | j                  d«      › dt        t        | j                  d«      «      › d�S )Nr=   z="r>   ú")rg   r   rM   ©rl   s    r`   ú<lambda>zfetch_detail.<locals>.<lambda>¯   s,   €  r§x¡x°£{ m°2´g¼dÀBÇHÁHÈQÃKÓ6PÐ5QÐQRÐ$S€ rn   zChref="(/api-gateway/jpaas-web-server/front/document/download[^"]*)"c                 ó8   — dt         › | j                  d«      › d�S )Nzhref="r=   rs   )rM   rg   rt   s    r`   ru   zfetch_detail.<locals>.<lambda>²   s   €  f¬T¨F°2·8±8¸A³;°-¸qÐ$A€ rn   z&<a[^>]+href="([^"]+)"[^>]*>([^<]*)</a>r>   c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­w)N© )Ú.0Úkr[   s     €r`   ú	<genexpr>zfetch_detail.<locals>.<genexpr>¹   s   øè ø€ Òq˜Qˆq�DŒyÑqùs   ƒ)	Údownloadz.pdfz.docz.docxz.xlsz.xlsxz.zipz.rarz.wps)Únamer:   r    )rB   rC   rD   Úapparent_encodingÚencodingÚtextrO   rP   rQ   rF   r)   ÚIrg   rK   rH   ÚDOTALLrJ   Úsplitrm   rG   ÚanyrN   r?   r@   )r:   Ú_attemptrW   r7   r;   rZ   r<   ÚcontentÚattachmentsr}   r[   s             @r`   Úfetch_detailrˆ   x   s/  ø€ ä˜!“Hò ˆð	Ü—‘˜C¨°E�Ó:ˆAØ×,Ñ,Ò7°ˆAŒJØ—6‘6ˆDÙðñ Øð €EÜ
�	‰	ÐHÈ$ÔPR×PTÑPTÓU€AÙØ—‘˜“
× Ñ Ó"ˆÙÜ�I‰IÐBÀDÌ"Ï$É$ÓOˆÙØ—G‘G˜A“J×$Ñ$Ó&ˆEÙÜ�I‰IÐ6¸¼b¿i¹iÓHˆÙÜ—F‘F˜6 2 q§w¡w¨q£zÓ2×8Ñ8Ó:ˆEÜ—H‘H˜^¨UÓ3°AÑ6×<Ñ<Ó>ˆEÜ�F‰FÐ$ b¨%Ó0×6Ñ6Ó8€EÜ�F‰F�> 2 uÓ-×3Ñ3Ó5€Eð €HÜ
�	‰	ÐCÀTÌ2Ï4É4ÓP€AÙØ—7‘7˜1“:×#Ñ#Ó% c rÐ*ˆÙÜ�I‰IÐGÈÌrÏtÉtÓTˆÙØ—w‘w˜q“z×'Ñ'Ó)¨#¨2Ð.ˆHô # 4Ð)GÓH€GØ�=‰=Œ?Ü& tÐ-NÓOˆà‡}�}„ä—&‘&Ð4°b¸'ÓBˆÜ—&‘&Ð2°B¸Ó@ˆä—&‘&Ð8¸"¸gÓFˆÜ—&‘&Ð+¨R°Ó9ˆä—&‘&ÐXÙSÐU\ó^ˆô —&‘&Ð_ÙAÀ7óLˆà—-‘-“/ˆð €KÜ�[‰[ÐBÀGÂMÈrÓRò <ˆØ—W‘W˜Q“Z §¡¨£×!1Ñ!1Ó!3ˆ
ˆˆdÜÓqÐ"pÔqÕqØ×Ñ¨°TÑ:Õ;ð<ð �(˜G¤T§Z¡Z°È%Ô%PÐPÐPøôw ò 	ØˆDÜ�J‰J�q�Mð	ús   ‘9N.Î. OÏOé   r   c                 óò  — t         j                  |«      }|st        d|› �«       y|d   }t        j                  «       t        |d   ¬«      z
  j                  d«      }t        d|› d|› d	�«       g }d}d}d
}t        d| dz   «      D ]»  }	t        |	|«      }
|
s n«t        d|	› dt        |
«      › d�«       |
D ]z  }|d   r|d   |k  rd}Œt        |d   «      \  }}}}|s|d   }|j                  «       st        d|d d › �«       ŒO|j                  ||d   |d   |xs |d   ||d|t        dœ	«       Œ| |sŒ°t        d«        n t        dt        |«      › �«       |rt        |d|› �«       t        |«      S )Nz  Unknown col: r   r   r   r   r   z  Site: z (cutoff >= ú)Fr=   z  Page z: z itemsr<   Tr:   r;   z    [EMPTY] é2   r   )	r;   r:   Ú
source_urlr<   r   r†   Úsummaryr‡   Ú
group_namez  CUTOFF reached, stopz  Total records: Úpj_)ÚCOL_MAPrD   rR   r   Únowr   ÚstrftimerB   ra   Úlenrˆ   rK   rN   ÚGROUPr   )Ú	max_pagesÚcolrT   r   ÚcutoffÚrecordsÚ	total_newÚ
total_skipÚ
cutoff_hitÚpagerY   Úitr;   Úpdr†   Úatts                   r`   Úrunr¡   ¾   s°  € Ü�k‰k˜#Ó€GÙÜ� ˜uÐ%Ô&ØØ˜Ñ$€IÜ�l‰l‹nœy¨g°mÑ.DÔEÑE×OÑOÐPZÓ[€FÜ	ˆH�Y�K˜|¨F¨8°1Ð
5Ô6Ø€GØ€IØ€JØ€JÜ�a˜ Q™Ó'ò ˆÜ˜4 Ó)ˆÙÙÜ�˜�v˜R¤ E£
˜|¨6Ð2Ô3Øò 	ˆBØ�*Š~ " Z¡.°6Ò"9Ø!�
ØÜ&2°2°e±9Ó&=Ñ#ˆE�2�w ÙØ˜7™�Ø—=‘=”?Ü˜ U¨3¨B Z LÐ1Ô2ØØ�N‰NØ r¨%¡yÀÀ5Á	ØÒ0 " Z¡.Ø&°7Ø¨cÄñ	õ ð	ò  ÜÐ*Ô+Ùð/ô0 
Ðœc '›l˜^Ð
,Ô-ÙÜ˜ C¨ u +Ô.Üˆw‹<Ðrn   Ú__main__z--pages)ÚtypeÚdefaultz--col)r£   r¤   Úchoicesz--sync-onlyÚ
store_true)Úaction)r–   r—   zDone: z records)rp   )r‰   r   )8Ú__doc__ÚsysÚosrF   r?   ÚargparserP   r   r   Úurllib.parser   ÚpathÚinsertÚdirnameÚabspathÚ__file__Úcrawler_libr   r   ÚrequestsÚwarningsÚfilterwarningsrM   r•   r‘   r’   r“   ÚCUTOFFÚHEADERSrE   rA   Ú	CLASSNAMEÚSessionrC   ÚheadersÚupdatera   rm   rˆ   r¡   Ú__name__ÚArgumentParserÚapÚadd_argumentÚintÚstrÚlistÚkeysÚ
parse_argsÚargsÚ	sync_onlyÚexitÚpagesr—   ÚcntrR   rx   rn   r`   ú<module>rÊ      sæ  ðñ÷ )× (× (ß (Ý  à ‡�‡���2—7‘7—?‘? 2§7¡7§?¡?°8Ó#<Ó=Ô >ß <ã Û Ø €× Ñ ˜Ô !à€Ø€ð
 LØØØØBØØÐEÑEñð .ØØØ'Ø$ØØÐHÑHññ€ð* ˆ(�,‰,‹.™9¨%Ô0Ñ
0×	:Ñ	:¸:Ó	F€ð DØÐAÑAñ€ð
 ÐFÑF€Ø€	Ø8€	à
ˆ(×
Ñ
Ó
€Ø ‡�× Ñ �wÔ ó òFò(CQóL'ðT ˆzÒØ	 ˆ×	 Ñ	 Ó	"€BØ‡O�O�I C°€OÔ3Ø‡O�O�G #¨v¹tÀGÇLÁLÃNÓ?S€OÔTØ‡O�O�M¨,€OÔ7Ø�=‰=‹?€DØ‡~‚~Øˆ�‰�ŒÙ
˜Ÿ
™
¨¯©Ô
1€CÙ	ˆF�3�%�xÐ
 Õ!ð rn   