Ë
    ì¾j®"  ã                   óx  — 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	d
ddœZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zdefd„Zedk(  rpdej.                  v rdndZedk(  rdneZ eej.                  «      dkD  r2ej.                  d   j7                  «       r eej.                  d   «      Z eedk(  e¬«       yy)é    N)ÚBeautifulSoup)Úurljoinz/root/search.dbu   é˜³ä¿¡åŽ¿-çŽ¯è¯„å…¬ç¤ºu   å»ºè®¾é¡¹ç›®çŽ¯å¢ƒå½±å“�è¯„ä»·zdhttp://www.yangxin.gov.cn/col/col271893/index.html?vc_xxgkarea=11371622004380928G-1&number=YX0570308é	   zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36zJtext/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8zzh-CN,zh;q=0.9,en;q=0.8)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 } | j                  t        «      }|j                  d«       |j                  d«       |S )Nr   zPRAGMA journal_mode=WALzPRAGMA busy_timeout=5000)Úsqlite3ÚconnectÚDB_PATHÚexecute)r   Úconns     ú"/root/gov_crawler/crawl_yangxin.pyÚinit_dbr      s2   € ÛØ�?‰?œ7Ó#€DØ‡L�LÐ*Ô+Ø‡L�LÐ+Ô,Ø€Kó    c                 óJ  — | j                   }| j                  j                  dd«      }d|j                  «       v sd|j                  «       v r|j	                  dd¬«      S |d d j                  «       }d|v sd	|v sd
|v r|j	                  dd¬«      S |j	                  dd¬«      S )NzContent-TypeÚ Úgb2312ÚgbkÚreplace)ÚerrorsiÐ  s   gb2312s   gbks
   charset=gbzutf-8)ÚcontentÚheadersÚgetÚlowerÚdecode)ÚrÚrawÚctÚ	raw_lowers       r   Údecode_respr      s�   € Ø
