Ë
    ¸¬uj  ã                   óð   — 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
m
Z
  ej                  «       Zde_        ej                  e_        dZdZddiZd	Zd
Zd„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)uˆ   Crawler for xrd.yingkou.gov.cn - è�¥å�£ä»™äººå²›ç»�æµŽå¼€å�‘åŒº é€šçŸ¥å…¬å‘Š
   Fixed: preserve <p> tags for proper paragraph rendering
é    N)ÚdatetimeFzxrd.yingkou.gov.cnÚyingkou_xrdz
User-AgentzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36z/root/search.dbé   c                 óò   — t         j                  j                  dt        z   | z   t        ¬«      }t         j                  j                  |t        d¬«      }|j                  «       j                  dd¬«      }|S )Núhttps://)Úheadersé   )ÚcontextÚtimeoutzutf-8Úreplace)Úerrors)	ÚurllibÚrequestÚRequestÚBASE_DOMAINÚHEADERSÚurlopenÚssl_ctxÚreadÚdecode)ÚurlÚreqÚrespÚhtmls       ú"/root/gov_crawler/crawl_yingkou.pyÚfetchr      s`   € Ü
�.‰.×
 Ñ
  ¬kÑ!9¸CÑ!?ÌÐ
 Ó
Q€CÜ�>‰>×!Ñ! #¬wÀÐ!ÓC€DØ�9‰9‹;×Ñ˜g¨iÐÓ8€DØ€Kó    c                 ó"  — | }t        j                  dd|«      }t        j                  dd|«      }t        j                  dd|t         j                  ¬«      }t        j                  dd|«      }t        j                  dd	|«      }t        j                  d
d|«      }t        j                  dd|«      }t        j                  dd|«      }t        j                  dd|«      }t        j                  dd|«      }t        j                  dd|«      }t        j                  dd|«      }t        j                  dd|«      }d„ }t        j                  d||t         j                  ¬«      }t        j                  dd|«      }|j	                  «       }|S )zšConvert the ewb-article-content HTML to clean HTML with <p> tags preserved.
    Strip inline formatting but keep structural tags (p, table, img, br).
    z!<div class="ewebeditor_doc"[^>]*>Ú z
</div>\s*$z@</?(?:span|font|strong|b|em|i|u|a|s|style|link|meta|o:p)\b[^>]*>)Úflagsz<h[1-6][^>]*>ú<p>z	</h[1-6]>ú</p>z	<br\s*/?>z<br>z\s+style="[^"]*"z\s+style='[^']*'z
<p\s[^>]*>z&nbsp;ú z&ensp;z&emsp;z<p>\s*(?:<br>\s*)*</p>c                 ó~   — | j                  d«      }t        j                  dd|«      }d|j                  «       z   dz   S )Né   ú\s+r#   r!   r"   )ÚgroupÚreÚsubÚstrip)ÚmÚinners     r   Ú
collapse_pz!clean_content.<locals>.collapse_pA   s7   € Ø—‘˜“
ˆÜ—‘�v˜s EÓ*ˆØ�u—{‘{“}Ñ$ vÑ-Ð-r   z<p>(.*?)</p>z>\s+<z>
<)r(   r)   ÚIÚDOTALLr*   )Úraw_htmlÚcontentr-   s      r   Úclean_contentr2      sW  € ð €Gô �f‰fÐ9¸2¸wÓG€GÜ�f‰f�] B¨Ó0€Gô �f‰fÐXÐZ\Ð^eÔmo×mqÑmqÔr€Gô �f‰fÐ% u¨gÓ6€GÜ�f‰f�\ 6¨7Ó3€Gô �f‰f�\ 6¨7Ó3€Gô �f‰fÐ(¨"¨gÓ6€GÜ�f‰fÐ(¨"¨gÓ6€Gô �f‰f�] E¨7Ó3€Gô �f‰f�Y  WÓ-€GÜ�f‰f�Y  WÓ-€GÜ�f‰f�Y  WÓ-€Gô �f‰fÐ.°°GÓ<€Gò.ô �f‰f�_ j°'ÄÇÁÔK€Gô �f‰f�X˜v wÓ/€GØ�m‰m‹o€Gà€Nr   c                 óè  — t        | «      }t        j                  d|«      }|r|j                  d«      j	                  «       nd}|skt        j                  d|t        j
                  «      }|rD|j                  d«      j	                  «       }t        j                  dd|«      j	                  «       }t        j                  d|«      }|r|j                  d«      nd}|s+t        j                  d|«      }|r|j                  d«      nd}t        j                  d|t        j
                  «      }|r|j                  d«      nd}	|	s:t        j                  d	|t        j
                  «      }
