Ë
    9JŠ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mZ ddl	m
Z
 ddlmZ ej                  j                  dd«      ZdZd	Zd
ZddddœZd„ Zd„ Zd„ Zedk(  r e«        yy)u¶   çˆ¬è™«ï¼šè¡¢å·žå¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€å…¬ç¤ºå…¬å‘Šï¼ˆPlaywrightæ¸²æŸ“ï¼‰
www.qz.gov.cn/col/col1229039395/index.html?number=A09
æ³¨ï¼šåˆ—è¡¨JSæ¸²æŸ“ï¼Œéœ€Playwrightï¼›è¯¦æƒ…é¡µç”¨requests
é    N)ÚBeautifulSoup)Úurljoin)Úasync_playwrightÚDB_PATHz/root/search.dbz=https://www.qz.gov.cn/col/col1229039395/index.html?number=A09u$   è¡¢å·žå¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€å…¬ç¤ºå…¬å‘ŠéP   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,en;q=0.8)z
User-AgentÚAcceptzAccept-Languagec               ƒ   óR  K  — t        «       4 ƒd{  –—† } | j                  j                  ddg¬«      ƒ d{  –—† }|j                  «       ƒ d{  –—† }|j	                  t
        dd¬«      ƒ d{  –—†  |j                  d«      ƒ d{  –—†  	 |j                  d	«      ƒ d{  –—†  |j                  d
«      ƒ d{  –—†  i }t        dt        dz   «      D ]»  }|j                  d«      ƒ d{  –—† }|D ]  }|d   sŒ	|d   |vsŒ|||d   <   Œ t        d|› dt        |«      › dt        |«      › d�«       	 |j                  d«      ƒ d{  –—† }|r3|j                  d«      ƒ d{  –—†  |j                  d«      ƒ d{  –—†  nt        d«        nŒ½ |j                  «       ƒ d{  –—†  t        |j                  «       «      cddd«      ƒd{  –—†  S 7 �ŒÄ7 �Œ¡7 �ŒŒ7 �Œo7 �ŒY7 �ŒB7 �Œ,#  Y �Œ/xY w7 �Œ7 Œª7 Œ‘7 Œz#  t        d«       Y  ŒxxY w7 Œg7 Œ@# 1 ƒd{  –—†7  sw Y   yxY w­w)uD   ç”¨Playwrightæ¸²æŸ“é¡µé�¢ï¼Œç‚¹å‡»æ›´å¤š/ç¿»é¡µèŽ·å�–æ‰€æœ‰åˆ—è¡¨é¡¹NTz--no-sandbox)ÚheadlessÚargsÚcommiti`ê  )Ú
wait_untilÚtimeouti@  z,document.querySelector("span.more")?.click()i¸  é   ac  
                () => {
                    const lis = document.querySelectorAll('ul.ajax-ul li.cf');
                    return Array.from(lis).map(li => {
                        const a = li.querySelector('a');
                        const span = li.querySelector('span.fr');
                        return {
                            title: a ? (a.getAttribute('title') || a.textContent.trim()) : '',
                            date: span ? span.textContent.trim() : '',
                            url: a ? a.href : ''
                        };
                    });
                }
            Úurlu     ç¿»é¡µz: u   æ�¡æ˜¾ç¤º, ç´¯è®¡u	   å”¯ä¸€URLz¯() => {
                    const n = document.querySelector('.layui-laypage-next');
                    return n && !n.classList.contains('layui-disabled');
                }z6document.querySelector(".layui-laypage-next")?.click()iÜ  u     æ— ä¸‹ä¸€é¡µï¼Œç»ˆæ­¢u     ç¿»é¡µå¤±è´¥ï¼Œç»ˆæ­¢)r   ÚchromiumÚlaunchÚnew_pageÚgotoÚLIST_URLÚwait_for_timeoutÚevaluateÚrangeÚ
MAX_CLICKSÚprintÚlenÚcloseÚlistÚvalues)ÚpÚbrowserÚpageÚ	all_itemsÚpgÚitemsÚitemÚhas_nexts           ú"/root/gov_crawler/crawl_qz_sthj.pyÚfetch_all_linksr(      s(  è ø€ äÓ!÷ 5(ð 5( QØŸ
™
×)Ñ)°4¸~Ð>NÐ)ÓO×OˆØ×%Ñ%Ó'×'ˆØ�i‰iœ¨X¸uˆiÓE×EÐEØ×#Ñ# DÓ)×)Ð)ð	Ø—-‘-Ð NÓO×OÐOØ×'Ñ'¨Ó-×-Ð-ð ˆ	ä˜œ:¨™>Ó*ò #	ˆBØŸ-™-ð )ó ÷ ˆEð ò 2�Ø˜“; 4¨¡;°iÒ#?Ø-1�I˜d 5™kÒ*ð2ô �H˜R˜D ¤3 u£: ,Ð.?ÄÀIÃÐ?OÈyÐYÔZðØ!%§¡ð 0ó "÷ �ñ ØŸ-™-Ð(`Óa×aÐaØ×/Ñ/°Ó5×5Ñ5äÐ3Ô4Ùð 6ð;#	ðJ �m‰m‹o×ÐÜ�I×$Ñ$Ó&Ó'÷k5(÷ 5(ò 5(ùØOùØ'ùØEùØ)ùð PùØ-úð	Úúð
ùð,øð
 bøØ5ùðÜÐ/Ô0Úúàøði5(ø÷ 5(÷ 5(ñ 5(üs8  ‚H'‘G’H'•"H·G¸HÁGÁHÁ/GÁ0HÂG!Â	HÂG*Â"G$Â#G*Â;G'Â<G*Ã ,HÃ,G2Ã-HÃ<HÄ1HÄ6G;Å
G5ÅG;Å%G7Å&G;Å>G9Å?G;ÆHÆ&HÆ'HÇH'ÇHÇH'ÇHÇHÇHÇ!HÇ$G*Ç'G*Ç*G/Ç,HÇ5G;Ç7G;Ç9G;Ç;HÈHÈH'ÈH$ÈHÈH$È H'c                 óê  — 	 t        j                  | t        dd¬«      }d|_        t        |j                  d«      }|j                  d«      }|r|j                  d¬«      nd	}d	}d	}|j                  d
«      }|rr|j                  d¬«      }t        j                  d|«      }	|	r|	j                  d«      }t        j                  d|«      }
|
r|
j                  d«      j                  «       }|j                  d«      }|s|||d	d	fS g }|j                  d«      D ]s  }|j                  dd	«      }t        j                  d|j                  «       «      sd|v sŒ>|j                  d¬«      }t        | |«      }|j!                  d|› d|› d�«       Œu g }t#        |j%                  d«      «      }|j                  ddg«      D ]Œ  }|j&                  dk(  r|j)                  d«      rŒ$|j&                  dk(  r|r|j!                  t+        |«      «       ŒP|j                  d¬«      }t        j,                  dd	|«      }|sŒ||j!                  |«       ŒŽ |s:t        j,                  dd	|j                  d¬«      «      }|r|j!                  |«       dj/                  |«      }|rdj/                  |«      nd	}|j                  «       sƒ|s�|j                  d«      }|rng }|D ]J  }|j                  dd	«      }|j                  dd	«      }|sŒ*t        | |«      }|j!                  d|› d�«       ŒL |rd| › d|› d�dj/                  |«      z   }|j                  «       s|rd| › d|› d|› �}|||||fS # t        $ r Y yw xY w) Né   T)Úheadersr   Úallow_redirectszutf-8)NNNNNzhtml.parserz.art_title h2)ÚstripÚ z.fz_xxu(   å�‘å¸ƒ[æ—¥æœŸï¼š:]\s*(\d{4}-\d{2}-\d{2})r   u$   ä¿¡æ�¯[æ�¥æº�æ�¥æº�ï¼š:]\s*([^\s<]+)z#zoomÚaÚhrefz"\.(pdf|doc|docx|xls|xlsx|zip|rar)$Údownloadz<p><a href="z">z</a></p>Útabler   z\n+z

