Ë
    Í«£jé$  ã                   ót  — 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Z
dZdZdZdZd	Zd
ez  ZdZdZddddœZdZdd„Zd„ Zd„ Zd„ Zdefd„Zedk(  radej6                  v ZeZ eej6                  «      D ]1  \  ZZ e jC                  d«      sŒ e"e jG                  d«      d   «      ZŒ3  eee¬«       yy)u;   èŠœæ¹–å¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€ - å…¬ç¤ºå…¬å‘Š/å¾�é›† (Lonsun CMS)é    N)ÚBeautifulSoup)Úurljoinz/root/search.dbu%   èŠœæ¹–å¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€-å…¬ç¤ºå¾�é›†u   å®‰å¾½zhttps://sthjj.wuhu.gov.cni‹•g z+https://sthjj.wuhu.gov.cn/content/column/%dé   é   zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) 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-Languagez·INSERT OR IGNORE INTO gov_raw
    (site_name, source_url, page_url, title, publish_date, summary, content, category, attachments, group_name)
    VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)c                 óÊ  — ddl }t        t        | «      d«      }|j                  d«      D ]L  }|j	                  dd«      }|sŒ|j                  d«      rŒ*|r|j                  j                  ||«      n||d<   ŒN |j                  d«      D ]L  }|j	                  d	d«      }|sŒ|j                  d
«      rŒ*|r|j                  j                  ||«      n||d	<   ŒN t        |«      S )uA   ä¿�ç•™ HTML è¡¨æ ¼ç»“æž„ï¼Œä»…å°†ç›¸å¯¹é“¾æŽ¥/å›¾ç‰‡è½¬ç»�å¯¹ URLr   Núhtml.parserÚaÚhrefÚ )ÚhttpÚ
javascriptú#ÚimgÚsrc)r   z//zdata:)Úurllib.parser   ÚstrÚfind_allÚgetÚ
startswithÚparser   )ÚtableÚbase_urlÚurllibÚtblr
   r   r   r   s           úcrawl_wuhu_hb.pyÚhtml_table_to_htmlr      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€Oó    c                  ó|   — dd l } | j                  t        «      }|j                  d«       |j                  d«       |S )Nr   zPRAGMA journal_mode=WALzPRAGMA busy_timeout=5000)Úsqlite3ÚconnectÚDB_PATHÚexecute)r    Úconns     r   Úinit_dbr%   *   s2   € ÛØ�?‰?œ7Ó#€DØ‡L�LÐ*Ô+Ø‡L�LÐ+Ô,Ø€Kr   c                 óJ  — t        | d«      }g }|j                  dt        j                  d«      ¬«      }|s|S |j	                  dd¬«      D ]Ô  }|j                  d«      }|sŒ|j                  d	«      xs |j                  d
¬«      xs dj                  «       }|sŒQ|j                  dd«      j                  «       }|sŒt|j                  d«      r|nt        t        |«      }|j                  dd¬«      }	|	r|	j                  d
¬«      nd}
|j                  |||
dœ«       ŒÖ |S )z/Extract (title, url, date) from list page HTML.r	   ÚulÚdoc_list©Úclass_ÚliF©Ú	recursiver
   ÚtitleT©Ústripr   r   r   ÚspanÚdate)r.   Úurlr2   )r   ÚfindÚreÚcompiler   r   Úget_textr0   r   r   ÚBASE_URLÚappend)Ú	html_textÚsoupÚitemsr'   r+   r
   r.   r   Úfull_urlr1   r2   s              r   Úextract_list_itemsr>   2   s  € ä˜ MÓ2€DØ€EØ	�‰�4¤§