|
r|
j                  d«      nd}	g }t        j                  d
|t        j
                  «      }|st        j                  d|«      }d}|	r¬t        |	«      }|rŸd}t        j                  d||j                  d«      d t        j
                  «      D ][  }|j                  d«      }|j                  d«      j	                  «       }|j                  d«      rdt        z   |z   }|d|› d|› d�z  }Œ] |d|z   z  }|||fS )z%Fetch and extract detail page contentz+<meta name="ArticleTitle" content="([^"]*)"r%   r   z<title>(.*?)</title>u@   \s*[-â€“â€”]\s*è�¥å�£ä»™äººå²›ç»�æµŽå¼€å�‘åŒºç®¡ç�†å§”å‘˜ä¼š\s*$z1<meta name="PubDate" content="(\d{4}-\d{2}-\d{2})z(\d{4}-\d{2}-\d{2})z,class="ewb-article-content"[^>]*>(.*?)</div>z!id="ivs_content"[^>]*>(.*?)</div>z3<ul class="ewb-attach">.*?(<a[^>]+>.*?</a>).*?</ul>uC   <li class="ewb-attach-tip">é™„ä»¶ï¼š</li>\s*<li><a[^>]+>([^<]+)</a>u#   
<p><strong>é™„ä»¶ï¼š</strong></p>
z(<a\s[^>]*href="([^"]*)"[^>]*>([^<]+)</a>z
ewb-attachNé   ú/r   z<p><a href="z">z	</a></p>
ú
)r   r(   Úsearchr'   r*   r/   r)   Úfindallr2   ÚfinditerÚfindÚ
startswithr   )Ú
detail_urlr   ÚtÚtitleÚt2ÚdÚpub_dateÚd2ÚcÚcontent_htmlÚc2Úattach_linksÚ	a_matchesÚcontent_textÚattach_htmlÚa_matchÚ
attach_urlÚattach_names                     r   Úextract_detailrM   N   s.  € ä�Ó€Dô 	�	‰	Ð@À$ÓG€AÙ"#ˆA�G‰G�A‹J×ÑÔ¨€EÙÜ�Y‰YÐ.°´b·i±iÓ@ˆÙØ—H‘H˜Q“K×%Ñ%Ó'ˆEÜ—F‘FÐ^Ð`bÐdiÓj×pÑpÓrˆEô 	�	‰	ÐFÈÓM€AÙˆq�w‰w�qŒz B€HÙÜ�Y‰YÐ-¨tÓ4ˆÙ"$�2—8‘8˜A”;¨"ˆô 	�	‰	ÐAÀ4ÌÏÉÓS€AÙ!"�1—7‘7˜1”:¨€LÙÜ�Y‰YÐ;¸TÄ2Ç9Á9ÓMˆÙ&(�r—x‘x ”{¨bˆð €LÜ—
‘
ÐQÐSWÔY[×YbÑYbÓc€IÙÜ—J‘JÐeÐgkÓlˆ	à€LÙÜ$ \Ó2ˆáØAˆKÜŸ;™;Ð'RÐTXÐY]×YbÑYbÐcoÓYpÐYqÐTrÔtv×t}Ñt}Ó~ò T�Ø$Ÿ]™]¨1Ó-�
Ø%Ÿm™m¨AÓ.×4Ñ4Ó6�Ø×(Ñ(¨Ô-Ø!+¬kÑ!9¸JÑ!F�JØ ¨j¨\¸¸K¸=È
ÐSÑS‘ðTð ˜D ;Ñ.Ñ.ˆLà�(˜LÐ(Ð(r   c                  óV  — t        j                  t        «      } | j                  «       }d}d}t	        dt
        dz   «      D �].  }|dk(  rd}nd|z  }t        dt        j                  «       j                  d«      |fz  «       	 t        |«      }t        j                  d	|«      }t        j                  d
|«      }	t        dt!        |«      z  «       |st        d«        �n‘t#        |«      D �]  \  }
}dt$        z   |z   }|
t!        |	«      k  r|	|
   nd}|j'                  d|f«       |j)                  «       r|dz  }ŒQ	 t+        |«      \  }}}|s|}|rt!        |«      dk  rt        d|dd  z  «       |dz  }ŒŒ|s8|