ú
ÚimgÚsrcÚaltu   ">æŸ¥çœ‹å›¾ç‰‡</a></p>z
</a></p>

)ÚrequestsÚgetÚHEADERSÚencodingÚ	Exceptionr   ÚtextÚ
select_oneÚget_textÚreÚsearchÚgroupr-   Úfind_allÚlowerr   ÚappendÚboolÚfindÚnameÚfind_parentÚstrÚsubÚjoin)Ú
detail_urlÚrÚsoupÚh2ÚtitleÚpub_dateÚsource_textÚfzr<   ÚmÚm2ÚzoomÚattachmentsÚa_tagr0   Úfull_urlÚpartsÚ	has_tableÚtagÚcontentÚattachments_strÚimgsÚ	img_partsr4   r5   r6   Úfull_srcs                              r'   Úextract_detailrb   Q   sR  € ð,Ü�L‰L˜¬W¸bÐRVÔWˆØˆŒ
ô ˜Ÿ™ Ó/€DØ	�‰˜Ó	)€BÙ')ˆB�K‰K˜dˆKÔ#¨r€Eà€HØ€KØ	�‰˜Ó	"€BÙ	Ø�{‰{ ˆ{Ó&ˆÜ�I‰IÐAÀ4ÓHˆÙØ—w‘w˜q“zˆHÜ�Y‰YÐ>ÀÓEˆÙØŸ(™( 1›+×+Ñ+Ó-ˆKà�?‰?˜7Ó#€DÙØ�h ¨R°Ð3Ð3à€KØ—‘˜sÓ#ò JˆØ�y‰y˜ Ó$ˆÜ�9‰9Ð:¸D¿J¹J»LÔIÈZÐ[_ÒM_Ø—>‘>¨�>Ó-ˆDÜ˜z¨4Ó0ˆHØ×Ñ ¨h¨Z°r¸$¸¸xÐHÕIðJð €EÜ�T—Y‘Y˜wÓ'Ó(€IØ�}‰}˜c 7˜^Ó,ò 
ˆØ�8‰8�sŠ?˜sŸ™¨wÔ7ØØ�8‰8�wÒÙØ—‘œS ›XÔ&ØØ�|‰| $ˆ|Ó'ˆÜ�v‰v�f˜b $Ó'ˆÚØ�L‰L˜Õð
ñ Ü�v‰v�f˜b $§-¡-°d -Ó";Ó<ˆÙØ�L‰L˜Ôà�k‰k˜%Ó €GÙ0;�d—i‘i Ô,À€Oà�=‰=Œ?¡;Ø�}‰}˜UÓ#ˆÙØˆIØò V�Ø—g‘g˜e RÓ(�Ø—g‘g˜e RÓ(�ÚÜ& z°3Ó7�HØ×$Ñ$ |°H°:Ð=SÐ%TÕUðVñ Ø(¨¨°B°u°g¸\ÐJÈVÏ[É[ÐYbÓMcÑc�à�=‰=Œ?™{Ø   ¨B¨u¨g°\À/ÐARÐSˆà�(˜K¨°/ÐAÐAøôK ò ,Ù+ð,ús   ‚$M& Í&	M2Í1M2c                  óœ  — dd l } t        d«       	 t        j                  t	        «       «      }t        dt#        |«      › d�«       | j%                  t&        «      }|j)                  «       }d}t+        |«      D ]¾  \  }}|d   }|d   }|d   }t        d|dz   › dt#        |«      › d|d d › d �d!d"¬#«       t-        |«      \  }}}}}|s|}|s|}d}|r"	 dt/        |j1                  d$d%«      d&z   «      z
  }	 |j5                  d'|t6        ||||||f«       |dz  }t        d(«       t9        j:                  d*«       ŒÀ |j=                  «        |j?                  «        t        d+|› d,�«       y # t
        $ �r!}t        d|› �«       t        d«       dd l}d}dddd	d
