Ë
    ê+|jx-  ã                   óœ  — 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ZddlmZmZ dZedz   ZdZdZdZej(                  j+                  d	d
«      Zej(                  j+                  dd«      ZdZddddœZdZdadZ eej<                  «      D ]k  \  ZZ e jC                  d«      r	  e"e jG                  dd«      d   «      ZŒ4e dk(  sŒ:edz    e%ej<                  «      k  sŒS	  e"ej<                  edz      «      ZŒm edk\  rendZ&d#d„Z'd„ Z(d„ Z)d„ Z*d„ Z+d„ Z,d„ Z-d„ Z.d „ Z/d!„ Z0e1d"k(  r e0«        yy# e$$ r Y Œ«w xY w# e$$ r Y Œ¶w xY w)$uë  
crawl_jiangjin_bmjz.py - æ±Ÿæ´¥åŒº-éƒ¨é—¨è¡—é•‡
http://www.jiangjin.gov.cn/zwxx_180/bmjz/
åˆ—è¡¨: div.list > a[href=./YYYYMM/t...html] > span(æ ‡é¢˜) + span(æ—¥æœŸ)
åˆ†é¡µ: index_N.html (24 é¡µ ~480 æ�¡, æ¯�é¡µ 20 æ�¡; pageCount å†™æ­»25ä½†P25=404)
è¯¦æƒ…: /zwxx_180/bmjz/YYYYMM/t...html
  â†’ div.title(æ ‡é¢˜) + div.info(å�‘å¸ƒæ—¥æœŸ) + div.trs_editor_view.TRS_UEDITOR(æ­£æ–‡)
é™„ä»¶: âš ï¸� JSå�˜é‡� hasFJ å†… document.write åŠ¨æ€�ç”Ÿæˆ�, æ­£åˆ™æ��å�– <script>var hasFJ = '...'</script>
é    N)ÚBeautifulSoupÚCommentzhttp://www.jiangjin.gov.cnz/zwxx_180/bmjz/u   æ±Ÿæ´¥åŒº-éƒ¨é—¨è¡—é•‡u   é‡�åº†zcrawl_jiangjin_bmjz.pyÚDB_PATHz/root/search.dbÚ
JSONL_PATHÚ úutf-8zkMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36z?text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8zzh-CN,zh;q=0.9)z
User-AgentÚAcceptzAccept-Languageg333333ó?g        é   z--pages=ú=z--pagesc                 ó’  — t        j                   «       t        z
  }|t        k  rt        j                  t        |z
  «       t        j                   «       at	        |«      D ]V  }	 t        j                  | t        |d¬«      }|j                  dk(  rd|_	        |c S 	 t        j                  d|dz  z   «       ŒX y # t        $ r Y Œ)w xY w)NF)ÚheadersÚtimeoutÚverifyéÈ   r   é   )ÚtimeÚ	_last_reqÚREQUEST_INTERVALÚsleepÚrangeÚrequestsÚgetÚHEADERSÚstatus_codeÚencodingÚ	Exception)ÚurlÚretriesr   ÚdtÚiÚrs         ú(/root/gov_crawler/crawl_jiangjin_bmjz.pyÚhttp_getr#   :   s°   € ä	�‰‹”yÑ	 €BØ	ÔÒÜ�
‰
Ô# bÑ(Ô)Ü—	‘	“€IÜ�7‹^ò ˆð	Ü—‘˜S¬'¸7È5ÔQˆAØ�}‰} Ò#Ø$�”
Ø’ð $ô
 	�
‰
�1�q˜1‘u‘9Õðð øô ò 	Ùð	ús   Á$4B:Â:	CÃCc                 ó  — | syt        j                  | «      } | j                  dd«      j                  dd«      j                  dd«      j                  dd«      } t        j                  dd| «      } | j                  «       S )Nr   u   â€‹u   â€Œu   â€�u   ï»¿ú\s+ú )Úhtml_libÚunescapeÚreplaceÚreÚsubÚstrip)Úts    r"   Úclean_titler.   L   so   € ÙØÜ×Ñ˜!Ó€AØ	�	‰	�(˜BÓ×'Ñ'¨°"Ó5×=Ñ=¸hÈÓK×SÑSÐT\Ð^`Óa€AÜ
�‰ˆv�s˜AÓ€AØ�7‰7‹9Ðó    c           
      óº  — | dk(  rt         }nt         d| › d�z   }t        |«      }|€g S |j                  }g }t        j                  d|t        j
                  «      D ]ü  }|j                  d«      t        |j                  d«      «      |j                  d«      }}}t        j                  j                  t         d|› d	|j                  d
«      j                  d	«      d   dd › �«      }	|j                  d
«      }
t        j                  d|
«      }|r3t        j                  j                  t         |j                  d«      «      }	|j                  |	||f«       Œþ |S )u0   æŠ“ä¸€é¡µåˆ—è¡¨, è¿”å›ž [(abs_url, title, date)]r
   Úindex_z.htmlNzo<a href="\./(\d{6})/t\d+_\d+\.html">\s*<span>\s*(.*?)\s*</span>\s*<span>\s*(\d{4}-\d{2}-\d{2})\s*</span>\s*</a>r   é   ú./z/tr   zhref="(\./[^"]+)")ÚLIST_URLr#   Útextr*   ÚfinditerÚSÚgroupr.   ÚurllibÚparseÚurljoinÚsplitÚsearchÚappend)Úpager   r!   Ú	html_textÚitemsÚmÚhrefÚtitleÚdateÚabs_urlÚrawÚhms               r"   Ú
fetch_listrI   U   sF  € àˆq‚yÜ‰ä˜6 $  uÐ-Ñ-ˆÜ�‹€AØ€yØˆ	Ø—‘€IØ€Eä�[‰[ð  Lð  NWô  Y[÷  Y]ñ  Y]ó  ^ò -ˆØŸG™G A›J¬°A·G±G¸A³JÓ(?ÀÇÁÈÃ�TˆeˆÜ—,‘,×&Ñ&¤x°2°d°V¸2¸a¿g¹gÀa»j×>NÑ>NÈtÓ>TÐUVÑ>WÐXZÐYZÐ>[Ð=\Ð1]Ó^ˆà�g‰g�a‹jˆÜ�Y‰YÐ+¨SÓ1ˆÙÜ—l‘l×*Ñ*¬8°R·X±X¸a³[ÓAˆGØ�‰�g˜u dÐ+Õ,ð-ð €Lr/   c                 ót  — g }t        j                  d| t         j                  «      }|s|S |j                  d«      }|j	                  dd«      j	                  dd«      }t        j
                  d|t         j                  «      D ]±  }|j                  d«      t        |j                  d«      «      }}|sŒ1|j                  d	«      r%t        j                  j                  t        |«      }n8|j                  d
«      r%t        j                  j                  t        |«      }n|}|j                  ||f«       Œ³ |S )u3   ä»Ž JS å�˜é‡� hasFJ æ��å�–é™„ä»¶ [(abs_url, title)]zvar hasFJ = '(.*?)';r
   z\'ú'z\"ú"z <a href="([^"]+)"[^>]*>(.*?)</a>r   r3   ú/)r*   r=   r7   r8   r)   r6   r.   Ú
startswithr9   r:   r;   r4   ÚBASE_URLr>   )r@   ÚattsrB   ÚblockÚamrC   ÚtxtrF   s           r"   Úextract_hasfjrT   m   sõ   € à€DÜ
�	‰	Ð)¨9´b·d±dÓ;€AÙØˆØ�G‰G�A‹J€Eà�M‰M˜% Ó%×-Ñ-¨e°SÓ9€EÜ�k‰kÐ=¸uÄbÇdÁdÓKò 
$ˆØ—H‘H˜Q“K¤¨R¯X©X°a«[Ó!9ˆcˆÙØØ�?‰?˜4Ô Ü—l‘l×*Ñ*¬8°TÓ:‰GØ�_‰_˜SÔ!Ü—l‘l×*Ñ*¬8°TÓ:‰GàˆGØ�‰�W˜c�NÕ#ð
$ð €Kr/   c                 ó6  — t        | «      }|€dddg fS |j                  }t        |d«      }t        j                  d|«      }|rt        |j                  d«      «      nd}|s.|j                  dd¬«      }|rt        |j                  «       «      }t        j                  d	|«      }|r|j                  d«      nd}|s+t        j                  d
|«      }	|	r|	j                  d«      nd}|j                  dd¬«      }
|
s<|j                  d«      D ](  }|j                  d«      xs g }d|v sŒd|v sd|v sŒ&|}
 n |
s|j                  dd¬«      }
t        |«      }|
r)|
j                  d„ ¬«      D ]  }|j                  «        Œ n|j                  d«      }
|||
|fS )u6   è¯¦æƒ…é¡µ: è¿”å›ž (title, pubdate, zoom_soup, fj_atts)Nzhtml.parserz+<meta name="ArticleTitle" content="([^"]*)"r
   r   ÚdivrD   )Úclass_z1<meta name="PubDate" content="(\d{4}-\d{2}-\d{2})u%   å�‘å¸ƒæ—¥æœŸï¼š\s*(\d{4}-\d{2}-\d{2})Útrs_editor_viewÚclassÚTRS_UEDITORÚviewÚzoom)Úidc                 ó"   — t        | t        «      S )N)Ú
isinstancer   )Úss    r"   ú<lambda>zparse_detail.<locals>.<lambda>¢   s   € ´
¸1¼gÓ0F€ r/   )Ústring)r#   r5   r   r*   r=   r.   r8   ÚfindÚget_textÚfind_allr   rT   ÚextractÚnew_tag)r   r!   r@   ÚsoupÚtmrD   ÚtdivÚdmÚpubdateÚdm2r\   ÚdÚclsÚfj_attsÚcs                  r"   Úparse_detailrr   „   s�  € ä�‹€AØ€yØ�T˜4 Ð#Ð#Ø—‘€IÜ˜ MÓ2€DÜ	�‰ÐAÀ9Ó	M€BÙ(*ŒK˜Ÿ™ ›Ô$°€EÙØ�y‰y˜ wˆyÓ/ˆÙÜ §¡£Ó0ˆEÜ	�‰ÐGÈÓ	S€BÙˆb�h‰h�qŒk R€GÙÜ�i‰iÐ@À)ÓLˆÙ"%�#—)‘)˜A”,¨2ˆØ�9‰9�UÐ#4ˆ9Ó5€DÙà—‘˜uÓ%ò 	ˆAØ—%‘%˜“.Ò& BˆCØ Ò#¨°3©Ð:KÈsÒ:RØ�Ùð		ñ
 Ø�y‰y˜ 6ˆyÓ*ˆÜ˜IÓ&€GÙØ—‘Ñ&F�ÓGò 	ˆAØ�I‰I�Kñ	ð �|‰|˜EÓ"ˆØ�'˜4 Ð(Ð(r/   c                 óÎ  — | €ddg fS | j                  g d¢«      D ]  }|j                  «        Œ t        | j                  d«      «      }g }| j                  dd¬«      D ]Ø  }|d   j	                  «       }|j                  d	«      r(t        j                  j                  t        |«      |d<   n8|j                  d
«      r't        j                  j                  t        |«      |d<   |j                  «       j                  d«      sŒ§t        |j                  «       «      }|sŒÃ|j                  |d   |f«       ŒÚ | j                  dd¬«      D ]‡  }|d   j	                  «       }	|	j                  d	«      r(t        j                  j                  t        |	«      |d<   ŒO|	j                  d
«      sŒat        j                  j                  t        |	«      |d<   Œ‰ t!        | «      }
|
||fS )Nr   F)ÚscriptÚstyleÚiframeÚobjectÚtableÚaT)rC   rC   r3   rM   )z.pdfz.docz.docxz.xlsz.xlsxz.zipz.rarÚimg)Úsrcr{   )re   Ú	decomposeÚboolrc   r,   rN   r9   r:   r;   r4   rO   ÚlowerÚendswithr.   rd   r>   Ústr)Ú	zoom_souprF   ÚtagÚ	has_tableÚattachmentsry   ÚhrS   rz   r`   Úcontents              r"   Úhtml_to_textr‡   ª   s¡  € ØÐØ�5˜"ˆ}ÐØ×!Ñ!Ò"IÓJò ˆØ�‰�ðä�Y—^‘^ GÓ,Ó-€IØ€KØ×Ñ ¨$ÐÓ/ò 	5ˆØˆf‰I�O‰OÓˆØ�<‰<˜ÔÜŸ™×,Ñ,¬X°qÓ9ˆAˆfŠIØ�\‰\˜#ÔÜŸ™×,Ñ,¬X°qÓ9ˆAˆf‰IØ�7‰7‹9×ÑÐXÕYÜ˜aŸj™j›lÓ+ˆCÚØ×"Ñ" A f¡I¨sÐ#3Õ4ð	5ð ×!Ñ! %¨TÐ!Ó2ò ;ˆØ�‰J×ÑÓˆØ�<‰<˜ÔÜŸ™×-Ñ-¬h¸Ó:ˆC�ŠJØ�\‰\˜#ÕÜŸ™×-Ñ-¬h¸Ó:ˆC�ŠJð;ô �)‹n€GØ�I˜{Ð*Ð*r/   c                 óš   — |s| S | j                  «       r| gng }|D ]  \  }}|j                  d|› d|› d�«       Œ dj                  |«      S )Nz<p><a href="z" target="_blank">z</a></p>z

)r,   r>   Újoin)r†   r„   ÚpartsrF   rS   s        r"   Úappend_attachmentsr‹   Å   s[   € ÙØˆØ Ÿ™œˆW‰I¨b€EØ#ò N‰ˆ�Ø�‰�| G 9Ð,>¸s¸eÀ8ÐLÕMðNà�;‰;�uÓÐr/   c                 ó°   — 	 | j                  dt        f«      }|j                  «       D �ch c]  }|d   ’Œ	 c}S c c}w # t        $ r t	        «       cY S w xY w)Nz.SELECT page_url FROM gov_raw WHERE site_name=?r   )ÚexecuteÚ	SITE_NAMEÚfetchallr   Úset)ÚconnÚcurÚrows      r"   Úload_existing_urlsr”   Î   sN   € ðØ�l‰lÐKÌiÈ\ÓZˆØ"%§,¡,£.Ö1˜3��A“Ò1Ð1ùÒ1øÜò Ü‹uŠðús   ‚)? «:·? º? ¿AÁAc                 óž  — | j                  d|t        f«      }|j                  «       ry	 d}	 ddlm}  ||«      }| j                  d|||||t        t        t        ||f
«      }|j                  dkD  ryt        j                  dd|«      }	t        j                  |	«      }	t        j                  d	d
|	«      j                  «       d d }	| j                  d|j                  |t        |	f«       yy# t
        $ r Y Œ¼w xY w# t        j                   $ r=}
