Ë
    H«£jk  ã                   ól  — d dl Z d dlm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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)é    N©ÚBeautifulSoup)Úrequest)Úurljoinu   å�°å®‰åŽ¿-ç”Ÿæ€�çŽ¯å¢ƒä¿¡æ�¯zhttp://www.lntaian.gov.cnz*/taxzf/zdlyxxgk/zdmshshgysyjs/sthjxx/glistÚ	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                 óp  — t        j                  | t        ¬«      }	 t        j                  ||¬«      }|j	                  «       }|j                  dd¬«      }d|d d j                  «       v r|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Úreplace)ÚerrorsÚgbiÐ  Úgbkz
  [ERROR] z: )Úfile)r   ÚRequestÚHEADERSÚurlopenÚreadÚdecodeÚlowerÚ	ExceptionÚprintÚsysÚstderr)Úurlr   ÚreqÚrespÚrawÚhtmlÚes          úcrawl_taian.pyÚfetchr$      s˜   € Ü
�/‰/˜#¤wÔ
/€Cð	Ü�‰˜s¨GÔ4ˆØ�i‰i‹kˆØ�z‰z˜'¨)ˆzÓ4ˆØ�4˜˜�;×$Ñ$Ó&Ñ&Ø—:‘:˜e¨I�:Ó6ˆDØˆøÜò Ý¢C©Ð+´#·*±*Õ=Üûðús   �A#B Â	B5Â
!B0Â0B5c                 ó~  — g }t        j                  d| t         j                  «      D ]’  }|j                  d«      }|j                  d«      j	                  «       }|j                  d«      j	                  «       }|rt        |«      dk  rŒc|j                  d«      r|nt        |z   }|j                  |||f«       Œ” |S )Nzm<div\s+class="time">(\d{4}-\d{2}-\d{2})</div>\s*<div\s+class="name">\s*<a[^>]*href="([^"]+)"[^>]*>([^<]+)</a>é   r   é   é   Úhttp)	ÚreÚfinditerÚDOTALLÚgroupÚstripÚlenÚ
startswithÚBASE_URLÚappend)r!   ÚitemsÚmÚdateÚhrefÚtitleÚfull_urls          r#   Ú
parse_listr9   -   s¦   € Ø€EÜ�[‰[ØxØŒb�i‰ióò 
.ˆð �w‰w�q‹zˆØ�w‰w�q‹z×ÑÓ!ˆØ—‘˜“
× Ñ Ó"ˆÙœ˜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Úar6   Ú )r)   Ú
javascriptú#ÚimgÚsrc)r)   z//zdata:)	Úbs4r   ÚstrÚfind_allÚgetr0   ÚurllibÚparser   )ÚtableÚbase_urlr   Útblr<   r6   r@   rA   s           r#   Úhtml_table_to_htmlrK   =   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€Or:   c                 óÌ  ‡— g }g }d }dD ]<  }t        j                  || t         j                  «      }|sŒ+|j                  d«      } n |�rSt        j                  d|t         j                  «      D ]á  }t        j
                  dd|«      j                  «       }|j                  dd«      }t        j
                  dd|«      }t        j                  d	|t         j                  «      D ]D  \  }	}
t        ||	«      Š|
j                  «       sŒ#|j                  |
j                  «       ‰d
œ«       ŒF |sŒÀ|j                  «       sŒÑ|j                  |«       Œã t        j                  d|t         j                  «      D ]!  }t        |«      }|sŒ|j                  |«       Œ# nÂt        j                  d| t         j                  «      }|r›t        j                  d|j                  d«      t         j                  «      D ]d  }t        j
                  dd|«      j                  «       }|j                  dd«      }t        j
                  dd|«      }|sŒT|j                  |«       Œf t        j                  d| t         j                  «      D ]H  \  }	}