¡
¨;Ó 7ˆÓ	8€BÙØˆØ�k‰k˜$¨%ˆkÓ0ò FˆØ�G‰G�C‹LˆÙØØ—‘�w“Ò? 1§:¡:°D :Ó#9Ò?¸R×FÑFÓHˆÙØØ�u‰u�V˜RÓ ×&Ñ&Ó(ˆÙØØŸ?™?¨6Ô2‘4¼ÄÈ$Ó8OˆØ�w‰w�v fˆwÓ-ˆÙ,0ˆt�}‰} 4ˆ}Ô(°bˆØ�‰˜u¨X¸tÑDÕEðFð €Lr   c           	      ó"	  — 	 t        j                  | t        d¬«      }d|_        |j                  dk7  ry	 t        |j                  d	«      }d
}|j                  dddi¬«      }|r$|j                  d«      r|d   j                  «       }|s%|j                  d«      }|r|j                  d¬«      }d
}|j                  dddi¬«      }|r'|j                  d«      r|d   j                  «       dd }g }	g }
|j                  dd¬«      }|�rî|j                  ddg«      D ]  }|j                  «        Œ |j                  d«      }d}|j                  d«      D ]*  }|j                  dd¬«      }|sŒt!        |«      dkD  sŒ(d} n |r»|s¹d|xs | j#                  d «      d!   ›d"| ›d#�g}|D ]x  }|j                  d$d
«      }|sŒ|j%                  d%«      r|nt'        | |«      }|j                  d&d
«      xs |j                  d'd
«      xs d
}|j)                  d(|›d"|›d#�«       Œz d)j+                  |«      }|dd }|||d*fS |j                  dd+gd¬,«      D ]ö  }|j,                  d+k(  r!t/        || «      }|sŒ!|	j)                  |«       Œ3|j,                  dk(  sŒC|j                  dd¬«      }|sŒY|j                  d«      }|rz|j                  «       sj|D ]d  }|j                  d$d
«      }|sŒ|j%                  d%«      r|nt'        | |«      }|j                  d&d
«      xs d
}|	j)                  d(|›d"|›d#�«       Œf Œæ|	j)                  |«       Œø |j                  d-d¬.«      D ]”  }|d/   j                  «       }t1        j2                  d0|t0        j4                  «      sŒ<|j%                  d%«      r|nt'        | |«      }|
j)                  |j                  d¬«      xs |j#                  d «      d!   |d1œ«       Œ– |	s.|	j)                  d|xs | j#                  d «      d!   ›d"| ›d#�«       d)j+                  |	«      }|r|dd n|}|||t7        j8                  |
d¬2«      fS # t
        $ r(}t        d|› �t        j                  ¬«       Y d}~yd}~ww xY w)3z=Extract title, date, content, attachments from a detail page.é   ©ÚheadersÚtimeoutúutf-8éÈ   )NNNNz  [ERROR] fetch detail failed: ©ÚfileNr	   r   ÚmetaÚnameÚArticleTitle)ÚattrsÚcontentÚh1Tr/   ÚPubDateé
   ÚdivÚnewscontnetr)   ÚscriptÚstyler   FÚpú r   ú[ú/éÿÿÿÿú](ú)r   r   Úaltr.   z![z

z[]r   r,   r
   )r   r   z"\.(pdf|doc|docx|xls|xlsx|zip|rar)$)rI   r3   )Úensure_ascii)Úrequestsr   ÚHEADERSÚencodingÚstatus_codeÚ	ExceptionÚprintÚsysÚstderrr   Útextr4   r0   r7   r   Ú	decomposeÚlenÚsplitr   r   r9   ÚjoinrI   r   r5   ÚsearchÚIÚjsonÚdumps)r3   ÚrÚer;   r.   Ú
