前提・実現したいこと
事前に取得したhtml(40万程度)からそれぞれbodyを取得し、分かち書きして保存したい。
発生している問題・エラーメッセージ
プログラムにおいて、メモリーが徐々に溜まっていき、インスタンスがダウンしてしまう。
メモリー蓄積を防ぎたい。
しかし、どこが原因かがわからない。
該当のソースコード
Python3
1import bs4 2import MeCab 3import concurrent.futures 4import glob 5import sys 6import os 7import gzip 8m = MeCab.Tagger('-Owakati') 9 10def _htmlbow(inputs): 11 each, i, url = inputs 12 print(inputs) 13 14 #既に取っているものはスキップ 15 if os.path.exists('%s/%s'%(each,url.replace("./gzhtml/","") )): 16 print("already scraped %s"%url) 17 return 18 19 #スクレイピングしてgzで保存 20 try: 21 with gzip.open(url,"rt") as f: 22 html = f.read() 23 #Bodyの取得 24 soup = bs4.BeautifulSoup(html, 'html5lib') 25 [s.extract() for s in soup(['style', 'script', '[document]', 'head', 'title'])] 26 text = soup.getText() 27 #分かち書きして保存 28 wakati = m.parse(text).strip() 29 with gzip.open('%s/%s'%(each, url.replace("./gzhtml","")), 'wt') as f: 30 f.write('{wakati}'.format(wakati=wakati)) 31 print('finished %d '%(i)) 32 33 #取得できない場合は失敗リストに保存 34 except Exception as e: 35 with open("failed_scraping.txt","a") as f: 36 f.write('{url}\n'.format(url=url.replace("./gzhtml/",""))) 37 print('failed %d '%(i)) 38 39 40def htmlbow(): 41 #htmlリストを読み込み、インデックスを振る 42 urls = [] 43 for i,ents in enumerate(glob.glob("./gzhtml/*")): 44 urls.append(["bow",i,ents]) 45 print('load finished') 46 #分散処理 47 with concurrent.futures.ProcessPoolExecutor(max_workers = 992) as executor: 48 executor.map(_htmlbow, urls) 49 50 51"""htmlbow""" 52if '--htmlbow' in sys.argv: 53 htmlbow()
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/20 13:09
2018/02/20 13:47
2018/02/21 02:39