Ë
    H«£j3(  ã                   óf  — 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mZ ddlm	Z	 ddl
mZ ddlZddl
ZdZdZdZ ej                   d	d
«      ZdZddddœZej(                  e_        dd„Zd„ Zdd„Zd„ Zd„ Zdd„Zedk(  r5 eej<                  «      dkD  r eej<                  d   «      ndZ  ee «       yy)uç   
æ³¸å·žå¸‚äººæ°‘æ”¿åºœ-å…¬ç¤ºå…¬å‘Š çˆ¬è™« (v2)
CMS: PowerCMS
åˆ—è¡¨: /xw/gsgg (page1), /xw/gsgg_N (page2+)
è¯¦æƒ…: /xw/gsgg/{zfgs|zfgg}/content_NNNNNN
Fix v2: æ¸…ç�†"æ ‡é¢˜ï¼š"å‰�ç¼€, ä¿®å¤�è¡¨æ ¼å†…å®¹é‡�å¤�(è·³è¿‡<td>å†…çš„<p>)
é    N©ÚBeautifulSoup)Úrequest)Úurljoinu"   æ³¸å·žå¸‚äººæ°‘æ”¿åºœ-å…¬ç¤ºå…¬å‘Šzhttps://www.luzhou.gov.cnz/xw/gsggÚ	SEARCH_DBz/root/search.dbé   z[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.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-Languagec                 ó  — t        j                  | t        ¬«      }	 t        j                  ||¬«      }|j	                  «       j                  dd¬«      S # t        $ r+}t        d| ›d|›�t        j                  ¬«       Y d }~y d }~ww xY w)	N)Úheaders)Útimeoutzutf-8Úignore)Úerrorsz
  [ERROR] z: )Úfile)
r   ÚRequestÚHEADERSÚurlopenÚreadÚdecodeÚ	ExceptionÚprintÚsysÚstderr)Úurlr   ÚreqÚrespÚes        úcrawl_luzhou.pyÚfetchr      si   € Ü
�/‰/˜#¤wÔ
/€CðÜ�‰˜s¨GÔ4ˆØ�y‰y‹{×!Ñ! '°(Ð!Ó;Ð;øÜò Ý¢C©Ð+´#·*±*Õ=Üûðús   �7A Á	B	Á!BÂB	c                 ór  — g }t        j                  d| «      D ]›  }|j                  d«      }|j                  d«      }|j                  d«      j                  «       }t        j                  dd|«      }|rt        |«      dk  rŒl|j                  d«      r|nt        |z   }|j                  |||f«       Œ� |S )	u@   ä»Žåˆ—è¡¨é¡µæ��å�–æ–‡ç« ä¿¡æ�¯. ul.newsList > li > span.date + azY<span\s+class="date">(\d{4}-\d{2}-\d{2})</span>\s*<a\s+href="([^"]+)"[^>]*title="([^"]*)"é   é   é   u   ^æ ‡é¢˜ï¼š\s*Ú r   Úhttp)	ÚreÚfinditerÚgroupÚstripÚsubÚlenÚ
startswithÚBASE_URLÚappend)ÚhtmlÚitemsÚmÚdateÚhrefÚtitleÚfull_urls          r   Ú
parse_listr5   )   s¦   € à€EÜ�[‰[ÐuÐw{Ó|ò 	.ˆØ�w‰w�q‹zˆØ�w‰w�q‹zˆØ—‘˜“
× Ñ Ó"ˆä—‘Ð'¨¨UÓ3ˆÙœ˜E›
 QšØØŸ?™?¨6Ô2‘4¼ÀD¹ˆØ�‰�e˜X tÐ,Õ-ð	.ð €Ló    c                 óØ  — ddl m}  |t        | «      d«      }|j                  d«      D ]P  }|j	                  dd«      }|sŒ|j                  d«      rŒ*|r t        j                  j                  ||«      n||d<   ŒR |j                  d«      D ]P  }|j	                  d	d«      }|sŒ|j                  d
«      rŒ*|r t        j                  j                  ||«      n||d	<   ŒR t        |«      S )uA   ä¿�ç•™ HTML è¡¨æ ¼ç»“æž„ï¼Œä»…å°†ç›¸å¯¹é“¾æŽ¥/å›¾ç‰‡è½¬ç»�å¯¹ URLr   r   zhtml.parserÚar2   r#   )r$   Ú
javascriptú#ÚimgÚsrc)r$   z//zdata:)	Úbs4r   ÚstrÚfind_allÚgetr+   ÚurllibÚparser   )ÚtableÚbase_urlr   Útblr8   r2   r;   r<   s           r   Úhtml_table_to_htmlrF   9   sÐ   € å!Ù
œ˜E›
 MÓ
