Ë
    V_Š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mZ dZdZ	dZ
ddd	œZd
Zdd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)u‰   
æ–°ä¹¡ä¼�ä¸š-å…¬å‘Šå…¬ç¤º çˆ¬è™«
https://www.0373ds.com/gongshi/
Discuz! ç³»ç»Ÿ, é¡µé�¢æœ‰æ··å�ˆç¼–ç �é—®é¢˜ - ä½¿ç”¨åŽŸå§‹å­—èŠ‚æ��å�–
é    N)ÚBeautifulSoupu   æ–°ä¹¡ä¼�ä¸š-å…¬å‘Šå…¬ç¤ºu   ä¼�ä¸šzhttps://www.0373ds.com/gongshi/zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36zzh-CN,zh;q=0.9)z
User-AgentzAccept-Languagez/root/search.dbc           	      óR  — t        |«      D ]o  }	 t        j                  | t        d¬«      }|j                  dk(  r|j
                  c S t        d|j                  › d|dz   › �«       t        j                  d	«       Œq y# t        $ r}t        d|› d|dz   › �«       Y d}~Œ:d}~ww xY w)
z8Fetch raw bytes - don't decode the page (mixed encoding)é   )ÚheadersÚtimeoutéÈ   z  HTTP z, retry é   z	  Error: Né   )
ÚrangeÚrequestsÚgetÚHEADERSÚstatus_codeÚcontentÚprintÚ	ExceptionÚtimeÚsleep)ÚurlÚmax_retriesÚattemptÚrÚes        ú!/root/gov_crawler/crawl_0373ds.pyÚ	fetch_rawr      s    € ä˜Ó%ò ˆð	6Ü—‘˜S¬'¸2Ô>ˆAØ�}‰} Ò#Ø—y‘yÒ Ü�G˜AŸM™M˜?¨(°7¸1±9°+Ð>Ô?ô 	�
‰
�1�ðð øô ò 	6Ü�I˜a˜S ¨°©¨Ð4×5Ñ5ûð	6ús   �6A?Á	A?Á?	B&ÂB!Â!B&c                 ó�   — t        | t        «      r	 | j                  d«      S t        | «      S #  | j                  dd¬«      cY S xY w)z6Decode bytes that are known to be UTF-8, with fallbackúutf-8Úreplace©Úerrors)Ú
isinstanceÚbytesÚdecodeÚstr)Údatas    r   Úsafe_decoder&   $   sF   € ä�$œÔð	:Ø—;‘;˜wÓ'Ð'ô ˆt‹9Ðøð	:Ø—;‘;˜w¨y�;Ó9Ò9ús	   ’. ®Ac                 ó2  — g }t        j                  d| t         j                  «      D ]ì  }|j                  d«      j	                  dd¬«      }|j                  d«      }t        j
                  dd|«      }|j	                  dd¬«      j                  «       }|sŒqt        |«      d	kD  sŒ€|j                  d
«      s$t        j                  j                  t        |«      }t        j
                  dd|«      j                  «       }|j                  ||f«       Œî |S )z*Parse list page from raw bytes using regexs.   href="([^"]*/article-\d+[^"]*)"[^>]*>(.*?)</a>r	   r   r   r   r
   ó   <[^>]+>ó    é   Úhttpz\s*\.{3,}\s*$Ú )ÚreÚfinditerÚDOTALLÚgroupr#   ÚsubÚstripÚlenÚ
startswithr   ÚcompatÚurljoinÚBASE_URLÚappend)ÚrawÚitemsÚmÚhrefÚtitle_bytesÚtitles         r   Úparse_list_pager?   -   sç   € à€Eä�[‰[ÐKÈSÔRT×R[ÑR[Ó\ò (ˆØ�w‰w�q‹z× Ñ  °Ð Ó;ˆØ—g‘g˜a“jˆä—f‘f˜[¨#¨{Ó;ˆØ×"Ñ" 7°9Ð"Ó=×CÑCÓEˆÚ”S˜“Z !“^Ø—?‘? 6Ô*Ü—‘×.Ñ.¬x¸Ó>�ä—F‘FÐ+¨R°Ó7×=Ñ=Ó?ˆEØ�L‰L˜% ˜Õ'ð(ð €Lr)   c                 óž  — | j                  dd¬«      }t        |d«      }d}|j                  dd¬«      }|r|j                  d	¬
«      }|sAt	        j
                  d| t        j                  «      }|rt        |j                  d«      «      }|sJ|j                  d«      }|r7|j                  d	¬
«      }t	        j                  dd|«      j                  «       }t	        j                  dd|«      j                  «       }d}	|j                  dd¬«      }
|
r7t	        j
                  d|