�)‰)€CØ	
�‰�‰�~ rÓ	*€BØ�2—8‘8“:Ñ ¨"¯(©(«*Ñ!4Ø�z‰z˜%¨	ˆzÓ2Ð2Ø�E�T�
× Ñ Ó"€IØ�IÑ ¨9Ñ!4¸ÈÑ8RØ�z‰z˜%¨	ˆzÓ2Ð2Ø�:‰:�g iˆ:Ó0Ð0r   c                 ó   — t        | «      S )u'   ä¿�ç•™ HTML è¡¨æ ¼ç»“æž„ï¼ˆä¸�è½¬ mdï¼‰)Ústr)ÚtableÚargsÚkwargss      r   Útable_to_mdr%   )   s   € äˆu‹:Ðr   c                 ób  — g }t        «       }| j                  g d¢d¬«      D �]z  }t        |«      |v rŒ|j                  t        |«      «       |j                  dk(  r t        |«      }|sŒI|j                  |«       Œ[|j                  dk(  r™|j                  dd«      }|rQ|j                  dd«      }|j                  d	«      st        ||«      n|}|j                  |r	d
|› d|› d�nd|› d�«       |j                  dd¬«      D ]  }	|j                  t        |	«      «       Œ �Œ|j                  dk(  rA|j                  dd¬«      }
|
s�Œ)t        j                  dd|
«      }
|j                  |
«       �ŒS|j                  dd¬«      }
|
s�Œj|j                  |
«       �Œ} dj                  |«      S )z3Extract content from the detail page's content div.)Úpr"   ÚimgÚh1Úh2Úh3Úh4T)Ú	recursiver"   r(   Úsrcr   ÚaltÚhttpz![ú](ú)z![](r'   ú ©Ústripz[^\S\n]+ú

)ÚsetÚfind_allÚidÚaddÚnamer%   Úappendr   Ú
startswithr   Úget_textÚreÚsubÚjoin)Úcontent_divÚ
detail_urlÚpartsÚ	processedÚelÚmdr.   r/   Úfull_srcÚsub_imgÚtxts              r   Úextract_contentrK   -   s€  € à€EÜ“€Ià×"Ñ"Ò#PÐ\`Ð"Óaó "ˆÜˆb‹6�YÑØØ�‰”b˜“fÔà�7‰7�gÒÜ˜R“ˆBÚØ—‘˜RÕ Ø�W‰W˜ÒØ—&‘&˜ Ó#ˆCÙØ—f‘f˜U BÓ'�Ø;>¿>¹>È&Ô;Qœ7 :¨sÔ3ÐWZ�Ø—‘¹˜r #  b¨¨
°!Ñ4À4ÈÀzÐQRÐASÔTØŸ;™; u¸˜;Ó=ò +�Ø—‘œb ›kÕ*ò+à�W‰W˜Š^Ø—+‘+˜c¨�+Ó.ˆCÛÜ—f‘f˜[¨#¨sÓ3�Ø—‘˜SÖ!à—+‘+˜c¨�+Ó.ˆCÛØ—‘˜SÖ!ð3"ð6 �;‰;�uÓÐr   c                 óŽ  ‡— g }dD ]¼  }| j                  |«      D ]¦  }|j                  dd«      j                  «       }|r|j                  d«      rŒ7|j	                  d¬«      xs |j                  d«      d   }|j                  d	«      st        ||«      n|Št        ˆfd
„|D «       «      rŒ“|j                  |‰dœ«       Œ¨ Œ¾ |S )zExtract attachment links.)z.dowload a[href]za[href$=".pdf"]za[href$=".doc"]za[href$=".docx"]za[href$=".xls"]za[href$=".xlsx"]za[href$=".zip"]za[href$=".rar"]Úhrefr   Ú
javascriptTr4   ú/éÿÿÿÿr0   c              3   ó.   •K  — | ]  }|d    ‰k(  –— Œ y­w)ÚurlN© )Ú.0ÚaaÚfull_urls     €r   ú	<genexpr>z&extract_attachments.<locals>.<genexpr>]   s   øè ø€ ÒC°�r˜%‘y HÕ,ÑCùs   ƒ)r;   rR   )	Úselectr   r5   r=   r>   Úsplitr   Úanyr<   )ÚsouprC   ÚattachmentsÚselectorÚarM   r;   rV   s          @r   Úextract_attachmentsr_   P   sÅ   ø€ à€Kðbò 
Dˆà—‘˜XÓ&ò 	DˆAØ—5‘5˜ Ó$×*Ñ*Ó,ˆDÙ˜4Ÿ?™?¨<Ô8ØØ—:‘: D�:Ó)Ò@¨T¯Z©Z¸«_¸RÑ-@ˆDØ8<¿¹ÈÔ8O”w˜z¨4Ô0ÐUYˆHäÓC°{ÔCÕCØ×"Ñ"¨D¸Ñ#BÕCñ	Dð
Dð Ðr   c                 óÈ  — d}i dd“dd“dd“dd	“d
d“dd“dt        |«      “dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“}	 | j                  ||dt        ddœ¬«      }t        |j                  d«      }g }|j                  d«      D ]Ÿ  }|j                  d«      }|r|j                  d«      sŒ(|d   j                  «       }	|j                  dd«      xs |j                  d ¬!«      }
|
sŒd|j                  d"«      }|r|j                  d ¬!«      nd}|j                  |
|	|d#œ«       Œ¡ |S # t        $ r-}t        d$|› d%|› �t        j                  ¬&«       g cY d'}~S d'}~ww xY w)(z Get a single list page via POST.zohttp://www.yangxin.gov.cn/module/xxgk/search.jsp?standardXxgk=1&infotypeId=YX0570308&vc_title=&vc_number=&area=Ú
infotypeIdÚ	YX0570308ÚjdidÚ1Úarear   ÚdividÚdiv4Úvc_titleÚ	vc_numberÚcurrpageÚvc_filenumberÚvc_allÚtexttypeÚfbtimeÚ	sortfieldÚfieldsÚfieldConfigIdÚ
hasNoPagesÚ	infoCountÚ	isAllListé   ÚXMLHttpRequest)ÚRefererzX-Requested-With)ÚdataÚtimeoutr   úhtml.parserzul lir^   rM   ÚtitleTr4   Úb)r{   rR   Údatez  [ERR] page ú: ©ÚfileN)r!   ÚpostÚBASE_URLr   ÚtextrX   Úfindr   r5   r>   r<   Ú	ExceptionÚprintÚsysÚstderr)ÚsessionÚpage_numÚ
search_urlrx   r   r[   ÚitemsÚlir^   rM   r{   r|   Údate_strÚes                 r   Úget_list_pager�   b   së  € ð C€JðØ�kðØ#)¨3ðØ06¸ðØ<CÀVðà�Bðà# Rðà)3´S¸³]ðð 	˜ðð & rðð ,6°rðð <DÀRðð 	�Rð	ð " 2ð	ð (7¸ð	ð =IÈ"ð	ð
 	�Rðð
 % cð€DðØ�L‰L˜¨$¸ÜÐ5EñE
ˆLó ˆô ˜QŸV™V ]Ó3ˆØˆØ—+‘+˜gÓ&ò 
	JˆBØ—‘˜“ˆAÙ˜AŸE™E &œMØØ�V‘9—?‘?Ó$ˆDØ—E‘E˜' 2Ó&Ò@¨!¯*©*¸4¨*Ó*@ˆEÙØØ—‘˜“ˆAÙ12�q—z‘z¨�zÔ-¸ˆHØ�L‰L 5°¸xÑHÕIð
	Jð ˆøÜò Ü�˜h˜Z r¨!¨Ð-´C·J±JÕ?Ø�	ûðús   ÁC(D+ Ä+	E!Ä4"EÅE!ÅE!c                 ó.  — 	 | j                  |d¬«      }|j                  «        t        |«      }t	        |d«      }|j                  d«      }|r|j                  d¬«      nd}d}|j                  d	d
¬«      }	|	rU|	j                  d«      }
|
D ]?  }|j                  d¬«      }t        j                  d|«      }|sŒ.|j                  d«      } n |j                  d	d¬«      }d}|rt        ||«      }t        ||«      }t        |j                  «       «      dk  rVd|xs |j!                  d«      d   › d|› d�}|r3|D �cg c]  }d|d   › d|d   › d�‘Œ }}|ddj#                  |«      z   z  }|}||||fS # t        $ r}dddg fcY d}~S d}~ww xY wc c}w )zExtract detail page content.ru   ©ry   Nrz   zdiv.artcle h1Tr4   r   ÚdivÚfbsj)Úclass_Úspanz(\d{4}-\d{2}-\d{2})é   r   é   ú[rO   rP   r1   r2   u
   é™„ä»¶ï¼š[r;   rR   r6   )r   Úraise_for_statusr…   r   r   Ú
