Ë
    ~W|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	Z	ddl
Z
ddlZddlmZmZ dZedz   ZdZdZdZej(                  j+                  d	d
«      Zej(                  j+                  dd«      ZdZdddedœZdZdadZ eej<                  «      D ]k  \  ZZ e jC                  d«      r	  e"e jG                  dd«      d   «      ZŒ4e dk(  sŒ:edz    e%ej<                  «      k  sŒS	  e"ej<                  edz      «      ZŒm edk\  rendZ&d"d„Z'd„ Z(d„ Z)d„ Z*d„ Z+d„ Z,d„ Z-d„ Z.d „ Z/e0d!k(  r e/«        yy# e$$ r Y Œ¨w xY w# e$$ r Y Œ³w xY w)#uó  
crawl_huizhou_jsxmhjyxpjxx.py - æƒ å·žå¸‚-å»ºè®¾é¡¹ç›®çŽ¯è¯„ä¿¡æ�¯
https://www.huizhou.gov.cn/zdlyxxgk/hjbhxxgk/jsxmhjyxpjxx/
å¹¿ä¸œæ”¿åºœç«™ç¾¤ post_N æ ¼å¼� (ä¸Žæ±ŸåŸŽåŒºå�Œæž„, NFCMS)
åˆ—è¡¨: table > tr > td > a[id=id_N][href=...content/post_N.html][title=å®Œæ•´æ ‡é¢˜] + td æ—¥æœŸ(YYYY-MM-DD)
åˆ†é¡µ: index.html / index_N.html (N=2..45, 45é¡µ ~945æ�¡, æ¯�é¡µ21)
è¯¦æƒ…: /content/post_NNNNNN.html
  â†’ meta ArticleTitle/PubDate + div#zoomcon(æ­£æ–‡, å�«è¡¨æ ¼) + /attachment/ é™„ä»¶(ç»�å¯¹URL)
é    N)ÚBeautifulSoupÚCommentzhttp://www.huizhou.gov.cnz /zdlyxxgk/hjbhxxgk/jsxmhjyxpjxx/u"   æƒ å·žå¸‚-å»ºè®¾é¡¹ç›®çŽ¯è¯„ä¿¡æ�¯u   å¹¿ä¸œzcrawl_huizhou_jsxmhjyxpjxx.pyÚDB_PATHz/root/search.dbÚ
JSONL_PATHÚ úutf-8zkMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.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ÚRefererg333333ó?g        é   z--pages=ú=z--pagesc                 ó’  — t        j                   «       t        z
  }|t        k  rt        j                  t        |z
  «       t        j                   «       at	        |«      D ]V  }	 t        j                  | t        |d¬«      }|j                  dk(  rd|_	        |c S 	 t        j                  d|dz  z   «       ŒX y # t        $ r Y Œ)w xY w)NF)ÚheadersÚtimeoutÚverifyéÈ   r   é   )ÚtimeÚ	_last_reqÚREQUEST_INTERVALÚsleepÚrangeÚrequestsÚgetÚHEADERSÚstatus_codeÚencodingÚ	Exception)ÚurlÚretriesr   ÚdtÚiÚrs         ú//root/gov_crawler/crawl_huizhou_jsxmhjyxpjxx.pyÚhttp_getr$   ;   s°   € ä	�‰‹”yÑ	 €BØ	ÔÒÜ�
‰
Ô# bÑ(Ô)Ü—	‘	“€IÜ�7‹^ò ˆð	Ü—‘˜S¬'¸7È5ÔQˆAØ�}‰} Ò#Ø$�”
Ø’ð $ô
 	�
‰
�1�q˜1‘u‘9Õðð øô ò 	Ùð	ús   Á$4B:Â:	CÃCc                 ó  — | syt        j                  | «      } | j                  dd«      j                  dd«      j                  dd«      j                  dd«      } t        j                  dd| «      } | j                  «       S )Nr   u   â€‹u   â€Œu   â€�u   ï»¿ú\s+ú )Úhtml_libÚunescapeÚreplaceÚreÚsubÚstrip)Úts    r#   Úclean_titler/   M   so   € ÙØÜ×Ñ˜!Ó€AØ	�	‰	�(˜BÓ×'Ñ'¨°"Ó5×=Ñ=¸hÈÓK×SÑSÐT\Ð^`Óa€AÜ
�‰ˆv�s˜AÓ€AØ�7‰7‹9Ðó    c                 óÐ  — | dk(  rt         }nt         d| › d�z   }t        |«      }|€g S |j                  }g }t        j                  d|t        j
                  «      D ]‡  }|j                  d«      t        |j                  d«      «      |j                  d«      }}}|j                  d«      r$t        j                  j                  t        |«      }|j                  |||f«       Œ‰ |S )u0   æŠ“ä¸€é¡µåˆ—è¡¨, è¿”å›ž [(abs_url, title, date)]r   Úindex_z.htmlzŒ<a\s+id="id_\d+"[^>]*href="([^"]*content/post_\d+\.html)"[^>]*title="([^"]*)"[^>]*>.*?</a>\s*</td>\s*<td[^>]*>\s*(\d{4}-\d{2}-\d{2})\s*</td>r   é   ú/)ÚLIST_URLr$   Útextr+   ÚfinditerÚSÚgroupr/   Ú
startswithÚurllibÚparseÚurljoinÚBASE_URLÚappend)	Úpager   r"   Ú	html_textÚitemsÚmÚabs_urlÚtitleÚdates	            r#   Ú
fetch_listrG   V   så   € àˆq‚yÜ‰ä˜6 $  uÐ-Ñ-ˆÜ�‹€AØ€yØˆ	Ø—‘€IØ€Eä�[‰[ð  ið  ktô  vx÷  vzñ  vzó  {ò -ˆØ Ÿw™w q›z¬;°q·w±w¸q³zÓ+BÀAÇGÁGÈAÃJ˜�ˆØ×Ñ˜cÔ"Ü—l‘l×*Ñ*¬8°WÓ=ˆGØ�‰�g˜u dÐ+Õ,ð	-ð
 €Lr0   c                 ó"  — t        | «      }|€y|j                  }t        |d«      }d}t        j                  d|«      }|rt        |j                  d«      «      }|sCt        j                  d|t        j                  «      }|rt        |j                  d«      «      nd}d}t        j                  d|«      }|r|j                  d«      }|j                  d	¬
«      }	|	s||dfS |	j                  d„ ¬«      D ]  }
|
j                  «        Œ |||	fS )u-   è¯¦æƒ…é¡µ: è¿”å›ž (title, pubdate, zoom_soup)N)NNNzhtml.parserr   z+<meta name="ArticleTitle" content="([^"]*)"r   z<title>(.*?)</title>z1<meta name="PubDate" content="(\d{4}-\d{2}-\d{2})Úzoomcon)Úidc                 ó"   — t        | t        «      S )N)Ú
isinstancer   ©Úss    r#   ú<lambda>zparse_detail.<locals>.<lambda>�   s   € ¬J°q¼'Ó,B€ r0   ©Ústring)r$   r6   r   r+   Úsearchr/   r9   r8   ÚfindÚfind_allÚextract)r   r"   rA   ÚsouprE   ÚtmÚt2ÚpubdateÚpmÚzoomÚcs              r#   Úparse_detailr]   j   sú   € ä�‹€AØ€yØØ—‘€IÜ˜ MÓ2€Dà€EÜ	�‰ÐAÀ9Ó	M€BÙ	Ü˜BŸH™H Q›KÓ(ˆÙÜ�Y‰YÐ.°	¼2¿4¹4Ó@ˆÙ,.”˜BŸH™H Q›KÔ(°Bˆà€GÜ	�‰ÐGÈÓ	S€BÙ	Ø—(‘(˜1“+ˆØ�9‰9˜	ˆ9Ó"€DÙØ�g˜tÐ#Ð#Ø�]‰]Ñ"Bˆ]ÓCò ˆØ	�	‰	�ðà�'˜4ÐÐr0   c                 óò  — | €ddg fS | j                  g d¢«      D ]  }|j                  «        Œ | j                  d„ ¬«      D ](  }|j                  ddg«      }|sŒ|j                  «        Œ* t        | j	                  d«      «      }g }| j                  d	d
¬«      D ]Ô  }|d   j                  «       }|j                  d«      s|j                  d«      r't        j                  j                  t        |«      |d<   |j                  «       j                  d«      s%d|j                  «       v sd|j                  «       v sŒ£t        |j                  «       «      }|sŒ¿|j                  |d   |f«       ŒÖ | j                  dd
¬«      D ]_  }	|	d   j                  «       }
|
j                  d«      s|
j                  d«      sŒ9t        j                  j                  t        |
«      |	d<   Œa t!        | «      }|||fS )Nr   F)ÚscriptÚstyleÚiframeÚobjectc                 ó$   — | xr dt        | «      v S )Nu   æ‚¨å½“å‰�æ‰€åœ¨ä½�ç½®)ÚstrrM   s    r#   rO   zhtml_to_text.<locals>.<lambda>Œ   s   € °1Ò3ZÐ9PÔTWÐXYÓTZÐ9Z€ r0   rP   ÚtdÚdivÚtableÚaT)Úhrefri   r4   Úhttp)z.pdfz.docz.docxz.xlsz.xlsxz.zipz.rarz.wpsÚ
attachmentÚuploadÚimg)Úsrcrn   )rT   Ú	decomposeÚfind_parentÚboolrS   r-   r:   r;   r<   r=   r>   ÚlowerÚendswithr/   Úget_textr?   rd   )Ú	zoom_souprD   ÚtagÚtxtÚancÚ	has_tableÚattachmentsrh   Úhrm   rN   Úcontents               r#   Úhtml_to_textr}   †   sç  € ØÐØ�5˜"ˆ}ÐØ×!Ñ!Ò"IÓJò ˆØ�‰�ðð ×!Ñ!Ñ)ZÐ!Ó[ò ˆØ�o‰o˜t U˜mÓ,ˆÚØ�M‰M�Oðô �Y—^‘^ GÓ,Ó-€IØ€KØ×Ñ ¨$ÐÓ/ò 5ˆØˆf‰I�O‰OÓˆØ�<‰<˜Ô §¡¨VÔ 4ÜŸ™×,Ñ,¬X°qÓ9ˆAˆf‰IØ�7‰7‹9×ÑÐ`ÔaÐeqÐuv×u|Ñu|Óu~Ñe~ð  CKð  OP÷  OVñ  OVó  OXò  CXÜ˜aŸj™j›lÓ+ˆCÚØ×"Ñ" A f¡I¨sÐ#3Õ4ð5ð ×!Ñ! %¨TÐ!Ó2ò ;ˆØ�‰J×ÑÓˆØ�<‰<˜Ô §¡¨VÕ 4ÜŸ™×-Ñ-¬h¸Ó:ˆC�ŠJð;ô �)‹n€GØ�I˜{Ð*Ð*r0   c                 óš   — |s| S | j                  «       r| gng }|D ]  \  }}|j                  d|› d|› d�«       Œ dj                  |«      S )Nz<p><a href="z" target="_blank">z</a></p>z

)r-   r?   Újoin)r|   rz   ÚpartsrD   rw   s        r#   Úappend_attachmentsr�   ¢   s[   € ÙØˆØ Ÿ™œˆW‰I¨b€EØ#ò N‰ˆ�Ø�‰�| G 9Ð,>¸s¸eÀ8ÐLÕMðNà�;‰;�uÓÐr0   c                 ó°   — 	 | j                  dt        f«      }|j                  «       D �ch c]  }|d   ’Œ	 c}S c c}w # t        $ r t	        «       cY S w xY w)Nz.SELECT page_url FROM gov_raw WHERE site_name=?r   )ÚexecuteÚ	SITE_NAMEÚfetchallr   Úset)ÚconnÚcurÚrows      r#   Úload_existing_urlsrŠ   «   sN   € ðØ�l‰lÐKÌiÈ\ÓZˆØ"%§,¡,£.Ö1˜3��A“Ò1Ð1ùÒ1øÜò Ü‹uŠðús   ‚)? «:·? º? ¿AÁAc                 óž  — | j                  d|t        f«      }|j                  «       ry	 d}	 ddlm}  ||«      }| j                  d|||||t        t        t        ||f
«      }|j                  dkD  ryt        j                  dd|«      }	t        j                  |	«      }	t        j                  d	d
|	«      j                  «       d d }	| j                  d|j                  |t        |	f«       yy# t
        $ r Y Œ¼w xY w# t        j                   $ r=}