meta_titlerM   Úpub_dateÚ	meta_dateÚcontent_partsÚattachmentsÚcontent_divÚnoiseÚimgsÚhas_textrT   ÚtxtÚ	img_linesr   r   Úfull_srcr[   Úcontent_textÚsummaryÚchildÚtbl_htmlÚp_imgsr
   r   Ú	full_hrefs                                 r   Úextract_detailr‚   J   s€  € ð&Ü�L‰L˜¤g°rÔ:ˆØˆŒ
Ø�=‰=˜CÒØ)ð  ô ˜Ÿ™ Ó/€Dð €EØ—‘˜6¨&°.Ð)A�ÓB€JÙ�j—n‘n YÔ/Ø˜9Ñ%×+Ñ+Ó-ˆÙØ�Y‰Y�t‹_ˆÙØ—K‘K d�KÓ+ˆEð €HØ—	‘	˜&¨°Ð(;�	Ó<€IÙ�Y—]‘] 9Ô-Ø˜YÑ'×-Ñ-Ó/°°Ð4ˆð €MØ€KØ—)‘)˜E¨-�)Ó8€KÚØ ×)Ñ)¨8°WÐ*=Ó>ò 	ˆEØ�O‰OÕð	ð ×#Ñ# EÓ*ˆØˆØ×%Ñ% cÓ*ò 	ˆAØ—*‘*˜S¨�*Ó-ˆCÚ”s˜3“x !“|Ø�Ùð		ñ šà',Ò'B°·	±	¸#³¸rÑ0BÑ'BÂCÐHÐIˆIØò D�Ø—g‘g˜e RÓ(�ÚØ&)§n¡n°VÔ&<™sÄ'È#ÈsÓBS�HØŸ'™' %¨Ó,ÒJ°·±¸ÀÓ0DÒJÈ�CØ×$Ò$²CºÐ%BÕCðDð "Ÿ;™; yÓ1ˆLØ" 4 CÐ(ˆGØ˜( L°$Ð6Ð6ð %×-Ñ-¨s°G¨nÈÐ-ÓMò 6�Ø—:‘: Ò(Ü1°%¸Ó=�HÚØ%×,Ñ,¨XÕ6Ø—Z‘Z 3Ó&ØŸ.™.¨°D˜.Ó9�CÚà!&§¡°Ó!6˜Ù!¨#¯)©)¬+Ø'-ò X Ø&)§g¡g¨e°RÓ&8 Ú#&Ø69·n±nÀVÔ6L©sÔRYÐZ]Ð_bÓRc HØ*-¯'©'°%¸Ó*<Ò*BÀ CØ$1×$8Ò$8ÊÊXÐ9VÕ$WñXð *×0Ñ0°Õ5ð%6ð* !×)Ñ)¨#°DÐ)Ó9ò �Ø˜‘y—‘Ó(�Ü—9‘9ÐBÀDÌ"Ï$É$ÕOØ(,¯©¸Ô(?¡ÄWÈSÐRVÓEW�IØ×&Ñ&Ø !§
¡
° 
Ó 6Ò M¸$¿*¹*ÀS»/È"Ñ:MØ(ñ(õ ð	ñ Ø×Ò¨5Ò+F°C·I±I¸c³NÀ2Ñ4FÑ+FÊÐLÔMà—;‘;˜}Ó-€LÙ$0ˆl˜4˜CÑ °e€Gà�(˜L¬$¯*©*°[ÈuÔ*UÐUÐUøôs ò &ÜÐ/°¨sÐ3¼#¿*¹*ÕEÜ%ûð&ús   ‚2Q Ñ	RÑ&R	Ò	RFc                 óª  — t        «       }|j                  «       }d}d}t        d|dz   «      D �]y  }|dk(  rd}nt        d|z  z   }t	        d|› d|› �t
        j                  ¬«       	 t        j                  |t        d¬	«      }d
|_
        |j                  dk7  r1t	        d|› d|j                  › �t
        j                  ¬«       |dz  }Œ�	 t        |j                  «      }
t	        dt        |
«      › d�t
        j                  ¬«       |
st	        dt
        j                  ¬«        �n‚|
D �]d  }|j!                  d|d   f«       |j#                  «       r%t	        d|d   d d › �t
        j                  ¬«       ŒOt%        |d   «      \  }}}}|€'t	        d|d   › �t
        j                  ¬«       |dz  }Œ‹|xs |d   }|xs |d   }|r|d d n|}| r*t	        d|› d|d d › �t
        j                  ¬«       |dz  }ŒÒ	 |j!                  t&        t(        |d   |d   |j+                  «       ||j+                  «       |xs d|›d|d   ›d�t,        |t.        f
«       |j1                  «        |dz  }t	        d|d d › �t
        j                  ¬«       �Œg t3        j4                  d«       �Œ| |j7                  «        t	        d |› d!|› �t
        j                  ¬«       |S # t        $ r1}	t	        d|› d|	› �t
        j                  ¬«       |dz  }Y d }	~	�Œåd }	~	ww xY w# t        $ r.}	t	        d|	› �t
        j                  ¬«       |dz  }Y d }	~	�Œ"d }	~	ww xY w)"Nr   é   z.https://sthjj.wuhu.gov.cn/hbzx/gszq/index.htmlz?pageIndex=%dz[Page z] rF   r@   rA   rD   rE   z  [ERROR] list page z HTTP z: z  Found z itemsz!  [WARN] No items found, stoppingz)SELECT id FROM gov_raw WHERE page_url = ?r3   z  SKIP (exists): r.   é(   z  [ERROR] detail unreachable: r2   z  [é2   rV   rY   rZ   z  OK: z  DB error: z