dt#        |
«      v r*t%        j&                  d«       t)        | |||||«      cY d }
~
S ‚ d }
~
ww xY w)Nz7SELECT id FROM gov_raw WHERE page_url=? AND site_name=?FÚotherr   )Úclassify_industryz¨INSERT OR IGNORE INTO gov_raw (page_url, source_url, title, content, publish_date, site_name, group_name, script_name, has_table, industry) VALUES (?,?,?,?,?,?,?,?,?,?)ú<[^>]+>r   r%   r&   r   zTINSERT OR IGNORE INTO gov_search (rowid, title, site_name, summary) VALUES (?,?,?,?)TÚlockedr2   )r�   rŽ   ÚfetchoneÚcrawler_libr—   r   Ú
GROUP_NAMEÚSCRIPT_NAMEÚrowcountr*   r+   r'   r(   r,   Ú	lastrowidÚsqlite3ÚOperationalErrorr€   r   r   Ústore_record)r‘   r   rD   r†   rE   rƒ   r’   Úindustryr—   ÚsummaryÚes              r"   r¢   r¢   Ö   sF  € Ø
�,‰,ÐPÐSVÔXaÐRbÓ
c€CØ
‡|�|„~ØðØˆð	Ý5Ù(¨Ó/ˆHð �l‰lð+ð �#�u˜g t¬Y¼
ÄKÐQZÐ\dÐeó	
ˆð �<‰<˜!ÒÜ—f‘f˜Z¨¨WÓ5ˆGÜ×'Ñ'¨Ó0ˆGÜ—f‘f˜V S¨'Ó2×8Ñ8Ó:¸4¸CÐ@ˆGØ�L‰LØfØ—‘ ¤y°'Ð:ôð Øøô# ò 	Ùð	ûô$ ×#Ñ#ò Ø”s˜1“vÑÜ�J‰J�qŒMÜ  c¨5°'¸4ÀÓKÕKØûð	úsF   «C< ®C- ¼B/C< Ã-	C9Ã6C< Ã8C9Ã9C< Ã<EÄ1EÅ EÅEÅEc                  ó$  — d } t         sbt        j                  t        d¬«      } | j	                  d«       | j	                  d«       t        | «      }t        dt        |«      › d�d¬«       d	}d	}g }t        d
t        d
z   «      D �]Õ  }t        |«      }t        d|› dt        |«      › �d¬«       |st        dd¬«        �nœ|D �]“  \  }}}	t         s
|v r|d
z  }Œt        |«      \  }
}}}|€t        d|d d › d|› �d¬«       |d
z  }ŒF|
s|}
|s|	}t        ||«      \  }}}||z   }t        «       }g }|D ].  \  }}||v rŒ|j                  |«       |j                  ||f«       Œ0 t!        ||«      }t        t#        j$                  dd|«      j'                  «       «      }|dk  r#d|vr|st        d|
d d › d|› �d¬«       |d
z  }�Œt         rD|j                  ||
|||t(        t*        t,        dœ«       t        d|
d d › d|› d�d¬«       |d
z  }�ŒNt/        | ||
|||«      }|r/|d
z  }j                  |«       t        d|
d d › d|› d�d¬«       �Œ�|d
z  }�Œ– �ŒØ t         rmt1        t         dd¬«      5 }|D ]+  }|j3                  t5        j6                  |d¬«      d z   «       Œ- 	 d d d «       t        d!t         › dt        |«      › d"�d¬«       | � | j9                  «        | j;                  «        t        d#|› d$|› �d¬«       y # 1 sw Y   Œ`xY w)%Né<   )r   zPRAGMA busy_timeout=60000zPRAGMA journal_mode=WALu
   å·²å…¥åº“ u    æ�¡, ç”¨äºŽåˆ—è¡¨çº§é¢„æŸ¥é‡�T)Úflushr   r
   z[list] page=z items=zEmpty page, stop paginationz  skip empty: é   z | r˜   r   é
   z<img)Úpage_urlrD   r†   Úpublish_daterƒ   Ú	site_nameÚ