2€CØ�\‰\˜#Óò SˆØ�u‰u�V˜RÓ ˆÚ˜Ÿ™Ð(CÕDÙ@HœŸ™×,Ñ,¨X°tÔ<ÈdˆAˆfŠIðSð �|‰|˜EÓ"ò RˆØ�g‰g�e˜RÓ ˆÚ�s—~‘~Ð&=Õ>Ù@HœŸ™×-Ñ-¨h¸Ô<ÈcˆC�ŠJðRô ˆs‹8€Or6   c           	      ó°  ‡— g }g }d}dD ]<  }t        j                  || t         j                  «      }|sŒ+|j                  d«      } n |s¬t        j                  d| t         j                  «      }|rrt        j                  d|j                  d«      t         j                  «      D ];  }t        j
                  dd|«      j                  «       }	|	sŒ+|j                  |	«       Œ= dj                  |«      }
�núg Št        j                  d	|t         j                  «      D ]1  }‰j                  |j                  «       |j                  «       f«       Œ3 ˆfd
„}g }t        |«      D �]^  \  }}}|dk(  r9|j                  d«      }|dkD  sŒ$t        |«      }|sŒ2|j                  ||f«       ŒF|dk(  r…t        j                  d|«      }t        j                  d|«      }|sŒz|j                  d«      }d|v sd|v rŒ”|r|j                  d«      nd}t        ||«      }|j                  |d|›d|›d�f«       ŒÐ|dk(  sŒÖ ||«      rŒßd|v sd|v sd|v rŒìt        j
                  dd|«      j                  «       }	|	j!                  dd«      }	t        j
                  dd|	«      }	|	j                  «       s�ŒL|j                  ||	f«       �Œa |j#                  d„ ¬«       dj                  d„ |D «       «      }
d}t        j                  d |z   d!z   | t         j                  «      D ]3  \  }}t        ||«      }|j                  |j                  «       |d"œ«       Œ5 |
|fS )#uu   
    æ��å�–æ­£æ–‡(å�«è¡¨æ ¼ã€�å›¾ç‰‡)å’Œé™„ä»¶.
    ä¿®å¤�: è·³è¿‡<td>å†…éƒ¨çš„<p>é˜²é‡�å¤�, è¯†åˆ«å¤šç§�å®¹å™¨.
    N)z1<div[^>]*class="conTxt"[^>]*>(.*?)</div>\s*</div>z(<div[^>]*class="conTxt"[^>]*>(.*?)</div>z2<div[^>]*class="content"[^>]*>(.*?)</div>\s*</div>z2<div[^>]*class="article"[^>]*>(.*?)</div>\s*</div>z#<div[^>]*id="zoom"[^>]*>(.*?)</div>r    z<body[^>]*>(.*?)</body>z<p[^>]*>(.*?)</p>z<[^>]+>r#   z

z<table[^>]*>.*?</table>c                 ó8   •— ‰D ]  \  }}|| cxk  r|k  sŒ y Œ y)NTF© )ÚposÚtsÚteÚtable_rangess      €r   Úis_inside_tablez%parse_detail.<locals>.is_inside_tablel   s.   ø€ Ø&ò  ‘��BØ˜”? “?Ùñ #ð ð r6   rC   z<tdr   r;   zsrc="([^"]+)"zalt="([^"]*)"Úicon_z/filetypeimages/z![z](ú)Úpz<tablez<thz&nbsp;ú z\s+c                 ó   — | d   S )Nr   rI   )Úxs    r   ú<lambda>zparse_detail.<locals>.<lambda>–   s
   €  A a¡D€ r6   )Úkeyc              3   ó&   K  — | ]	  \  }}|–— Œ y ­w)NrI   )Ú.0Ú_Útexts      r   ú	<genexpr>zparse_detail.<locals>.<genexpr>—   s   è ø€ Ò;¡w q¨$œdÑ;ùs   ‚z:\.(?:doc|docx|pdf|xls|xlsx|ppt|pptx|zip|rar|7z|txt|wps|et)z<a[^>]*href="([^"]+z)"[^>]*>([^<]+)</a>)r3   r   )r%   ÚsearchÚDOTALLr'   Úfindallr)   r(   r-   Újoinr&   ÚstartÚendÚ_extract_elements_sortedÚcountrF   r   ÚreplaceÚsort)r.   r   Úcontent_partsÚattachmentsÚ	containerÚpatr0   Úbody_mrQ   rZ   ÚcontentÚtmrN   ÚelementsrJ   ÚtagÚel_htmlÚtd_countÚmdÚsrc_mÚalt_mr<   ÚaltÚfull_srcÚ	file_extsÚa_hrefÚa_textr4   rM   s                               @r   Úparse_detailry   H   s  ø€ ð
 €MØ€Kð €Iðò 