t!        |«      k  r(t        j,                  dd||
   «      j/                  «       nd}t        j,                  dd|«      }t        j,                  dd|«      j/                  «       d d }|j'                  d||||||t0        df«       |j2                  dkD  r)|dz  }|dk  s|dz  dk(  rt        d|dd  ›d|d d ›�«       | j5                  «        t        j                  d«       �Œ‚ �Œ1 | j9                  «        t        d«       t        d ||fz  «       y # t        $ r0}t        d||fz  «       t        j                  d«       Y d }~�Œ’d }~ww xY w# t        $ rD}t        d|dd  ›d|›�«       | j7                  «        t        j                  d«       Y d }~�Œ6d }~ww xY w)!Nr   r%   z/001/001005/about.htmlz/001/001005/%d.htmlz[%s] Fetching page %d...z%H:%M:%Sz  ERROR fetching page %d: %sr4   z/href="(/001/001005/\d+/[a-f0-9-]+\.html)"[^>]*>z.class="ewb-list-date"[^>]*>(\d{4}-\d{2}-\d{2})z  Found %d itemsz  No more items, stoppingr   r   z)SELECT id FROM gov_raw WHERE page_url = ?é2   z  SKIP %s: empty contentiâÿÿÿz<[^>]+>r#   r&   i,  z�INSERT OR IGNORE INTO gov_raw (page_url, source_url, title, publish_date, content, summary, site_name, category) VALUES (?, ?, ?, ?, ?, ?, ?, ?)u   çŽ¯è¯„å…¬ç¤ºé   é
   z  + z: g333333Ó?z  ERROR detail z
=== Done ===zNew: %d, Skipped: %d)Úsqlite3ÚconnectÚDB_PATHÚcursorÚrangeÚ	MAX_PAGESÚprintr   ÚnowÚstrftimer   Ú	ExceptionÚtimeÚsleepr(   r8   ÚlenÚ	enumerater   ÚexecuteÚfetchonerM   r)   r*   Ú	SITE_NAMEÚrowcountÚcommitÚrollbackÚclose)ÚconnrC   Ú	total_newÚ
total_skipÚpageÚlist_urlr   ÚeÚitemsÚdatesÚidxÚhrefÚpage_urlÚdate_strÚdetail_titlerA   rH   Úsummarys                     r   Úmainru   €   sþ  € Ü�?‰?œ7Ó#€DØ�‰‹€AØ€IØ€Jä�aœ Q™Ó'ó ?ˆØ�1Š9Ø/‰Hà,¨tÑ3ˆHäÐ(¬H¯L©L«N×,CÑ,CÀJÓ,OÐQUÐ+VÑVÔWð	Ü˜“?ˆDô —
‘
ÐMÈtÓTˆÜ—
‘
ÐLÈdÓSˆÜÐ ¤3 u£:Ñ-Ô.ÙÜÐ-Ô.Úä" 5Ó)ó (	‰IˆC�Ø!¤KÑ/°$Ñ6ˆHØ%(¬3¨u«:Ò%5�u˜S’z¸2ˆHð �I‰IÐAÀHÀ;ÔOØ�z‰zŒ|Ø˜a‘�
ØðÜ7EÀdÓ7KÑ4�˜h¨ÙØ'�HÙ#¤s¨<Ó'8¸2Ò'=ÜÐ4°t¸C¸D°zÑAÔBØ !‘O�JØñ $ØQTÔWZÐ[`ÓWaÒQa¤2§6¡6¨*°b¸%À¹*Ó#E×#KÑ#KÔ#MÐgi�LäŸ&™& ¨S°,Ó?�ÜŸ&™& ¨¨gÓ6×<Ñ<Ó>¸tÀÐD�à—	‘	ð gØ˜x¨°xÀÈwÔXaÐcqÐrôð —:‘: ’>Ø ‘N�IØ  A’~¨°R©¸1Ò)<Ý¨d°3°4ªj¸,ÀsÈÑ:KÐLÔMØ—‘”Ü—
‘
˜3–òG(	ð/?ðB 	‡J�J„LÜ	Ð
ÔÜ	Ð
  I¨zÐ#:Ñ
:Õ;øôs ò 	ÜÐ0°D¸!°9Ñ<Ô=Ü�J‰J�qŒMÝûð	ûôb ò Ý°°c°d²¹QÐ?Ô@Ø—‘”Ü—
‘
˜1”Ýûð	ús7   ÂJÄ?9KÅ9C4KÊ	KÊ(%KËKË	L(Ë$9L#Ì#L(Ú__main__)Ú__doc__Úurllib.requestr   Úurllib.errorÚsslr(   rR   ÚosÚsysr\   r   Úcreate_default_contextr   Úcheck_hostnameÚ	CERT_NONEÚverify_moder   rb   r   rT   rW   r   r2   rM   ru   Ú__name__© r   r   ú<module>rƒ      s’   ðñ÷ E× D× D× DÝ à
$ˆ#×
$Ñ
$Ó
&€Ø€Ô Ø—m‘m€Ô à"€Ø€	àð  Dð€ð €Ø€	òò.òb/)òdI<ðX ˆzÒÙ…Fð r   