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

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

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

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

4925閲覧

PythonでスクレイピングしたデータをGoogleスプレッドシートに保存したい

hitohito.pitcha

総合スコア64

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

3クリップ

投稿2019/01/26 12:46

やりたいこと

特定キーワードのGoogle検索結果を定点観測したい(競合の広告文、順位の変動など)。

イメージ例)
1 タイトルAAA aaa.com
2 タイトルBBB bbb.com
3 タイトルCCC ccc.com
4 タイトルDDD ddd.com

条件
・上記結果を計測ツールの兼ね合い上、Googleスプレッドシートに書き込みたい
・特定キーワードは100近くあり、毎日計測してデータとして残したい

相談内容

PythonのライブラリBeautifulSoupを使い、
スクレイピングするところまでは成功しましたが、
スプレッドシートに書き込む方法で悩んでいます。

Google APIを有効化して、ライブラリgspreadを使い、
直接書き込むことは出来ましたが、処理時間がかかり、
APIの使用条件に抵触するのではないかと懸念しています。

ちなみに、コードは以下です。

import gspread from oauth2client.service_account import ServiceAccountCredentials scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive'] credentials = ServiceAccountCredentials.from_json_keyfile_name('<jsonファイル名>', scope) gc = gspread.authorize(credentials) wb = gc.open("<スプレッドファイル名>") sh = wb.worksheet("<スプレッドシート名>") for i in range(0,len(lists)): # lists はスクレイピングしたデータ # 例) #[['日付', 順位1, 'タイトル', 'URL1'], # ['日付', 順位2, 'タイトル', 'URL2']] sh.update_cell(i+1,1,lists[i][0]) sh.update_cell(i+1,2,lists[i][1]) sh.update_cell(i+1,3,lists[i][2]) sh.update_cell(i+1,4,lists[i][3])

別案としては、Python経由でスプレッドシートに書き込みはしないで、
一度CSVに保存をさせて、Google Apps Script で保存したCSVを
スプレッドシードに書き込むなども考えています。

本状況において、ご助言いただけると幸いです。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

CSVにするのと原理的にはおなじなんですが、要はループで一回ずつ書き込むとどうしても遅くなりますよね。

なので、Rangeを取得して(worksheet.range('A1:D8')とか)、これをforで回してworksheet.update_cellsで一気に書き込むのがよいのでは?

投稿2019/01/27 00:36

papinianus

総合スコア12705

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

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

hitohito.pitcha

2019/01/27 06:01

的確なアドバイスありがとうございます! 実現したいことに近づきました。 以下コードを実行してイメージ通りの一括更新が出来ました。 a = 0 b = 0 cell_list = sh.range('A1:D8') for cell in cell_list: cell.value = lists[a][b] if b == 3: b = 0 a += 1 else: b += 1 if a == len(lists)-1: break sh.update_cells(cell_list) 次の問題として、定期的に書き込みを行いたい兼ね合い上、 2回目以降の貼り付けが、シートに追加されている末尾データから追加を行いたいです。 列数に変わりはないですが、検索結果の行数、スプレッドシート内の行数は変動します。 len 関数で対象列数を把握できるイメージは出来たのですが、 range で範囲を指定しているため、本箇所を変数などで置き換えることが出来ませんでした。 本状況について、ご助言いただけると助かります。 私は プログラミング、Pythonも 初心者(3ヶ月 独学程度)になり、 質問回答は本当に助かっています。 何卒よろしくお願い致します。
papinianus

2019/01/27 06:43

rangeは開始行、開始列、終了行、終了列を数値指定できるので、A1:D8はrange(1,1,8,4)などとできます。行はrow_countで取れるので、開始行をrow_cnt + 1などとすれば繰り下げ可能です。 また、更新がなく追加のみならworksheet.append_rowを使うのも一つだと思います。
hitohito.pitcha

2019/01/27 08:03

以下コードで実現できました。 ご教授いただき、ありがとうございました! values_list = sh.col_values(1) x = len(values_list) y = len(lists)+1 a = 0 b = 0 cell_list = sh.range(x+1,1,y+x,6) for cell in cell_list: cell.value = lists[a][b] if b == 5: b = 0 a += 1 else: b += 1 if a == len(lists): break sh.update_cells(cell_list)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問