j                  «       «      }|r|j                  d«      }	|	s7t	        j
                  d| «      }|r|j                  d«      j                  «       }	d}g }t	        j
                  d| t        j                  «      }|�r¶|j                  d«      }t	        j                  dd|t        j                  ¬«      }t	        j                  dd|t        j                  ¬«      }g }t	        j                  d|t        j                  «      D ]w  }t	        j                  dd|j                  d«      «      j                  «       }|j                  dd¬«      j                  «       }t        |«      dkD  sŒg|j                  |«       Œy |rdj                  |«      }t	        j                  d| t        j                  «      D ]{  }t        |j                  d«      «      }t        |j                  d«      «      }|j                  d«      s t         j"                  j%                  ||«      }|j                  ||d œ«       Œ} |rt        |j                  «       «      d!k  r]|j'                  d"«      D �cg c]/  }t        |j                  «       «      d#kD  sŒ |j                  «       ‘Œ1 }}d"j                  |d$d% «      }t        |j                  «       «      d!k  r)d&|› d'|› d(�}|r|d)d"j                  d*„ |D «       «      z   z  }||	||rt)        j*                  |d+¬,«      |d-œS d|d-œS c c}w ).z Parse detail page from raw bytesr   r   r   zhtml.parserr,   Úh1Úph)Úclass_T)r2   s"   <h1[^>]*class="ph"[^>]*>(.*?)</h1>r	   r>   z\s*\.{3,}\s*-?\s*.*$z\s*\.{2,}\s*$ÚpÚxg1z'(\d{4}-\d{1,2}-\d{1,2}\s+\d{1,2}:\d{2})s'   (\d{4}-\d{1,2}-\d{1,2}\s+\d{1,2}:\d{2})s0   class="bm vw"[^>]*>(.*?)</div>\s*</div>\s*</div>s   <script[^>]*>.*?</script>r)   )Úflagss   <style[^>]*>.*?</style>s   <p[^>]*>(.*?)</p>r(   r*   z

sQ   <a[^>]*href="([^"]*\.(?:doc|docx|pdf|xls|xlsx|xlsm|rar|zip)[^"]*)"[^>]*>(.*?)</a>r
   r+   )r>   r   é   ú
é
   Né<   z<p><a href="z">z</a></p>u   