ddœ}|j                  ||t        d¬«      }|j                  «       d   d   }g }t        j                  d|t        j                  «      D ]•  }|j                  d«      }	t        j                  d|	«      }
t        j                  d|	«      }|
sŒC|sŒF|j                  |
j                  d«      |j                  d«      j!                  «       |
j                  d«      dœ«       Œ— Y d }~�Œad }~ww xY w# t2        $ r d}Y �Œ²w xY w# t
        $ r}t        d)|› �«       Y d }~�Œ¤d }~ww xY w)-Nr   u(   [PLAYWRIGHT] åŠ è½½é¡µé�¢èŽ·å�–åˆ—è¡¨...u   [ERROR] Playwrightå¤±è´¥: u$   [FALLBACK] é™�çº§APIæ¨¡å¼�å�–å‰�5æ�¡zLhttps://www.qz.gov.cn/api-gateway/jpaas-publish-server/front/page/build/unitÚbulidstaticÚ3084Úi58lqHVn2cokOgipAEjQFÚcolumnu   ç»„é…�åˆ†ç±»listÚ
1229039395)Ú	parseTypeÚwebIdÚtplSetIdÚpageTypeÚtagIdÚpageIdé   )Úparamsr+   r   ÚdataÚhtmlz%<li class="cf border-line">(.*?)</li>r   z"href="([^"]+)"[^>]*title="([^"]*)"z<span class="fr">([^<]+)</span>é   )rP   Údater   u   å…±u   æ�¡åˆ—è¡¨é¡¹rP   rt   r   z  [ú/z] é(   z...ú T)ÚendÚflushú-r.   Ú0000zÑ
                INSERT OR REPLACE INTO gov_raw
                (page_url, site_name, title, publish_date, content, summary, attachments, date_rank)
                VALUES (?, ?, ?, ?, ?, ?, ?, ?)
            ÚOKz