group_nameÚscript_namez
  JSONL + é(   z (ú)z  + Úwr   )r   F)Úensure_asciiú
zJSONL written: z rows)z[done] new=z skip=)r   r    Úconnectr   r�   r”   ÚprintÚlenr   Ú_PAGESrI   rr   r‡   r�   Úaddr>   r‹   r*   r+   r,   rŽ   rœ   r�   r¢   ÚopenÚwriteÚjsonÚdumpsÚcommitÚclose)r‘   ÚexistingÚ	new_countÚ
skip_countÚ
jsonl_rowsr?   rA   rF   rD   rE   ÚdtitleÚddater\   Úfjr†   rƒ   rP   Úall_attsÚseenÚuniqÚur-   Ú	plain_lenÚokÚfr“   s                             r"   ÚmainrÎ   ø   sO  € Ø€DÝÜ�‰œw°Ô3ˆØ�‰Ð0Ô1Ø�‰Ð.Ô/Ü% dÓ+ˆÜ�
œ3˜x›=˜/Ð)GÐHÐPTÕUà€IØ€JØ€Jä�aœ !™Ó$ó 2 ˆÜ˜4Ó ˆÜ�˜T˜F '¬#¨e«*¨Ð6¸dÕCÙÜÐ/°tÕ<ÚØ$)ó ,	 Ñ ˆG�U˜DÝ '¨XÑ"5Ø˜a‘�
ØÜ&2°7Ó&;Ñ#ˆF�E˜4 Øˆ|Ü˜ u¨S¨b z l°#°g°YÐ?ÀtÕLØ˜a‘�
ØÙØ�ÙØ�Ü'3°D¸'Ó'BÑ$ˆG�Y Ø˜b‘yˆHÜ“5ˆDØˆDØ ò $‘��1Ø˜‘9ØØ—‘˜”Ø—‘˜Q ˜FÕ#ð	$ô
 )¨°$Ó7ˆGÜœBŸF™F :¨r°7Ó;×AÑAÓCÓDˆIØ˜2Š~ &°Ñ"7ÁÜ˜ v¨c¨r { m°3°w°iÐ@ÈÕMØ˜a‘�
ÙÝØ×!Ñ!Ø '°&ÀWØ$)¸	Ü!*¼*Ü#.ñ	#ô ô ˜
 6¨#¨2 ; -¨r°%°¸Ð:À$ÕGØ˜Q‘�	ÙÜ˜d G¨V°W¸eÀYÓOˆBÙØ˜Q‘�	Ø—‘˜WÔ%Ü˜˜V C R˜[˜M¨¨E¨7°!Ð4¸D×Aà˜a‘’
òY,	 ð2 õh Ü”*˜c¨GÔ4ð 	D¸Ø!ò D�Ø—‘œŸ
™
 3°UÔ;¸dÑBÕCñD÷	Dô 	�¤
˜|¨2¬c°*«oÐ->¸fÐEÈTÕRàÐØ�‰ŒØ�
‰
ŒÜ	ˆK˜	�{ &¨¨Ð
5¸TÖB÷	Dð 	Dús   É51LÌLÚ__main__)r2   r©   )2Ú__doc__ÚsysÚosr*   r   Úhtmlr'   Úurllib.parser9   r    r¼   r   Úbs4r   r   rO   r4   rŽ   rœ   r�   Úenvironr   r   r   ÚENCr   r   r   Ú
_MAX_PAGESÚ	enumerateÚargvr    ry   rN   Úintr<   Ú
ValueErrorr·   r¸   r#   r.   rI   rT   rr   r‡   r‹   r”   r¢   rÎ   Ú__name__© r/   r"   ú<module>rß      s�  ðñó Û 	Û 	Û Û Û Û Û ã ß &ð (€ØÐ'Ñ'€Ø$€	Ø€
Ø&€Ø
�*‰*�.‰.˜Ð$5Ó
6€Ø�Z‰Z�^‰^˜L¨"Ó-€
Ø€ð @ØOØ'ñ€ð Ð Ø€	à€
Ù�c—h‘hÓò 
�D€A€qØ‡|�|�JÔð	Ù˜QŸW™W S¨!›_¨QÑ/Ó0‰Jð 
ˆi‹˜A ™E¡C¨¯©£MÓ1ð	Ù˜SŸX™X a¨!¡e™_Ó-‰Jð
ð " Q’‰¨A€óò$òò0ò.#)òL+ò6òòòDJCðZ ˆzÒÙ…Fð øðk ò 	Ùð	ûð
 ò 	Ùð	ús$   Â,D8Ã(EÄ8E Ä?E ÅEÅ
E