dt#        |
«      v r*t%        j&                  d«       t)        | |||||«      cY d }
~
S ‚ d }
~
ww xY w)Nz7SELECT id FROM gov_raw WHERE page_url=? AND site_name=?FÚotherr   )Úclassify_industryz¨INSERT OR IGNORE INTO gov_raw (page_url, source_url, title, content, publish_date, site_name, group_name, script_name, has_table, industry) VALUES (?,?,?,?,?,?,?,?,?,?)ú<[^>]+>r   r&   r'   r   zTINSERT OR IGNORE INTO gov_search (rowid, title, site_name, summary) VALUES (?,?,?,?)TÚlockedr3   )rƒ   r„   ÚfetchoneÚcrawler_libr�   r   Ú
GROUP_NAMEÚSCRIPT_NAMEÚrowcountr+   r,   r(   r)   r-   Ú	lastrowidÚsqlite3ÚOperationalErrorrd   r   r   Ústore_record)r‡   r   rE   r|   rF   ry   rˆ   Úindustryr�   ÚsummaryÚes              r#   r˜   r˜   ³   sF  € Ø
�,‰,ÐPÐSVÔXaÐRbÓ
c€CØ
‡|�|„~ØðØˆð	Ý5Ù(¨Ó/ˆHð �l‰lð+ð �#�u˜g t¬Y¼
ÄKÐQZÐ\dÐeó	
ˆð �<‰<˜!ÒÜ—f‘f˜Z¨¨WÓ5ˆGÜ×'Ñ'¨Ó0ˆGÜ—f‘f˜V S¨'Ó2×8Ñ8Ó:¸4¸CÐ@ˆGØ�L‰LØfØ—‘ ¤y°'Ð:ôð Øøô# ò 	Ùð	ûô$ ×#Ñ#ò Ø”s˜1“vÑÜ�J‰J�qŒMÜ  c¨5°'¸4ÀÓKÕKØûð	úsF   «C< ®C- ¼B/C< Ã-	C9Ã6C< Ã8C9Ã9C< Ã<EÄ1EÅ EÅEÅEc                  ó˜  — d } t         sbt        j                  t        d¬«      } | j	                  d«       | j	                  d«       t        | «      }t        dt        |«      › d�d¬«       d	}d	}g }t        d
t        d
z   «      D �]�  }t        |«      }t        d|› dt        |«      › �d¬«       |st        dd¬«        �nV|D �]M  \  }}}	t         s
|v r|d
z  }Œt        |«      \  }
}}|€t        d|d d › d|› �d¬«       |d
z  }ŒE|
s|}
|s|	}t        ||«      \  }}}t        ||«      }t        t        j                  dd|«      j!                  «       «      }|dk  r"d|vr|st        d|
d d › d|› �d¬«       |d
z  }Œ¾t         rD|j#                  ||
|||t$        t&        t(        dœ«       t        d|
d d › d|› d�d¬«       |d
z  }�Œt+        | ||
|||«      }|r/|d
z  }j-                  |«       t        d|
d d › d|› d�d¬«       �ŒI|d
z  }�ŒP �Œ’ t         rmt/        t         dd¬«      5 }|D ]+  }|j1                  t3        j4                  |d¬«      d z   «       Œ- 	 d d d «       t        d!t         › dt        |«      › d"�d¬«       | � | j7                  «        | j9                  «        t        d#|› d$|› �d¬«       y # 1 sw Y   Œ`xY w)%Né<   )r   zPRAGMA busy_timeout=60000zPRAGMA journal_mode=WALu
   å·²å…¥åº“ u    æ�¡, ç”¨äºŽåˆ—è¡¨çº§é¢„æŸ¥é‡�T)Úflushr   r   z[list] page=z items=zEmpty page, stop paginationz  skip empty: é   z | rŽ   r   é
   z<img)Úpage_urlrE   r|   Úpublish_datery   Ú	site_nameÚ