select_oner>   r„   r8   r?   ÚsearchÚgrouprK   r_   Úlenr5   rY   rA   )r‰   rR   r   r�   Úhtmlr[   r)   r{   rŽ   r”   Úspansr–   rJ   ÚmrB   r   r\   Úfallbackr^   Úattach_linkss                       r   Úextract_detailr¤   ƒ   sÀ  € ð$Ø�K‰K˜ RˆKÓ(ˆØ	×ÑÔô �q‹>€DÜ˜˜}Ó-€Dð 
�‰˜Ó	)€BÙ')ˆB�K‰K˜dˆKÔ#¨r€Eð €HØ�9‰9�U 6ˆ9Ó*€DÙØ—‘˜fÓ%ˆØò 	ˆDØ—-‘- d�-Ó+ˆCÜ—	‘	Ð0°#Ó6ˆAÚØŸ7™7 1›:�Ùð	ð —)‘)˜E¨)�)Ó4€KØ€GÙÜ! +¨sÓ3ˆô & d¨CÓ0€Kô ˆ7�=‰=‹?Ó˜bÒ Ø�uÒ2 §	¡	¨#£¨rÑ 2Ð3°2°c°U¸!Ð<ˆÙØKVÖWÀa˜j¨¨6©¨°2°a¸±h°Z¸qÒAÐWˆLÐWØ˜ §¡¨\Ó!:Ñ:Ñ:ˆHØˆà�(˜G [Ð0Ð0øôO ò $Ø�T˜4 Ð#Õ#ûð$üòF Xs#   ‚#E6 Ä?FÅ6	FÅ?F
ÆFÆ
FFc                 ód  — t        j                  «       }|j                  j                  t        «       	 |j                  t        d¬«       t        «       }|j                  «       }d}d}d}t        d|dz   «      D �]Ž  }	t        ||	«      }
|t        |
«      z  }|
st        d|	› d�«        �n`t        d|	› d	t        |
«      › d
�«       |
D �]1  }|d   }|j!                  d«      s$t#        t        |«      }|j%                  d«      d   }|j'                  d|f«       |j)                  «       rŒbt+        ||«      \  }}}}|s|dz  }Œ{|xs |d   }|xs |d   }|rt-        d«      j/                  |d¬«      nd}|r|d d n|j1                  «       }|s|}	 |j'                  t2        t4        |||j1                  «       |||t6        |t6        f
«       |j9                  «        |j:                  dkD  r|dz  }| s�Œ+|dk\  s�Œ2 n | s�Œˆ|dk\  s�Œ� n |j=                  «        t        dt4        › �«       t        d|› d|› d|› �«       |S # t        $ r(}t        d|› �t        j                  ¬«       Y d }~yd }~ww xY w# t        $ r-}t        d|› �t        j                  ¬«       |dz  }Y d }~Œ¹d }~ww xY w)Nru   r’   z  [ERR] main page: r   r   r—   z  Page z: 0 items, stoppingr~   z itemsrR   r0   ú?z)SELECT id FROM gov_raw WHERE page_url = ?r{   r}   ÚjsonF)Úensure_asciir   éÈ   z  DB error: é   z
[DONE] z  New: z
, Errors: z, Listed total: )ÚrequestsÚSessionr   ÚupdateÚHEADERSr   r‚   r…   r†   r‡   rˆ   r   ÚcursorÚranger�   rž   r=   r   rY   r   Úfetchoner¤   Ú
__import__Údumpsr5   ÚSQLÚ	SITE_NAMEÚCATEGORYÚcommitÚrowcountÚclose)Ú	test_modeÚ	max_pagesr‰   r�   r   ÚcurÚtotalr   Útotal_listedÚpnrŒ   ÚitemrR   r{   rŽ   r   r\   Úfinal_titleÚ
final_dateÚatt_jsonÚsummarys                        r   ÚcrawlrÅ   ²   s¯  € Ü×ÑÓ €GØ‡O�O×Ñœ7Ô#ðØ�‰”H bˆÔ)ô
 ‹9€DØ
�+‰+‹-€CØ€EØ€FØ€Lä�A�y 1‘}Ó%ó 3ˆÜ˜g rÓ*ˆØœ˜E›
Ñ"ˆáÜ�G˜B˜4Ð2Ð3Ô4Úä�˜�t˜2œc %›j˜\¨Ð0Ô1àó &	ˆDØ�u‘+ˆCà—>‘> &Ô)Üœh¨Ó,�à—i‘i “n QÑ'�ð �K‰KÐCÀcÀVÔLØ�|‰|Œ~Øä4BÀ7ÈCÓ4PÑ1ˆE�8˜W kÙØ˜!‘�ØàÒ0 4¨¡=ˆKØ!Ò1 T¨&¡\ˆJÙT_”z &Ó)×/Ñ/°È%Ð/ÔPÐegˆHÙ(/�w˜t ‘}°[×GÑGÓIˆGÙØ%�ð
Ø—‘œCÜ˜s C¨×):Ñ):Ó)<¸jØ˜W¤h°¼(ð"ô ð —‘”Ø—<‘< !Ò#Ø˜Q‘J�Eó
 ˜U aœZÙðM&	óP ˜ !œÙðg3ðj 	‡J�J„LÜ	ˆI”i�[Ð
!Ô"Ü	ˆG�E�7˜* V HÐ,<¸\¸NÐ
KÔLØ€LøôE ò ÜÐ# A 3Ð'¬c¯j©jÕ9Üûðûôj ò Ü˜ Q CÐ(¬s¯z©zÕ:Ø˜!‘•ûðús0   µI ÆAI9É	I6ÉI1É1I6É9	J/Ê#J*Ê*J/Ú__main__z--testÚtestÚfullrª   r—   )rº   r»   )r«   r?   r‡   Úbs4r   Úurllib.parser   r
   rµ   r¶   r‚   Ú	MAX_PAGESr®   r´   r   r   r%   rK   r_   r�   r¤   rÅ   Ú__name__ÚargvÚmodeÚmax_prž   ÚisdigitÚintrS   r   r   ú<module>rÒ      sé   ðß Ó Ý Ý  à
€Ø$€	Ø+€Øq€Ø€	ð DØZØ0ñ€ð-€ò
ò1òò òFò$òB,1ð^  Yó IðX ˆzÒØ §¡Ñ)‰6¨v€DØ˜’‰A Y€EÙ
ˆ3�8‰8ƒ}�qÒ˜SŸX™X a™[×0Ñ0Ô2Ù�C—H‘H˜Q‘KÓ ˆÙ	�T˜V‘^°Ö6ð r   