DB ERROR: g333333Ó?u	   
æ€»è®¡: u   æ�¡) Úsqlite3r   ÚasyncioÚrunr(   r;   r7   r8   r9   Újsonr?   ÚfinditerÚDOTALLrA   r@   rD   r-   r   Úconnectr   ÚcursorÚ	enumeraterb   ÚintÚreplaceÚ
ValueErrorÚexecuteÚ	SITE_NAMEÚtimeÚsleepr   r   )r}   r"   ÚeÚreqÚapi_urlÚ
api_paramsrM   rr   rT   Úlir/   ÚspanÚconnÚcurÚtotalÚidxr%   rP   Ú	list_daterL   Ú
full_titlerQ   rR   r]   r^   Ú	date_ranks                             r'   Úcrawlrš   œ   sÏ  € Ûä	Ð
4Ô5ðjÜ—K‘K¤Ó 1Ó2ˆ	ô, 
ˆC”�I“Ð˜|Ð
,Ô-à�?‰?œ7Ó#€DØ
�+‰+‹-€CØ€Eä˜yÓ)ò ‰	ˆˆTØ�W‘ˆØ˜‘Lˆ	Ø˜%‘[ˆ
Ü��C˜‘E�7˜!œC 	›NÐ+¨2¨e°C°R¨j¨\¸Ð=À3ÈdÕSäFTÐU_ÓF`ÑCˆ
�H˜k¨7°OÙØˆJÙØ ˆHàˆ	ÙðØ¤ H×$4Ñ$4°S¸"Ó$=ÀÑ$FÓ GÑG�	ð		$Ø�K‰Kð ð œi¨°X¸wÈÐUdÐfoÐpô	rð
 �Q‰JˆEÜ�$ŒKô 	�
‰
�3�ð=ð@ 	‡K�K„MØ‡J�J„LÜ	ˆJ�u�g˜SÐ
!Õ"øô{ ó jÜÐ*¨1¨#Ð.Ô/äÐ4Ô5ÛØ`ˆà&°Ø/¸XØ'°<ñ
ˆ
ð
 �G‰G�G J¼ÈˆGÓLˆØ�v‰v‹x˜Ñ Ñ'ˆØˆ	Ü—‘ÐEÀtÌRÏYÉYÓWò 	jˆAØ—‘˜“ˆBÜ—	‘	Ð?ÀÓDˆAÜ—9‘9Ð?ÀÓDˆDÚ’TØ× Ñ ¨1¯7©7°1«:¸t¿z¹zÈ!»}×?RÑ?RÓ?TÐ]^×]dÑ]dÐefÓ]gÑ!hÕiö	jûðjûôV ò Ø“	ðûô ò 	$Ü�J˜q˜cÐ"×#Ò#ûð	$úsO   ‘E) Ã!JÃ4.J)Å)
JÅ3C JÈ4JÈ7AJÊJÊJ&Ê%J&Ê)	KÊ2KËKÚ__main__)Ú__doc__Úosr?   r‹   r€   r~   r7   Úbs4r   Úurllib.parser   Úplaywright.async_apir   Úenvironr8   r   r   rŠ   r   r9   r(   rb   rš   Ú__name__© ó    r'   ú<module>r¥      s�   ðñ÷
 #× "Ó "Û Ý Ý  Ý 1à
�*‰*�.‰.˜Ð$5Ó
6€ØJ€Ø2€	Ø€
ð DØOØ0ñ€ò7(òrIBòVC#ðJ ˆzÒÙ	…Gð r¤   