group_nameÚscript_namez
  JSONL + é(   z (ú)z  + Úwr   )r   F)Úensure_asciiú
zJSONL written: z rows)z[done] new=z skip=)r   r–   Úconnectr   rƒ   rŠ   ÚprintÚlenr   Ú_PAGESrG   r]   r}   r�   r+   r,   r-   r?   r„   r’   r“   r˜   ÚaddÚopenÚwriteÚjsonÚdumpsÚcommitÚclose)r‡   ÚexistingÚ	new_countÚ
skip_countÚ
jsonl_rowsr@   rB   rD   rE   rF   ÚdtitleÚddater[   r|   ry   ÚattsÚ	plain_lenÚokÚfr‰   s                       r#   ÚmainrÀ   Õ   sþ  € Ø€DÝÜ�‰œw°Ô3ˆØ�‰Ð0Ô1Ø�‰Ð.Ô/Ü% dÓ+ˆÜ�
œ3˜x›=˜/Ð)GÐHÐPTÕUà€IØ€JØ€Jä�aœ !™Ó$ó * ˆÜ˜4Ó ˆÜ�˜T˜F '¬#¨e«*¨Ð6¸dÕCÙÜÐ/°tÕ<ÚØ$)ó $	 Ñ ˆG�U˜DÝ '¨XÑ"5Ø˜a‘�
ØÜ".¨wÓ"7ÑˆF�E˜4Øˆ|Ü˜ u¨S¨b z l°#°g°YÐ?ÀtÕLØ˜a‘�
ØÙØ�ÙØ�Ü'3°D¸'Ó'BÑ$ˆG�Y Ü(¨°$Ó7ˆGÜœBŸF™F :¨r°7Ó;×AÑAÓCÓDˆIØ˜2Š~ &°Ñ"7ÁÜ˜ v¨c¨r { m°3°w°iÐ@ÈÕMØ˜a‘�
ØÝØ×!Ñ!Ø '°&ÀWØ$)¸	Ü!*¼*Ü#.ñ	#ô ô ˜
 6¨#¨2 ; -¨r°%°¸Ð:À$ÕGØ˜Q‘�	ÙÜ˜d G¨V°W¸eÀYÓOˆBÙØ˜Q‘�	Ø—‘˜WÔ%Ü˜˜V C R˜[˜M¨¨E¨7°!Ð4¸D×Aà˜a‘’
