Ë
    Æj…jO(  ã                   óÐ   — 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	m
Z
 ddlmZmZ ddlmZ dZedz   ZdZd	Zed
ddœZeddfd„Zdd„Zd„ Zd„ Zd„ Zedk(  r e«        yy)uD  æº§é˜³å¸‚äººæ°‘æ”¿åºœ (www.liyang.gov.cn) åŽŸé€šçŸ¥å…¬å‘ŠåŽ†å�²ä¿¡æ�¯çˆ¬è™« â€” PHPCMS + åˆ›å®‡ç›¾
ç”¨æ³•: python3 crawl_liyang_tzgg.py [--pages N] [--out /tmp/liyang_tzgg.jsonl] [--start-page N]
è¿‡ç›¾: å®Œæ•´æµ�è§ˆå™¨å¤´ + Referer (åˆ›å®‡ç›¾å¯¹ curl é»˜è®¤ UA 403, å®Œæ•´å¤´æ”¾è¡Œ)
åˆ—è¡¨: /class/LBODQDEQ (15æ�¡/é¡µ, å…±100é¡µ1498æ�¡), åˆ†é¡µ /class/LBODQDEQ/{N}
è¯¦æƒ…: /html/czly/{å¹´}/LBODQDEQ_{MMDD}/{ID}.html, meta ArticleTitle/PubDate/ContentSource + td#czfxcontent
æ³¨æ„�: åˆ›å®‡ç›¾é¢‘çŽ‡æ•�æ„Ÿ (æµ¦æ±Ÿæ¡ˆä¾‹ 12s å†…è¿žç»­è¯·æ±‚æ‹‰é»‘), é™�é€Ÿ 1.5-2s + 403 é€€é�¿é‡�è¯•
é    N)ÚRequestÚurlopen)Ú	HTTPErrorÚURLError)Úurljoinzhttps://www.liyang.gov.cnz/class/LBODQDEQÚliyang_tzggzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.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-Languageé   é   c           
      óÖ  — t        t        «      }||d<   t        |«      D ]?  }	 t        | |¬«      }t	        ||¬«      }|j                  «       j                  dd¬«      c S  y# t        $ r›}|j                  dk(  r9d|dz  z   }	t        d	|	› d
