前提・実現したいこと
どうも。python初心者のやまげと申します。
BeautifulSoup4でスクレイピングを行っています。
取得したデータをopenpyxlで作成したExcelに落とし込んでいるのですが
処理に長大な時間がかかるため、定期的に上書き保存をさせたいです。
具体的な問題
「newbook.save('抽出データ.xlsx')」
を一定間隔で実行する方法が知りたいです。
### import bs4 import requests import openpyxl import re import time import threading #データブック読み込み book = openpyxl.load_workbook('輸入車全国保有台数_20190403.xlsx') readsheet = book['全国保有台数_2017'] #新規ブックの作成 newbook = openpyxl.Workbook() ws1 = newbook.create_sheet("型式別情報") ws1.title = "型式別情報" r1 = 1 r2 = 1 #Googleに送信する偽装ユーザーエージェント UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0)" \ "Gecko/20100101" \ "Firefox/67.0 " #Google検索 google = 'https://www.google.co.jp/search?num=15&q=' for cell_obj in list(readsheet.columns)[1]: keyword = cell_obj.value print(google + str(keyword)) res_google = requests.get(google + str(keyword), headers={"User-Agent": UserAgent}) time.sleep(5) web_list = [] infolist=[] #Googleにリクエストを送信 bs4_google = bs4.BeautifulSoup(res_google.content, 'lxml') link_google = bs4_google.find_all(href = re.compile('goo-net')) for website in link_google: goonet = website.get('href').split('&sa=U&')[0].replace('/url?q=', '') if((not goonet in web_list) and (not 'webcache' in goonet)) and ('http' in goonet) : web_list.append(goonet) print(goonet) #goonetにリクエストを送信 carpage = bs4.BeautifulSoup(requests.get(goonet).content, 'lxml') time.sleep(1) #情報抽出前半 infoA = carpage.find_all(text=re.compile('基本スペック')) for i in infoA: tmp = re.split('[ ]',i) i = tmp ws1.cell(column=1, row=r1, value = keyword) ws1.cell(column=2, row=r1, value = i[0]) ws1.cell(column=3, row=r1, value = i[1]) tmp = i[2].split('(', 1)[0] ws1.cell(column=4, row=r1, value = tmp) r1 += 1 print(keyword,i[0],i[1],tmp) infoB = carpage.find_all('td', class_="glc01") for i in infoB: tmp = str(i) grade = re.split('[<>]',tmp) ws1.cell(column=5, row=r2, value = grade[4]) r2 += 1 print(grade[4]) newbook.save('抽出データ.xlsx')
試したこと
とりあえず見よう見まねでmain文の途中(新規ワークブックを作成したあたり)に彼をつっこんでみました。
import time import threading def saver(): newbook.save('抽出データ.xlsx') print("saved") time.sleep(8) def scheduler(interval, f, wait = True): base_time = time.time() next_time = 0 while True: t = threading.Thread(target = f) t.start() if wait: t.join() next_time = ((base_time - time.time()) % interval) or interval time.sleep(next_time) scheduler(180, saver, False)
180秒に1度savedが表示される悲しいプログラムの出来上がりです。全然わからん!(ジャガー)
「そもそもマルチスレッドとして動かしてないことが原因か?」
とかも考えたのですが、メイン文を関数化しようとして確かワークシート型は返り値として渡せないとかなんとかでエラーを吐きました。ちゅらみ。
保存プロセスだけ子プロセスで実行するようなコードとか...なんか上手い解決法があればぜひ皆様のご教授を賜りたい次第です。
補足情報(FW/ツールのバージョンなど)
環境:windows10 Home 64bit
実行環境(コンパイラ):Anaconda windows64bit版
開発環境(エディタ):Sublime Text3
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/24 01:28