Ë
    ¸¬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mZmZ ddl	m
Z
 ddlZ ej                  dd«      ZdZdZd	Z ej"                  «        ed
¬«      z
  j%                  d«      ZdZddddœZ ej,                  «       Zej0                  j3                  e«       d„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)uW   Crawl æ›²é�–å¸‚éº’éºŸåŒº - å…¬ç¤ºå…¬å‘Š
http://www.ql.gov.cn/gov/public/info/tzgg.html
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoupÚ	SEARCH_DBz/root/search.dbu   éº’éºŸåŒº - å…¬ç¤ºå…¬å‘Šzhttp://www.ql.gov.cnz.http://www.ql.gov.cn/gov/public/info/tzgg.htmliG  )Údaysz%Y-%m-%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,en;q=0.8)z
User-AgentÚAcceptzAccept-Languagec                  óf   — 	 t         j                  t        d¬«      } | j                  dk(  S #  Y yxY w)z'Get past WAF by visiting homepage firsté   ©ÚtimeoutéÈ   F)ÚsessionÚgetÚBASE_URLÚstatus_code)Úresps    ú/root/gov_crawler/crawl_ql.pyÚinit_sessionr      s4   € ðÜ�{‰{œ8¨Rˆ{Ó0ˆØ×Ñ 3Ñ&Ð&øðÙús   ‚), ¬0c                 ó`  — g }t        | d«      }|j                  dd¬«      }|s|S |j                  dd¬«      D ]ò  }|j                  dd	¬
«      }|sŒ|d   }|j                  d«      sŒ0|j	                  d«      xs |j                  d	¬«      }|j                  «       }|j                  «       }	|j                  |	dd«      j                  «       }
t        j                  d|
«      }|r|j                  d«      nd}t        |z   }|sŒÍ|sŒÐ|j                  |j                  «       ||dœ«       Œô |S )Núhtml.parserÚulzp-list©Úclass_ÚliF)Ú	recursiveÚaT)Úhrefr   z/gov/public/detail/Útitle©ÚstripÚ é   z(\d{4}-\d{2}-\d{2}))r   ÚurlÚdate)r   ÚfindÚfind_allÚ
startswithr   Úget_textÚreplacer!   ÚreÚsearchÚgroupr   Úappend)ÚhtmlÚitemsÚsoupr   r   r   r   r   Úli_textÚa_textr%   ÚdmÚdate_strr$   s                 r   Ú
parse_listr6   !   s  € Ø€EÜ˜˜}Ó-€DØ	�‰�4 ˆÓ	)€BÙØˆØ�k‰k˜$¨%ˆkÓ0ò QˆØ�G‰G�C˜dˆGÓ#ˆÙØØ�‰yˆØ�‰Ð4Ô5ØØ—‘�g“Ò8 !§*¡*°4 *Ó"8ˆà—+‘+“-ˆØ—‘“ˆØ�‰˜v r¨1Ó-×3Ñ3Ó5ˆÜ�Y‰YÐ-¨tÓ4ˆÙ"$�2—8‘8˜A”;¨"ˆÜ˜‰oˆÚ’XØ�L‰L 5§;¡;£=¸ÀhÑOÕPð!Qð" €Ló    c                 óv  — 	 t         j                  | d¬«      }d|_        |j                  }t	        |d«      }|j                  dd¬«      }|r|j                  d	¬
«      nd}d}t        j                  d|«      }|r|j                  d«      }|j                  dd¬«      }|rŽt        |«      }	t        j                  dd|	t        j                  t        j                  z  ¬«      }	t        j                  dd|	t        j                  t        j                  z  ¬«      }	|||	j                  «       fS ||dfS #  Y yxY w)Nr   r   úutf-8)r"   r"   r"   r   Úh3Úpublic_web_titler   Tr    r"   u"   å�‘å¸ƒæ—¶é—´\s*(\d{4}-\d{2}-\d{2})r#   ÚdivÚpublic_web_conz<script[^>]*>.*?</script>)Úflagsz<style[^>]*>.*?</style>)r   r   ÚencodingÚtextr   r&   r)   r+   r,   r-   ÚstrÚsubÚDOTALLÚIr!   )
r$   r   r/   r1   r:   r   r5   r4   ÚconÚcontent_raws
             r   Úfetch_detailrG   :   s&  € ðÜ�{‰{˜3¨ˆ{Ó+ˆØˆŒØ�y‰yˆô ˜˜}Ó-€Dð 
�‰�4Ð 2ˆÓ	3€BÙ')ˆB�K‰K˜dˆKÔ#¨r€Eð €HÜ	�‰Ð8¸$Ó	?€BÙ	Ø—8‘8˜A“;ˆð �)‰)�EÐ"2ˆ)Ó
3€CÙ
Ü˜#“hˆÜ—f‘fÐ9¸2¸{ÔRT×R[ÑR[Ô\^×\`Ñ\`ÑR`ÔaˆÜ—f‘fÐ7¸¸[ÔPR×PYÑPYÔZ\×Z^ÑZ^ÑP^Ô_ˆØ�h × 1Ñ 1Ó 3Ð3Ð3à�(˜BÐÐøð/Ùús   ‚*D4 Ä4D8c                  ó 	  — dt         j                  v } t        dt        › d�«       t	        «       st        d«       y t        j                  t        «      }|j                  «       }d\  }}}| rdnt        }d}d}t        j                  «       }	t        d|dz   «      D �]7  }
|
dk(  rt        }nt        › d	|
› �}	 t        j                  |d
¬«      }d|_        |j                   }t'        |«      }|st        d|
› d�«        �nÖt)        d„ |D «       «      }|r!|dz  }|dk\  r|
|k\  rt        d|
› d�«        �n¡d}|D �]`  }|d   r|d   t*        k  r|dz  }Œ|j-                  d|d   f«      j/                  «       }|r|dz  }ŒG	 t1        |d   «      \  }}}|xs |d   }|xs |d   }t3        t5        j6                  |d   j9                  «       «      j;                  «       d d d«      dz  }|rt3        |j=                  dd«      «      nd}|rt?        j@                  dd|«      d d n|}t?        j@                  d d!|«      jC                  «       }	 |j-                  d"|t        |d   |d   |||||f	«       |jD                  dkD  r|dz  }t        j$                  d$«       �Œc t        j                  «       |	z
  }t        d|
› d%|› d&|› d'|› d(|› d)|d*›d+�«       �Œ: |jG                  «        	 |j                  «       }|j-                  d,t        f«       |j-                  d-t        f«      jI                  «       }|D ]  }|j-                  d.|«       Œ |jG                  «        t        d/tK        |«      › d0�«       |jM                  «        t        j                  «       |	z
  }t        d2|d*›d3|› d4|› d5|› �«       y # t"        $ r1}t        d|
› d|› �«       t        j$                  d«       Y d }~�ŒNd }~ww xY w# t"        $ r3}t        d|› �«       t        j$                  d«       |dz  }Y d }~�Œïd }~ww xY w# t"        $ r}t        d#|› �«       |dz  }Y d }~�ŒÍd }~ww xY w# t"        $ r}t        d1|› �«       Y d }~�Œd }~ww xY w)6NÚincrementalz=== z ===z'  [ERROR] Failed to init session (WAF?))r   r   r   r#   r   r   z?cname=tzgg&page=r   r   r9   z  [ERROR] Page z: é   z  Page z: 0 items (end)c              3   ó@   K  — | ]  }|d    sŒ	|d    t         k  –— Œ y­w)r%   N)ÚCUTOFF_DATE)Ú.0Úitems     r   ú	<genexpr>zmain.<locals>.<genexpr>{   s   è ø€ ÒS°TÀdÈ6Ãl�d˜6‘l¤[Õ0ÑSùs   ‚
�z: all old, stoppingr%   zNSELECT 1 FROM gov_raw WHERE page_url=? AND content IS NOT NULL AND content!=''r$   z  [ERROR] Detail: r   é   é   l            ú-r"   z<[^>]+>r   z\s+ú zŽINSERT OR IGNORE INTO gov_raw(id, site_name, source_url, page_url, title, publish_date, content, summary, date_rank) VALUES(?,?,?,?,?,?,?,?,?)z  [DB] g333333Ó?ú/z: +z
 (skipped z, >3y z) [z.0fzs]zPDELETE FROM gov_search WHERE rowid IN (SELECT id FROM gov_raw WHERE site_name=?)zCSELECT id, title, site_name, summary FROM gov_raw WHERE site_name=?zRINSERT OR IGNORE INTO gov_search(rowid, title, site_name, summary) VALUES(?,?,?,?)z  FTS: z records rebuiltz  FTS error: z
Done (zs). Inserted z
, Skipped z, Old )'ÚsysÚargvÚprintÚ	SITE_NAMEr   Úsqlite3ÚconnectÚDB_PATHÚcursorÚ	MAX_PAGESÚtimeÚrangeÚLIST_URLr   r   r?   r@   Ú	ExceptionÚsleepr6   ÚallrL   ÚexecuteÚfetchonerG   ÚintÚhashlibÚmd5ÚencodeÚ	hexdigestr*   r+   rB   r!   ÚrowcountÚcommitÚfetchallÚlenÚclose)Úis_incrementalÚconnÚcÚinsertedÚskippedÚ	old_totalÚ	max_pagesÚconsecutive_oldÚ	min_pagesÚ
start_timeÚpgÚlist_urlr   Úraw_htmlÚer0   Úall_oldrN   Úhasr   r5   ÚcontentÚfinal_titleÚ
final_dateÚint_idÚ	date_rankÚsummaryÚelapsedÚc2ÚrowsÚrs                                  r   ÚmainrŠ   X   s—  € Ø"¤c§h¡hÐ.€NÜ	ˆD”�˜4Ð
 Ô!äŒ>ÜÐ7Ô8Øä�?‰?œ7Ó#€DØ�‰‹€AØ#*Ñ €Hˆg�yÙ#‘¬€IØ€OØ€IÜ—‘“€Jä�A�y 1‘}Ó%ó BmˆØ�Š7Ü‰Hä"˜Ð#4°R°DÐ9ˆHð	Ü—;‘;˜x°�;Ó4ˆDØ#ˆDŒMØ—y‘yˆHô ˜8Ó$ˆÙÜ�G˜B˜4˜Ð/Ô0ÚäÑS¸UÔSÓSˆÙØ˜qÑ ˆOØ !Ò#¨¨iªÜ˜ ˜tÐ#6Ð7Ô8ÚàˆOàó #	ˆDØ�FŠ|  V¡¬{Ò :Ø˜Q‘�	Øà—)‘)ÐlÐosÐtyÑozÐn|Ó}÷  Gñ  Gó  IˆCÙØ˜1‘�ØðÜ+7¸¸U¹Ó+DÑ(��x ð  Ò0 4¨¡=ˆKØ!Ò1 T¨&¡\ˆJÜœŸ™ T¨%¡[×%7Ñ%7Ó%9Ó:×DÑDÓFÀsÈÐKÈRÓPÐTYÑZˆFÙ<Fœ˜J×.Ñ.¨s°BÓ7Ô8ÈAˆIÙ?F”b—f‘f˜Z¨¨WÓ5°d°sÑ;ÈKˆGÜ—f‘f˜V S¨'Ó2×8Ñ8Ó:ˆGð	Ø—	‘	ð eØœY¨¨U©°T¸%±[À+ÈzÐ[bÐdkÐmvÐwôð —:‘: ’>Ø ‘M�Hô �J‰J�sŽOðG#	ôJ —)‘)“+ 
Ñ*ˆÜ�˜�t˜1˜Y˜K s¨8¨*°J¸w¸iÀvÈiÈ[ÐX[Ð\cÐdgÐ[hÐhjÐkÖlðEBmðH 	‡K�K„Mð	#Ø�[‰[‹]ˆØ
�
‰
ÐeÔhqÐgsÔtØ�z‰zÐ_ÔbkÐamÓn×wÑwÓyˆØò 	pˆAØ�J‰JÐkÐmnÕoð	pà�‰ŒÜ�œ˜D›	�{Ð"2Ð3Ô4ð 	‡J�J„LÜ�i‰i‹k˜JÑ&€GÜ	ˆH�W˜S�M ¨x¨j¸
À7À)È6ÐR[ÐQ\Ð
]Õ^øôS ò 	Ü�O B 4 r¨!¨Ð-Ô.Ü�J‰J�qŒMÝûð	ûô> ò ÜÐ*¨1¨#Ð.Ô/Ü—
‘
˜1”Ø˜1‘�Ýûð	ûô( ò Ü˜ ˜s�mÔ$Ø˜1‘–ûðûô$ ò #Ü�˜a˜SÐ!×"Ò"ûð#úsa   Â8*N5ÆO2É9P1Ë(BQ Î5	O/Î>&O*Ï*O/Ï2	P.Ï;(P)Ð)P.Ð1	QÐ:QÑQÑ	Q=Ñ$Q8Ñ8Q=Ú__main__)Ú__doc__Úrequestsr+   rY   rU   r^   rg   r   r   Úbs4r   ÚosÚgetenvr[   rX   r   r`   ÚnowÚstrftimerL   r]   ÚHEADERSÚSessionr   ÚheadersÚupdater   r6   rG   rŠ   Ú__name__© r7   r   ú<module>r™      sÉ   ðñ÷ 1× 0× 0ß (Ý Û 	à
ˆ"�)‰)�KÐ!2Ó
3€Ø&€	Ø!€Ø;€Øˆx�|‰|‹~¡	¨uÔ 5Ñ5×?Ñ?À
ÓK€Ø€	ð DØOØ0ñ€ð
 ˆ(×
Ñ
Ó
€Ø ‡�× Ñ �wÔ òòò2ò<b_ðH ˆzÒÙ…Fð r7   