質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1011閲覧

pythonで一定間隔でメイン分とは別の処理を行いたい。

yamage

総合スコア12

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/05/23 09:16

編集2019/05/23 09:18

前提・実現したいこと

どうも。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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

次回実行の時間を変数に入れといて、メインループの中でその時間をチェック、
時間到達してなければ何もしない
時間到達していれば保存実行して、その変数に次回実行時間を入れる、

でいいんじゃないでしょうか。

投稿2019/05/23 11:24

y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamage

2019/05/24 01:28

now = time.time()#現在時間の取得 if(now - past > 180): newbook.save('抽出データ.xlsx') print("saved") past = now を挟むことで解決しました。y_waiwaiさん、ご提案ありがとうございました。助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問