| dd › d�d¬«       t        j                  |	«       Y d}~Œ”|j                  dv rY d}~ yt        d|j                  › d| dd › �d¬«       t        j                  d«       Y d}~Œâd}~wt        t        t        f$ rO}t        dt        |«      j                   › d| dd › �d¬«       t        j                  d|dz  z   «       Y d}~�ŒCd}~ww xY w)u5   å¸¦å®Œæ•´å¤´ + Referer æŠ“å�–, 403/è¶…æ—¶é€€é�¿é‡�è¯•ÚReferer)Úheaders)Útimeoutúutf-8Úignore)Úerrorsi“  é   u     [403] é€€é�¿ zs (iÄÿÿÿNú)T©Úflush)i”  iš  Ú z  [HTTP z] r   z  [ERR é   )ÚdictÚHEADERSÚranger   r   ÚreadÚdecoder   ÚcodeÚprintÚtimeÚsleepr   ÚTimeoutErrorÚOSErrorÚtypeÚ__name__)
ÚurlÚrefererr   Úretriesr   ÚattemptÚreqÚrespÚeÚwaits
             ú&/root/gov_crawler/crawl_liyang_tzgg.pyÚfetchr/      sK  € ä”7‹m€GØ €GˆIÑÜ˜“>ò (ˆð	(Ü˜# wÔ/ˆCÜ˜3¨Ô0ˆDØ—9‘9“;×%Ñ% g°hÐ%Ó?Ò?ð	(ð$ øô ò 		Ø�v‰v˜Š}Ø˜G b™LÑ(�Ü˜¨ v¨S°°S°T°°¸1Ð=ÀTÕJÜ—
‘
˜4Ô ÜØ�v‰v˜Ñ#ÝÜ�H˜QŸV™V˜H B s¨3¨4 y kÐ2¸$Õ?Ü�J‰J�q�M‰MûÜœ,¬Ð0ò 	(Ü�GœD ›G×,Ñ,Ð-¨R°°C°D°	¨{Ð;À4ÕHÜ�J‰J�q˜7 Q™;‘×'Ò'ûð	(ús1   ¤:A#Á#	E(Á,ADÂ4DÃ5DÄE(ÄAE#Å#E(c                 ó\  — ddl m} |xs t        } || d«      }|j                  d«      D ]Æ  }|j	                  d«      xs d}|s%|j                  d«      }|r|j	                  dd«      }|s)|j                  dd	d
i¬«      }|r|j	                  dd«      }|rK|j                  d«      r|nt        ||«      }	|j                  d|	¬«      }
d|
_	        |j                  |
«       Œ·|j                  «        ŒÈ  |g d¢«      D ]  }|j                  «        Œ |j                  d«      D ]J  }dD ]  }||j                  v sŒ||= Œ t        |j                  «      D ]  }|j                  d«      sŒ||= Œ ŒL |j                  d«      D ]‡  }|j	                  d«      xs |j	                  d«      xs d}|rK|j                  d«      r|nt        ||«      }	|j                  d|	¬«      }
d|
_	        |j                  |
«       Œx|j                  «        Œ‰ |j                  g d¢«      D ]3  }|j                  dk(  r|j                  d«      rŒ$|j!                  «        Œ5 |j                  d«      D ]]  }
|
j	                  dd«      }|r4|j                  d«      s#|j                  d«      r|nt        ||«      |
d<   ŒK|sŒN|
j                  «        Œ_ |j                  d«      D ]I  }|j#                  d¬«      rŒ|j                  d«      rŒ(|j                  d«      rŒ:|j                  «        ŒK t%        |«      S )u_   ç™½å��å�•æ¸…æ´—: ä¿�ç•™ <p>/<table>/<a>, unwrap è£…é¥°æ ‡ç­¾, æ¸… inline style, é“¾æŽ¥ç»�å¯¹åŒ–r   ©ÚBeautifulSoupúhtml.parserÚvideoÚsrcr   ÚsourceÚparamÚnamer&   ©ÚattrsÚvalueÚhttpÚa©Úhrefu   æŸ¥çœ‹è§†é¢‘)ÚscriptÚstyleÚiframeÚobjectÚembedT)rA   ÚclassÚalignÚvalignÚborderÚcellpaddingÚcellspacingÚwidthÚheightÚbgcolorÚfaceÚcolorÚsizeÚlangÚdirÚ	setedariaÚtabindexÚrolezaria-Úimgzdata-srcu   æŸ¥çœ‹å›¾ç‰‡)ÚdivÚspanÚfontÚcenterÚbÚstrongÚemÚiÚuÚsÚlabelÚh1Úh2Úh3Útdre   Útabler?   Ú
javascriptÚp©Ústrip)Úbs4r2   ÚBASEÚfind_allÚgetÚfindÚ
startswithr   Únew_tagÚstringÚreplace_withÚ	decomposer:   Úlistr8   Úfind_parentÚunwrapÚget_textÚstr)ÚhtmlÚbase_urlr2   ÚbaseÚsoupÚvr5   r`   rh   Úabs_srcr=   ÚtÚattrrV   r?   s                  r.   Ú
clean_htmlr‚   3   sã  € å!ØÒ”t€DÙ˜˜}Ó-€DØ�]‰]˜7Ó#ò ˆØ�e‰e�E‹lÒ ˜bˆÙØ—‘�xÓ ˆAÙØ—e‘e˜E 2Ó&�ÙØ—‘�w v¨u o�Ó6ˆAÙØ—e‘e˜G RÓ(�ÙØ Ÿ^™^¨FÔ3‘c¼ÀÀsÓ9KˆGØ—‘˜S w�Ó/ˆAØ%ˆAŒHØ�N‰N˜1Õà�K‰K�Mð!ñ" ÒBÓCò ˆØ	�‰�ðà�]‰]˜4Ó ò ˆð6ò 	ˆDð �q—w‘wŠØ�d‘Gð		ô
 ˜Ÿ™“Mò 	ˆDØ�‰˜wÕ'Ø�d‘Gñ	ðð �}‰}˜UÓ#ò ˆØ�g‰g�e‹nÒ9 §¡¨
Ó 3Ò9°rˆÙØ Ÿ^™^¨FÔ3‘c¼ÀÀsÓ9KˆGØ—‘˜S w�Ó/ˆAØ%ˆAŒHØ×Ñ˜QÕà�M‰M�Oðð �]‰]ò  Bó  Cò ˆØ�6‰6�TŠ>˜aŸm™m¨GÔ4ØØ	�‰�
ðð �]‰]˜3Óò ˆØ�u‰u�V˜RÓ ˆÙ˜Ÿ™¨Ô5Ø $§¡°Ô 7™¼WÀTÈ4Ó=PˆAˆfŠIÚØ�K‰K�Mðð �]‰]˜3Óò ˆØ�z‰z ˆzÕ%¨a¯f©f°W­oÀaÇfÁfÈSÅkØ�K‰K�Mðô ˆt‹9Ðó    c                 óN  — ddl m}  || d«      }g }|j                  dd¬«      D ]½  }|d   }t        j                  d|«      sŒ|j                  d	«      xs |j                  d¬
«      xs dj                  «       }d}|j                  }|r2t        j                  dt        |«      «      }	|	r|	j                  d«      }|sŒ›|j                  |t        t        |«      |dœ«       Œ¿ t        «       g }}
|D ]/  }|d   |
vsŒ|
j                  |d   «       |j                  |«       Œ1 |S )u$   åˆ—è¡¨: li > a[title] + æ—¥æœŸæ–‡æœ¬r   r1   r3   r=   Tr>   r?   z)/html/czly/\d{4}/LBODQDEQ_\d{4}/\d+\.htmlÚtitleri   r   z(\d{4}-\d{2}-\d{2})é   )r…   r&   Údater&   )rk   r2   rm   ÚreÚsearchrn   rx   rj   Únext_siblingry   ÚgroupÚappendr   rl   ÚsetÚadd)rz   r2   r}   Úitemsr=   r?   r…   r‡   ÚnxtÚdmÚseenÚoutÚits                r.   Úparse_list_htmlr•   m   s  € å!Ù˜˜}Ó-€DØ€EØ�]‰]˜3 Tˆ]Ó*ò UˆØ�‰yˆÜ�y‰yÐEÀtÔLØØ—‘�w“Ò? 1§:¡:°D :Ó#9Ò?¸R×FÑFÓHˆØˆà�n‰nˆÙÜ—‘Ð1´3°s³8Ó<ˆBÙØ—x‘x “{�ÚØ�L‰L 5´¼¸tÓ1DÈdÑSÕTðUô “�rˆ#€DØò ˆØˆe‰9˜DÒ Ø�H‰H�R˜‘YÔØ�J‰J�r�Nðð €Jrƒ   c                 óä  ‡— ddl m}  || d«      Šˆfd„} |d«      xs d} |d«      xs d} |d«      xs d}‰j                  d	d
¬«      xs ‰j                  dd
¬«      }d}g }	|rß|j                  dd¬«      D ]„  }
|
d   j	                  «       }t        j                  d|«      sŒ-|
j                  d¬«      xs d}|j                  d«      r|nt        ||«      }|	j                  ||f«       |
j                  «        Œ† t        t        |«      |«      }|	r.dj                  d„ |	D «       «      }|dz   |z   j                  «       }||r|dd nd|||	D ��cg c]
  \  }}||dœ‘Œ c}}dœS c c}}w )u-   è¯¦æƒ…: meta å­—æ®µ + td#czfxcontent + é™„ä»¶r   r1   r3   c                 óÆ   •— ‰j                  dd| i¬«      xs# ‰j                  dd| j                  «       i¬«      }|r#|j                  d«      xs dj                  «       S dS )NÚmetar8   r9   Úcontentr   )ro   Úlowerrn   rj   )r8   Úmr}   s     €r.   r˜   zparse_detail_html.<locals>.meta�   s_   ø€ Ø�I‰I�f V¨T NˆIÓ3Òf°t·y±yÀÐPVÐX\×XbÑXbÓXdÐOe°yÓ7fˆÙ34�—‘�iÓ Ò& B×-Ñ-Ó/Ð<¸"Ð<rƒ   ÚArticleTitler   ÚPubDateÚContentSourcere   Úczfxcontent)ÚidrW   r=   Tr>   r?   zB\.(pdf|doc|docx|xls|xlsx|zip|rar|caj|wps|et|jpg|jpeg|png|gif|mp4)$ri   u   é™„ä»¶r<   c              3   ó4   K  — | ]  \  }}d |› d|› d�–— Œ y­w)z<p><a href="z">z</a></p>N© )Ú.0r€   Úfus      r.   ú	<genexpr>z$parse_detail_html.<locals>.<genexpr>    s#   è ø€ ÒTÁÀÀB˜l¨2¨$¨b°°°8Ô<ÑTùs   ‚ú
Né
   )ÚfileNameÚfileUrl)r…   Úpublish_dater™   r6   Úattachments)rk   r2   ro   rm   rš   rˆ   r‰   rx   rp   r   rŒ   rt   r‚   ry   Újoinrj   )rz   r&   r2   r˜   r…   Úpubr6   ÚzoomÚbodyÚ	att_linksr=   Úhr€   r¤   Úatt_pr}   s                  @r.   Úparse_detail_htmlr³   ‰   sw  ø€ å!Ù˜˜}Ó-€Dô=ñ �Ó Ò& B€EÙ
ˆy‹/Ò
˜R€CÙ�/Ó"Ò( b€FØ�9‰9�T˜mˆ9Ó,ÒR°·	±	¸%ÀM°	Ó0R€DØ€DØ€IÙØ—‘˜s¨�Ó.ò 	ˆAØ�&‘	—‘Ó!ˆAÜ�y‰yÐ^Ð`aÕbØ—J‘J T�JÓ*Ò6¨h�ØŸ,™, vÔ.‘Q´G¸CÀ³O�Ø× Ñ  ! R Ô)Ø—‘•ð	ô œ#˜d›) SÓ)ˆÙØ—G‘GÑTÈ)ÔTÓTˆEØ˜4‘K %Ñ'×.Ñ.Ó0ˆDàÙ$'˜˜C˜R™¨RØØØDM×N¹5¸1¸b Q°2Ó6ÓNñð ùó
 Os   ÅE,c                  óš	  — t        j                  «       } | j                  dt        dd¬«       | j                  dt        d¬«       | j                  dd	¬