t        ||	«      Št        ˆfd„|D «       «      rŒ'|j                  |
j                  «       ‰d
œ«       ŒJ dj                  |«      }||fS )N)z@<div\s+class="hwq-info-article-center"[^>]*>(.*?)</div>\s*</div>z7<div\s+class="hwq-info-article-center"[^>]*>(.*?)</div>r&   z<p[^>]*>(.*?)</p>z<[^>]+>r=   z&nbsp;ú z\s+zJ<a[^>]*href="([^"]+\.(?:docx?|pdf|xlsx?|rar|zip|wps|et))"[^>]*>([^<]+)</a>)r7   r   z<table[^>]*>.*?</table>z<body[^>]*>(.*?)</body>zC<a[^>]*href="([^"]+\.(?:docx?|pdf|xlsx?|rar|zip))"[^>]*>([^<]+)</a>c              3   ó.   •K  — | ]  }|d    ‰k(  –— Œ y­w)r   N© )Ú.0r<   Úfulls     €r#   ú	<genexpr>zparse_detail.<locals>.<genexpr>|   s   øè ø€ Ò9¨�1�U‘8˜tÕ#Ñ9ùs   ƒz

)r*   Úsearchr,   r-   ÚfindallÚsubr.   r   ÚIr   r2   rK   ÚanyÚjoin)r!   r   Úcontent_partsÚattachmentsÚ	containerÚpatr4   Úp_htmlÚtextÚa_hrefÚa_textÚt_htmlÚtable_mdÚbody_mÚcontentrQ   s                  @r#   Úparse_detailre   L   ss  ø€ Ø€MØ€Kà€Iðò ˆô �I‰I�c˜4¤§¡Ó+ˆÚØŸ™ ›
ˆIÙðò Ü—j‘jÐ!5°yÄ"Ç)Á)ÓLò 	+ˆFÜ—6‘6˜* b¨&Ó1×7Ñ7Ó9ˆDØ—<‘< ¨#Ó.ˆDÜ—6‘6˜& # tÓ,ˆDÜ"$§*¡*Ø]ØœŸ™ó#ò O‘�˜ô ˜s FÓ+�Ø—<‘<•>Ø×&Ñ&°·±³ÈÑ'MÕNðOò ˜Ÿ
™
�Ø×$Ñ$ TÕ*ð	+ô —j‘jÐ!;¸YÌÏ	É	ÓRò 	/ˆFÜ)¨&Ó1ˆHÚØ×$Ñ$ XÕ.ñ	/ô
 —‘Ð5°t¼R¿Y¹YÓGˆÙÜŸ*™*Ð%9¸6¿<¹<È»?ÌBÏIÉIÓVò /�Ü—v‘v˜j¨"¨fÓ5×;Ñ;Ó=�Ø—|‘| H¨cÓ2�Ü—v‘v˜f c¨4Ó0�ÚØ!×(Ñ(¨Õ.ð/ô Ÿ*™*ØNØŒb�d‰dóò G‰ˆ�ô �s˜FÓ#ˆÜÓ9¨[Ô9Õ9Ø×Ñ¨¯©«ÀÑEÕFðGð �k‰k˜-Ó(€GØ�KÐÐr:   c                 ór   — t        j                  d| «      }|r|j                  d«      j                  «       S y )Nz3<div\s+class="hwq-info-article-title">([^<]+)</div>r&   )r*   rS   r-   r.   )r!   r4   s     r#   Úget_title_from_htmlrg   ƒ   s0   € Ü
�	‰	ÐHÈ$ÓO€AÙØ�w‰w�q‹z×ÑÓ!Ð!Ør:   c                 ó¦  — dd l }|j                  t        d¬«      }|j                  «       }d}d}d}t	        d| dz   «      D �]e  }|dk(  rt
        t        z   dz   }nt
        t        z   t        |dz
  «      z   d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¬«      }t+        |«      }|r|}|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/                  «        �Œh |j1                  «        t        dt         |||fz  d¬«       y )Nr   é<   r   r&   z.htmlu   [åˆ†é¡µ] ç¬¬%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Úranger1   Ú	LIST_PATHrC   r   ÚtimeÚsleepÚDELAYr$   r9   r/   ÚexecuteÚ	SITE_NAMEÚfetchonere   ÚjsonÚdumpsrg   ÚrowcountÚcommitÚclose)Ú	max_pagesro   ÚconnÚcurÚ	new_countÚ
skip_countÚerror_countÚpageÚlist_urlr!   r3   r7   Ú
detail_urlr5   ÚrowÚdetail_htmlrd   rZ   Úattachments_jsonÚdetail_titleÚsummarys                        r#   ÚcrawlrŽ   Š   sò  € ÛØ�?‰?œ7¨Bˆ?Ó/€DØ
�+‰+‹-€Cà€IØ€JØ€Kä�a˜ Q™Ó'ó KˆØ�1Š9Ü¤)Ñ+¨gÑ5‰Hä¤)Ñ+¬c°$¸±(«mÑ;¸gÑEˆHäÐ%¨¨xÐ(8Ñ8ÀÕEä�
‰
”5ÔÜ�X‹ˆÙÜÐ3°dÑ:À$ÕGÚä˜4Ó ˆÙÜÐ0°4Ñ7¸tÕDÚäÐ¤# e£*Ñ,°DÕ9à',ó 4	 Ñ#ˆ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Ðä.¨{Ó;ˆLÙØ$�áØ! $ 3˜-�ÜÐ;Ø˜S˜b�z¤3 w£<´°[Ó1AÐBñCØJNöPð  �ÜÐ4°u¸S¸b°zÑAÈÕNáØ—‘Ø`Ø˜eÐ%5°wÀÀAÁÐGõð
 —‘ð7ô  
¨E°7¸DÐBRÐT[Ð\ô	ð �|‰|˜aÒ¡C¨DØ˜Q‘’	à˜a‘’
ði4	 ðl 	�‰ŽðWKðZ 	‡J�J„LÜ	Ð
8Ü�i ¨[Ð
9ñ:ØAEöGr:   Ú__main__r&   r(   )rl   )r=   )r   ) ÚosrB   r   r*   r   r{   ru   rF   r   Úurllib.parser   Ússlry   r1   rt   Úgetenvrq   rw   r   Ú_create_unverified_contextÚ_create_default_https_contextr$   r9   rK   re   rg   rŽ   Ú__name__r/   ÚargvÚintÚmax_prO   r:   r#   ú<module>rš      sÌ   ðã 	Ý ð÷ × Ó Ý Ý  Û 
Û à*€	Ø&€Ø8€	Ø
ˆ"�)‰)�KÐ!2Ó
3€Ø	€ð pØOØ'ñ€ð %(×$BÑ$B€Ô !óòó ò4 ònóXGðv ˆzÒÙ # C§H¡H£°Ò 1‰C�—‘˜‘Ô°q€EÙ	ˆ%…Lð r:   