[DONE] Total: z
, Errors: )r%   ÚcursorÚrangeÚ
COLUMN_URLrb   rc   rd   r]   r   r^   r_   r`   ra   r>   re   rg   r#   Úfetchoner‚   Ú
INSERT_SQLÚ	SITE_NAMEr0   ÚCATEGORYÚGROUPÚcommitÚtimeÚsleepÚclose)Ú	test_modeÚ	max_pagesr$   ÚcurÚtotalÚerrorsÚpnÚlist_urlrn   ro   r<   Úitemr.   rq   rL   rt   Úfinal_titleÚ
final_dateÚfinal_summarys                      r   Úcrawlrž   ­   s-  € Ü‹9€DØ
�+‰+‹-€CØ€EØ€Fä�A�y 1‘}Ó%ó >ˆØ�Š7ØG‰Hä! O°bÑ$8Ñ8ˆHä��r�d˜"˜X˜JÐ'¬c¯j©jÕ9ð
	Ü—‘˜X¬wÀÔCˆAØ ˆAŒJØ�}‰} Ò#ÜÐ,¨R¨D°°q·}±}°oÐFÌSÏZÉZÕXØ˜!‘�Øð $ô # 1§6¡6Ó*ˆÜ�œ˜U›˜ FÐ+´#·*±*Õ=áÜÐ5¼S¿Z¹ZÕHÚàó !	ˆDØ�K‰KÐCÀdÈ5ÁkÀ^ÔTØ�|‰|Œ~ÜÐ)¨$¨w©-¸¸Ð*<Ð)=Ð>ÄSÇZÁZÕPØä4BÀ4ÈÁ;Ó4OÑ1ˆE�8˜W kØˆ}ÜÐ6°t¸E±{°mÐDÌ3Ï:É:ÕVØ˜!‘�ØàÒ0 4¨¡=ˆKØ!Ò1 T¨&¡\ˆJÙ-4˜G D S™M¸+ˆMáÜ˜˜J˜< r¨+°c°rÐ*:Ð);Ð<Ä3Ç:Á:ÕNØ˜‘
�ØðØ—‘œJÜ˜t E™{¨D°©KØ×%Ñ%Ó'¨Ø!×'Ñ'Ó)¨7Ó+_Â[ÐRVÐW\ÓR]Ð7^Ü˜k¬5ð	)ô ð —‘”Ø˜‘
�Ü˜˜{¨3¨BÐ/Ð0Ð1¼¿
¹
×Cð=!	ôF 	�
‰
�1Žð}>ð@ 	‡J�J„LÜ	Ð˜U˜G :¨f¨XÐ
6¼S¿Z¹ZÕHØ€Løôg ò 	ÜÐ(¨¨¨B¨q¨cÐ2¼¿¹ÕDØ�a‰KˆFÝûð	ûôV ò Ü˜ Q CÐ(¬s¯z©zÕ:Ø˜!‘–ûðús2   Á(A"KÇ>BLË	LË'&LÌLÌ	MÌ$#MÍMÚ__main__z--testz--max-pages=ú=r„   )r“   r”   )r   )$Ú__doc__rl   r5   rc   r�   r]   Úbs4r   r   r   r"   rŒ   r�   rŽ   r8   Ú	COLUMN_IDr‰   Ú	MAX_PAGESÚPER_PAGEr^   r‹   r   r%   r>   r‚   rž   Ú__name__Úargvr“   ÚmpÚ	enumerateÚir
   r   Úintrh   © r   r   ú<module>r­      s÷   ðñ Bß $× $Ó $Ý Ý  à
€Ø3€	Ø€Ø€Ø&€Ø€	Ø:¸YÑF€
Ø€	Ø€ð DØOØ'ñ€ð-€
ó
òòò0`VðF  Yó HðV ˆzÒØ˜CŸH™HÐ$€IØ	€BÙ˜#Ÿ(™(Ó#ò &‰ˆˆ1Ø�<‰<˜Õ'Ù�Q—W‘W˜S“\ !‘_Ó%‰Bð&ñ 
�I¨Ö,ð r   