«       | j                  dt        d¬«       | j	                  «       }ddddddœ}t        |j                  dd¬«      }t        «       }t        j                  j                  |j                  «      rDt        |j                  d¬«      D ]*  }	 |j                  t        j                  |«      d   «       Œ, t        t         «      }|st#        dd¬«       y d}t%        j&                  d|«      }|rt        |j)                  d«      «      }|j*                  dkD  rt-        ||j*                  «      }t#        d|› �d¬«       g }	t/        |j0                  |dz   «      D ]¥  }
|
dk(  rt         n
t         › d|
› �}t        |«      }|st#        d|
› d�d¬«        not3        |«      }|	j5                  |«       t#        d|
› dt7        |«      › dt7        |	«      › �d¬«       t9        j:                  t=        j>                  dd«      «       Œ§ t7        |	«      |d<   t#        d t7        |	«      › d!t7        |«      › d"�d¬«       |	D �cg c]  }|d#   |vsŒ|‘Œ }}t#        d$t7        |«      › �d¬«       tA        |d«      D �]«  \  }}t        |d#   «      }|sR|d%xx   dz  cc<   t#        d&|› dt7        |«      › d'|d#   › �d¬«       |d%   |jB                  k\  rt#        d(d¬«        �nGŒitE        ||d#   «      }|d)   s|d)   |d)<   |d*   s|d+   |d*<   |d,   }t7        |«      d-k  r|d.xx   dz  cc<   |d)   |d*   ||d#   |d#   tF        t%        jH                  d/d0|«      jK                  «       d d1 d|d2   |d2   |d3   d4œ}|jM                  t        jN                  |d5¬6«      d7z   «       |jQ                  «        |d8xx   dz  cc<   |d9z  dk(  s|t7        |«      k(  r(t#        d&|› dt7        |«      › d:|d8   › d;|d%   › �d¬«       t9        j:                  t=        j>                  dd<«      «       �Œ® |jS                  «        t#        d=t        jN                  |d5¬6«      › �d¬«       y # t        $ r Y �ŒÙw xY wc c}w )>Nz--pagesr   u   0=å…¨é‡�100é¡µ)r$   ÚdefaultÚhelpz--start-pager†   )r$   rµ   z--outz/tmp/liyang_tzgg.jsonl)rµ   z--max-detail-failé   )r�   Ú	detail_okÚdetail_failÚemptyÚskippedr=   r   )ÚencodingÚpage_urlu   é¦–åˆ—è¡¨é¡µæŠ“å�–å¤±è´¥Tr   éd   zFx_PageDiv2_1_3\">(\d+)</span>u
   æ€»é¡µæ•°=ú/u   é¡µu    æŠ“å�–å¤±è´¥, å�œæ­¢ç¿»é¡µz: u    æ�¡, ç´¯è®¡ gš™™™™™é?g      ø?r�   u   åˆ—è¡¨å®Œæˆ�: u    æ�¡ (å·²æŠ“è¿‡ r   r&   u   å¾…æŠ“è¯¦æƒ…: r¹   u   è¯¦æƒ… u   : æŠ“å�–å¤±è´¥ u   å¤±è´¥è¿‡å¤š, ä¸­æ­¢r…   rª   r‡   r™   r§   rº   z<[^>]+>ú éÈ   r6   r«   )r…   rª   r™   r½   Ú