ˆô �I‰I�c˜4¤§¡Ó+ˆÚØŸ™ ›
ˆIÙð
ñ Ü—‘Ð5°t¼R¿Y¹YÓGˆÙÜ—Z‘ZÐ 4°f·l±lÀ1³oÄrÇyÁyÓQò /�Ü—v‘v˜j¨"¨aÓ0×6Ñ6Ó8�ÚØ!×(Ñ(¨Õ.ð/ð —+‘+˜mÓ,Šð ˆÜ—+‘+Ð8¸)ÄRÇYÁYÓOò 	8ˆBØ×Ñ §¡£¨R¯V©V«XÐ 6Õ7ð	8ô	ð ˆô ":¸)Ó!Dó 	1ÑˆC��gØ�gŠ~Ø"Ÿ=™=¨Ó/�Ø˜a“<Ü+¨GÓ4�BÚØ Ÿ™¨¨b¨	Õ2Ø˜’ÜŸ	™	Ð"2°GÓ<�ÜŸ	™	Ð"2°GÓ<�ÚØŸ+™+ a›.�Cà #‘~Ð);¸sÑ)BØ Ù,1˜%Ÿ+™+ aœ.°r�CÜ& s¨CÓ0�HØ—O‘O¡SººhÐ*GÐ$HÕIØ˜“á" 3Ô'Øà˜wÑ&¨%°7Ñ*:¸eÀwÑ>NØÜ—v‘v˜j¨"¨gÓ6×<Ñ<Ó>�Ø—|‘| H¨cÓ2�Ü—v‘v˜f c¨4Ó0�Ø—:‘:–<Ø—O‘O S¨$ KÖ0ð;	1ð@ 	�‰™.ˆÔ)Ø—+‘+Ñ;°(Ô;Ó;ˆð N€IÜŸ*™*Ø Ñ*Ð-CÑCØŒb�i‰ióò G‰ˆ�ô ˜3 Ó'ˆØ×Ñ V§\¡\£^¸HÑEÕFðGð �KÐÐr6   c                 óB  — g }g }t        j                  d| t         j                  «      D ]A  }|j                  |j	                  «       |j                  «       |j                  d«      f«       ŒC |D ]¬  \  }}}|dv rhd|z   dz   }| j                  ||«      }|dk\  r| ||t        |«      z    }	n"| j                  d|«      }
|
dk\  r| ||
 }	n| |d }	|j                  |||	f«       Œs|d	k(  sŒy| j                  d|«      }|dk\  sŒ‘| ||dz    }	|j                  |||	f«       Œ® |S )
u,   ä»Žå®¹å™¨ä¸­æ��å�–æ‰€æœ‰p, table, imgå…ƒç´ .z<(p|table|img)\b[^>]*>r    )rQ   rC   z</ú>r   ú<Nr;   )	r%   r&   r]   r-   r`   ra   r'   Úfindr*   )rh   ÚresultsÚ
tag_startsr0   r`   Úm_endrn   Ú	close_tagÚend_posro   Ú
next_startÚ	close_poss               r   rb   rb   ¥   s<  € à€Gà€JÜ�[‰[Ð2°I¼r¿y¹yÓIò <ˆØ×Ñ˜1Ÿ7™7›9 a§e¡e£g¨q¯w©w°q«zÐ:Õ;ð<ð (ò 6Ñˆˆu�cØ�.Ñ à˜s™
 SÑ(ˆIØ—n‘n Y°Ó6ˆGØ˜!Š|Ø# E¨'´C¸	³NÑ*BÐC‘ð 'Ÿ^™^¨C°Ó7�
Ø ’?Ø'¨¨jÐ9‘Gà'¨¨Ð/�GØ�N‰N˜E 3¨Ð0Õ1Ø�E‹\à!Ÿ™ s¨EÓ2ˆIØ˜A‹~Ø# E¨)°a©-Ð8�Ø—‘  s¨GÐ4Õ5ð)6ð, €Nr6   c                 ód  — dd l }|j                  t        «      }|j                  «       }d}d}d}t	        d| dz   «      D �]F  }|dk(  rt
        t        z   }nt
        dt        |fz  z   }t        d||fz  d¬«       t        j                  t        «       t        |«      }	|	st        d|z  d¬«        �nÖt        |	«      }