é™„ä»¶ï¼š
c              3   ó:   K  — | ]  }d |d   › d|d   › d�–— Œ y­w)ú[r>   z](r   ú)N© )Ú.0Úas     r   ú	<genexpr>zparse_detail.<locals>.<genexpr>‰   s)   è ø€ Ò4hÐWX°q¸¸7¹¸ÀBÀqÈÁxÀjÐPQÔ5RÑ4hùs   ‚F)Úensure_ascii)r>   Úpublish_dater   ÚattachmentsÚpage_url)r#   r   ÚfindÚget_textr-   Úsearchr/   r&   r0   r1   r2   r.   r3   r8   Újoinr4   r   r5   r6   ÚsplitÚjsonÚdumps)r9   r   ÚtextÚsoupr>   rA   Útitle_matchÚtÚ	raw_titleÚdateÚinfor;   Údmr   rT   Úvw_matchÚvw_bytesÚparasÚpmÚp_textÚamÚahrefÚatitleÚlÚliness                            r   Úparse_detailro   ?   sÀ  € à�:‰:�g iˆ:Ó0€DÜ˜˜}Ó-€Dð €EØ	�‰�4 ˆÓ	%€BÙ	Ø—‘ $�Ó'ˆÙÜ—i‘iÐ FÈÌRÏYÉYÓWˆÙÜ × 1Ñ 1°!Ó 4Ó5ˆEÙØ�I‰I�gÓˆÙØŸ
™
¨˜
Ó.ˆIÜ—F‘FÐ2°B¸	ÓB×HÑHÓJˆEô �F‰FÐ# R¨Ó/×5Ñ5Ó7€Eð €DØ�9‰9�S ˆ9Ó'€DÙÜ�I‰IÐ@À$Ç-Á-Ã/ÓRˆÙØ—7‘7˜1“:ˆDÙÜ�Y‰YÐBÀCÓHˆÙØ—8‘8˜A“;×%Ñ%Ó'ˆDð €GØ€Kô �y‰yÐMÈsÔTV×T]ÑT]Ó^€HÚØ—>‘> !Ó$ˆä—6‘6Ð7¸¸hÌbÏiÉiÔXˆÜ—6‘6Ð5°s¸HÌBÏIÉIÔVˆð ˆÜ—+‘+Ð3°X¼r¿y¹yÓIò 	%ˆBÜ—V‘V˜K¨¨b¯h©h°q«kÓ:×@Ñ@ÓBˆFØ—]‘] 7°9�]Ó=×CÑCÓEˆFÜ�6‹{˜Q‹Ø—‘˜VÕ$ð		%ñ Ø—k‘k %Ó(ˆGô —+‘+ÐsÐuxÔz|÷  {Dñ  {Dó  Eò 	@ˆBÜ §¡¨£Ó,ˆEÜ  §¡¨!£Ó-ˆFØ×#Ñ# FÔ+Ü Ÿ™×/Ñ/°°UÓ;�Ø×Ñ¨¸Ñ>Õ?ð	@ñ ”c˜'Ÿ-™-›/Ó*¨RÒ/Ø$(§J¡J¨tÓ$4ÖL˜q¼¸A¿G¹G»I»ÈÓ8K�—‘•ÐLˆÐLØ—)‘)˜E # 2˜JÓ'ˆä
ˆ7�=‰=‹?Ó˜bÒ Ø    R¨ w¨hÐ7ˆÙØÐ(¨4¯9©9Ñ4hÐ\gÔ4hÓ+hÑhÑhˆGð ØØÙFQ”t—z‘z +¸EÔBØñð ð XZØñð ùò Ms   Î!Q
Î9Q
c                 óJ  — g }t        d| dz   «      D �]  }|dk(  rt        }nt        › d|› �}t        d|› d|› �«       t        |«      }|sŒ:t	        |«      }|st        d«        |S t        dt        |«      › d�«       t        |«      D ]~  \  }\  }}t        d|dz   › d	t        |«      › d
|d d › d�«       t        |«      }	|	sŒ;t        |	|«      }
t        |
d<   t        |
d<   |j                  |
«       t        j                  d«       Œ€ t        j                  d«       �Œ |S )Nr	   zindex.php?page=z  Page z: z  No items, stoppingz  Found z itemsz    [ú/ú] é2   z...Ú	site_namer0   g      à?)r   r7   r   r   r?   r3   Ú	enumeratero   Ú	SITE_NAMEÚGROUPr8   r   r   )Ú	max_pagesÚ	all_itemsÚpager   r9   r:   Úir>   Úitem_urlÚ
detail_rawÚdetails              r   Úcrawl_pagesr   “   s?  € Ø€IÜ�a˜ Q™Ó'ó ˆØ�1Š9Ü‰Cä�J˜o¨d¨VÐ4ˆCä�˜�v˜R ˜uÐ%Ô&Ü˜‹nˆÙØä Ó$ˆÙÜÐ(Ô*Øð  Ðô 	�œ˜U›˜ FÐ+Ô,ä$-¨eÓ$4ò 		Ñ ˆAÑ ��xÜ�E˜!˜A™#˜˜a¤ E£
˜|¨2¨e°C°R¨j¨\¸Ð=Ô>Ü" 8Ó,ˆJÙØÜ! *¨hÓ7ˆFÜ"+ˆF�;ÑÜ#ˆF�7‰OØ×Ñ˜VÔ$Ü�J‰J�s�Oð		ô 	�
‰
�1Žð9ð< Ðr)   c                 ó  — dd l }|j                  t        «      }|j                  d«       |j	                  «       }d}d}| D ]€  }	 |j                  d|d   |d   |d   |j                  dd«      d|j                  d	d«      |j                  d
d«      |j                  dd«      f«       |j                  dkD  r|dz  }n|dz  }Œ‚ |j                  «        |j                  «        ||fS # t        $ r}t        d|› �«       Y d }~ŒÃd }~ww xY w)Nr   zPRAGMA busy_timeout=5000zÐ
                INSERT OR IGNORE INTO gov_raw 
                (site_name, page_url, title, publish_date, summary, content, category, attachments)
                VALUES (?, ?, ?, ?, ?, ?, ?, ?)
            rt   rU   r>   rS   r,   r   r0   rT   r	   z    DB Error: )Úsqlite3ÚconnectÚDB_PATHÚexecuteÚcursorr   Úrowcountr   r   ÚcommitÚclose)r:   r�   ÚconnÚcÚinsertedÚskippedÚitemr   s           r   Ú