òI$	 ð* õX Ü”*˜c¨GÔ4ð 	D¸Ø!ò D�Ø—‘œŸ
™
 3°UÔ;¸dÑBÕCñD÷	Dô 	�¤
˜|¨2¬c°*«oÐ->¸fÐEÈTÕRàÐØ�‰ŒØ�
‰
ŒÜ	ˆK˜	�{ &¨¨Ð
5¸TÖB÷	Dð 	Dús   È/1K Ë K	Ú__main__)r3   rŸ   )1Ú__doc__ÚsysÚosr+   r   Úhtmlr(   Úurllib.parser;   r–   r²   r   Úbs4r   r   r>   r5   r„   r’   r“   Úenvironr   r   r   ÚENCr   r   r   Ú
_MAX_PAGESÚ	enumerateÚargvr!   rh   r:   ÚintÚsplitÚ
ValueErrorr­   r®   r$   r/   rG   r]   r}   r�   rŠ   r˜   rÀ   Ú__name__© r0   r#   ú<module>rÒ      sš  ðñó Û 	Û 	Û Û Û Û Û ã ß &ð '€ØÐ8Ñ8€Ø0€	Ø€
Ø-€Ø
�*‰*�.‰.˜Ð$5Ó
6€Ø�Z‰Z�^‰^˜L¨"Ó-€
Ø€ð @ØOØ'Øñ	€ð Ð Ø€	à€
Ù�c—h‘hÓò 
�D€A€qØ‡|�|�JÔð	Ù˜QŸW™W S¨!›_¨QÑ/Ó0‰Jð 
ˆi‹˜A ™E¡C¨¯©£MÓ1ð	Ù˜SŸX™X a¨!¡e™_Ó-‰Jð
ð " Q’‰¨A€óò$òò( ò8+ò8òòòDBCðJ ˆzÒÙ…Fð øðS ò 	Ùð	ûð
 ò 	Ùð	ús$   Â-D6Ã)EÄ6D>Ä=D>ÅE	ÅE	