|
st        d|z  d¬«        �n¶t        d	t        |
«      z  d¬«       |
D �]„  \  }}}|j                  d
|t        f«       |j!                  «       }|r|d   rt        |d   «      dkD  r|dz  }ŒNt        j                  t        «       t        |«      }|sNt        d|d d z  d¬«       t        j                  d«       t        |«      }|st        d|d d z  d¬«       |dz  }ŒÂt#        ||«      \  }}t%        j&                  |d¬«      }|r.|d d }t        d|d d t        |«      t        |«      fz  d¬«       n|}t        d|d d z  d¬«       |r|j                  d|||||d   f«       n|j                  dt        ||||||f«       |j(                  dkD  s|r	 |dz  }�Œ€|dz  }�Œ‡ |j+                  «        �ŒI |j-                  «        t        dt        |||fz  d¬«       y )Nr   r    z%s_%du   [åˆ†é¡µ] ç¬¬%dé¡µ: %sT)Úflushu     [å®Œæˆ�] ç¬¬%dé¡µæ— æ³•èŽ·å�–u     [å®Œæˆ�] ç¬¬%dé¡µæ— æ•°æ�®u     æ‰¾åˆ° %d æ�¡z@SELECT id, content FROM gov_raw WHERE page_url=? AND site_name=?é
   u     [ç­‰å¾…5sé‡�è¯•] %sé   r   u     [è·³è¿‡] è¯¦æƒ…é¡µ: %sF)Úensure_asciiéÈ   u#     [æ­£æ–‡] %s -> %d chars, %dé™„ä»¶u&     [æ— æ–‡æœ¬] %s (æ‰«æ��ä»¶/é™„ä»¶é¡µ)zJUPDATE gov_raw SET content=?, title=?, attachments=?, summary=? WHERE id=?z²INSERT OR IGNORE INTO gov_raw
                       (site_name, page_url, title, content, publish_date, attachments, summary)
                       VALUES (?, ?, ?, ?, ?, ?, ?)u+   
[DONE] %s: æ–°å¢ž=%d, è·³è¿‡=%d, é”™è¯¯=%d)Úsqlite3ÚconnectÚDB_PATHÚcursorÚranger,   Ú	LIST_BASEr   ÚtimeÚsleepÚDELAYr   r5   r*   ÚexecuteÚ	SITE_NAMEÚfetchonery   ÚjsonÚdumpsÚrowcountÚcommitÚclose)Ú	max_pagesr‹   ÚconnÚcurÚ	new_countÚ
skip_countÚerror_countÚpageÚlist_urlr.   r/   r3   Ú
detail_urlr1   ÚrowÚdetail_htmlrk   rg   Úattachments_jsonÚsummarys                       r   Úcrawlr©   Æ   sÐ  € ÛØ�?‰?œ7Ó#€DØ
�+‰+‹-€Cà€IØ€JØ€Kä�a˜ Q™Ó'ó GˆØ�1Š9Ü¤)Ñ+‰Hä 7¬i¸Ð->Ñ#>Ñ?ˆHäÐ%¨¨xÐ(8Ñ8ÀÕEä�
‰
”5ÔÜ�X‹ˆÙÜÐ3°dÑ:À$ÕGÚä˜4Ó ˆÙÜÐ0°4Ñ7¸tÕDÚäÐ¤# e£*Ñ,°DÕ9à',ó 0	 Ñ#ˆE�:˜tØ�K‰KÐZØ"¤IÐ.ô0à—,‘,“.ˆCá�s˜1’v¤# c¨!¡f£+°Ò"2Ø˜a‘�
Øä�J‰J”uÔä 
Ó+ˆKÙÜÐ-°°c°r°
Ñ:À$ÕGÜ—
‘
˜1”Ü# JÓ/�Ù"ÜÐ4°u¸S¸b°zÑAÈÕNØ 1Ñ$�KØä#/°¸ZÓ#HÑ ˆG�[Ü#Ÿz™z¨+ÀEÔJÐáØ! $ 3˜-�ÜÐ;Ø˜S˜b�z¤3 w£<´°[Ó1AÐBñCØJNöPð  �ÜÐ>ÀÀsÈÀÑKÐSWÕXáØ—‘Ø`Ø˜eÐ%5°wÀÀAÁÐGõð
 —‘ð7ô  
¨E°7¸DÐBRÐT[Ð\ô	ð �|‰|˜aÒ¡C¨DØ˜Q‘’	à˜a‘’
ða0	 ðd 	�‰ŽðOGðR 	‡J�J„LÜ	Ð
8Ü�i ¨[Ð
9ñ:ØAEöGr6   Ú__main__r    )rˆ   )r#   )r   )!Ú__doc__Úosr%   r   r—   r‘   r=   r   rA   r   Úurllib.parser   Ússlr•   r,   r�   Úgetenvr�   r“   r   Ú_create_unverified_contextÚ_create_default_https_contextr   r5   rF   ry   rb   r©   Ú__name__r*   ÚargvÚintÚmax_prI   r6   r   ú<module>r¶      sË   ðñ÷ × Ó Ý Ý Ý  Û 
Û à0€	Ø&€Ø€	Ø
ˆ"�)‰)�KÐ!2Ó
3€Ø	€ð pØOØ'ñ€ð %(×$BÑ$B€Ô !óòó òZ òzóBTGðn ˆzÒÙ # C§H¡H£°Ò 1‰C�—‘˜‘Ô°q€EÙ	ˆ%…Lð r6   