save_to_dbrŽ   µ   s  € ÛØ�?‰?œ7Ó#€DØ‡L�LÐ+Ô,Ø�‰‹€AØ€H˜A�'Øò (ˆð	(Ø�I‰Ið ð �{Ñ# T¨*Ñ%5°t¸G±}Ø—(‘(˜>¨"Ó-¨r°4·8±8¸IÀbÓ3IØ—(‘(˜7 2Ó&¨¯©°¸rÓ(BðDô	Eð �z‰z˜AŠ~˜x¨1™}™xØ˜Q‘,�'øð(ð 	‡K�K„M�4—:‘:”<Ø�WÐÐøô ò 	(Ü�N 1 #Ð&×'Ñ'ûð	(ús   ÁA=C(Ã(	D	Ã1DÄD	c            	      ó’  — t        j                  dt        › �¬«      } | j                  dd¬«       | j                  dd¬«       | j                  dt        d¬	«       | j                  «       }|j                  s|j                  rd
n|j                  }|j                  rdn|j                  rdnd|z  }t        d|› dt        › d�«       t        |«      }|st        d«       y t        dt        |«      › d�«       t        |«      \  }}t        d|› d|› �«       t        d«       |d d D ]  }t        d|d   › d|d   d d › �«       Œ y )Nu   çˆ¬å�–)Údescriptionz--testÚ
store_true)Úactionz--incrementalz--max-pagesr*   )ÚtypeÚdefaultr	   u   æµ‹è¯•u   å¢žé‡�u   å…¨é‡�(å‰�%dé¡µ)z=== u   æ¨¡å¼�: z ===zNo items collectedu   
å…±èŽ·å�– u
    æ�¡æ•°æ�®u   å…¥åº“: æ–°å¢ž u	   , è·³è¿‡ u   
=== å‰�3æ�¡é¢„è§ˆ ===é   z  [rS   rr   r>   rJ   )ÚargparseÚArgumentParserrv   Úadd_argumentÚintÚ
parse_argsÚtestÚincrementalrx   r   r   r3   rŽ   )ÚparserÚargsÚendÚmoder:   r‹   rŒ   r�   s           r   Úmainr¡   Ë   sH  € Ü×$Ñ$°6¼)¸Ð1EÔF€FØ
×Ñ˜¨ÐÔ6Ø
×Ñ˜°ÐÔ=Ø
×Ñ˜¬C¸ÐÔ;Ø×ÑÓ€Dà—	’	˜T×-Ò-‰!°D·N±N€CØ—y’y‰8°4×3CÒ3C¡xÐI[Ð^aÑIa€Dä	ˆD���hœy˜k¨Ð
.Ô/Ü˜Ó€EÙÜÐ"Ô# Vä	ˆLœ˜U›˜ JÐ
/Ô0Ü" 5Ó)Ñ€HˆgÜ	ˆO˜H˜: Y¨w¨iÐ
8Ô9ä	Ð#Ô%Ø�b�q�	ò BˆÜ��D˜Ñ(Ð)¨¨D°©M¸#¸2Ð,>Ð+?Ð@ÕAñBr)   Ú__main__)r•   )Ú__doc__r-   r[   r   r–   r   Úbs4r   rv   rw   r7   r   rƒ   r   r&   r?   ro   r   rŽ   r¡   Ú__name__rN   r)   r   ú<module>r¦      s   ðñó
 
Û Û Û Û Ý à'€	Ø€Ø,€ð DØ'ñ€ð €óòòò$Ròh òDò,Bð. ˆzÒÙ…Fð r)   