source_urlÚ	site_nameÚsummaryÚ	date_rankÚauthorÚcontent_sourcer«   F)Úensure_asciir¦   r¸   r   z: ok=z fail=gš™™™™™@u   å®Œæˆ�: )*ÚargparseÚArgumentParserÚadd_argumentÚintÚ
parse_argsÚopenr“   r�   ÚosÚpathÚexistsrŽ   ÚjsonÚloadsÚ	Exceptionr/   ÚLIST_URLr   rˆ   r‰   r‹   ÚpagesÚminr   Ú
start_pager•   ÚextendÚlenr    r!   ÚrandomÚuniformÚ	enumerateÚmax_detail_failr³   Ú	SITE_NAMEÚsubrj   ÚwriteÚdumpsr   Úclose)ÚapÚargsÚstatsÚout_fpÚ	done_urlsÚlinerz   Úpages_totalr›   Ú	all_itemsÚpgr&   r±   r�   r”   Ú	new_itemsÚidxÚdr™   Úrecs                       r.   Úmainrñ   «   s”  € Ü	×	 Ñ	 Ó	"€BØ‡O�O�I¤C°Ð9I€OÔJØ‡O�O�N¬°a€OÔ8Ø‡O�O�GÐ%=€OÔ>Ø‡O�OÐ'¬c¸2€OÔ>Ø�=‰=‹?€Dà a¸ÀAÐRSÑT€EÜ�$—(‘(˜C¨'Ô2€Fä“€IÜ	‡w�w‡~�~�d—h‘hÔÜ˜Ÿ™¨GÔ4ò 	ˆDðØ—‘œdŸj™j¨Ó.¨zÑ:Õ;ð	ô ”‹?€DÙÜÐ(°Õ5ØØ€KÜ
�	‰	Ð3°TÓ:€AÙÜ˜!Ÿ'™' !›*“oˆØ‡z�z�A‚~Ü˜+ t§z¡zÓ2ˆÜ	ˆJ�{�mÐ
$¨DÕ1ð €IÜ�D—O‘O [°1¡_Ó5ò 	-ˆØ š'�h¬(¨°1°R°DÐ'9ˆÜ�#‹JˆÙÜ�C˜�tÐ6Ð7¸tÕDÙÜ Ó"ˆØ×Ñ˜ÔÜ��B�4�rœ#˜e›*˜ ]´3°y³>Ð2BÐCÈ4ÕPÜ�
‰
”6—>‘> # sÓ+Õ,ð	-ô ˜“^€Eˆ'�NÜ	ˆNœ3˜y›>Ð*Ð*:¼3¸y»>Ð:JÈ!Ð
LÐTXÕYð (ÖF˜¨2¨e©9¸IÒ+E’ÐF€IÐFÜ	ˆNœ3˜y›>Ð*Ð
+°4Õ8Ü˜Y¨Ó*ó #-‰ˆˆRÜ�R˜‘YÓˆÙØ�-Ó  AÑ%Ó Ü�G˜C˜5 ¤# i£.Ð!1°ÀÀEÁÀÐLÐTXÕYØ�]Ñ# t×';Ñ';Ò;ÜÐ,°DÕ9ÚØÜ˜d B u¡IÓ.ˆØ�ŠzØ˜G™ˆAˆg‰JØ�Ò Ø " 6¡
ˆAˆnÑØ�I‘,ˆÜˆw‹<˜"ÒØ�'‹N˜aÑ‹Nà�w‘ZØ˜nÑ-ØØ˜5™	Ø˜U™)Ü"Ü—v‘v˜j¨#¨wÓ7×=Ñ=Ó?ÀÀÐEØØ˜‘kØ ™kØ˜]Ñ+ñ
ˆð 	�‰”T—Z‘Z °%Ô8¸4Ñ?Ô@Ø�‰ŒØˆkÓ˜aÑÓØ�‰8�qŠ=˜C¤3 y£>Ò1Ü�G˜C˜5 ¤# i£.Ð!1°°u¸[Ñ7IÐ6JÈ&ÐQVÐWdÑQeÐPfÐgÐosÕtÜ�
‰
”6—>‘> # sÓ+Ö,ðG#-ðH ‡L�L„NÜ	ˆH”T—Z‘Z °EÔ:Ð;Ð
<ÀDÖIøôO ò Úðüò@ Gs   Ã/'R8ÊSÊ(SÒ8	SÓSÚ__main__)N)Ú__doc__rÉ   rÒ   rˆ   Úsysr    rÛ   rÏ   Úurllib.requestr   r   Úurllib.errorr   r   Úurllib.parser   rl   rÕ   rß   ÚUAr   r/   r‚   r•   r³   rñ   r%   r¢   rƒ   r.   ú<module>rù      s†   ðñ÷ 1× 0× 0Ó 0ß +ß ,Ý  à"€ØÐ#Ñ#€Ø€	Øv€àØOØ'ñ€ð  ¨°Qó ó27òtò8òDWJðt ˆzÒÙ…Fð rƒ   