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

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

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

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

Q&A

解決済

1回答

2456閲覧

GASで変数への入力がタイムアウトする

runbird

総合スコア1

Google Apps Script

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

0グッド

0クリップ

投稿2022/12/24 15:14

編集2022/12/25 01:31

前提

GoogleAppsScriptでサイトのデータを取得しスプレッドシートに入れたいと思っています。
Parserを利用しています。

実現したいこと

  • 取得した文字列を変数に入れたい

発生している問題・エラーメッセージ

問題の個所を取得しようとすると時間がかかりタイムアウトしてしまいます。 問題とみられる個所 let MODnote = Parser.data(contentText).from('<div class="character">').to('</div>').build(); エラーメッセージ 関数の実行がタイムアウトしました。デバッグを続行するには、デバッガを再起動してください。

該当のソースコード

GoogleAppsScript

1function myFunction() { 2 3//シートを取得 4const sheet = SpreadsheetApp.getActiveSheet(); 5 6 console.log(sheet.getName()); 7 8//最終行を取得 9 const lastRow = sheet.getLastRow(); 10 11//セルのURLを取得 12 const URLlist = sheet.getRange(8,3,lastRow-8).getValues(); 13 14//配列を作成 15let menu = []; 16 17 18URLlist.forEach(function(value,index){ 19 20 let recipesList = Scraping(value,index); 21 console.log(recipesList); 22 23 }) 24 25} 26 27function Scraping(url,index) { 28 29 console.log(url); 30 31 const contentText = UrlFetchApp.fetch(url).getContentText('utf-8'); 32 33 try{ 34 35 let MODTitle = Parser.data(contentText).from('</span>').to('<small>').build().replace("&nbsp;",''); 36 37 let MODnote = Parser.data(contentText).from('<div class="character">').to('</div>').build(); 38 39 return [MODTitle,MODnote]; 40 41}catch (e) { 42 43 console.log((index+1)+"回目の処理でエラーになりました"); 44 45 } 46 47}

試したこと

[gas parser]等のキーワードで30件程度調べましたが解決できませんでした。
from to の取得する場所を変更した所、短い文章であれば取得できました。
多少長くなると途端に取得できなくなります。

試したことというより考えていることなのですが、
改行・空行を含めた複数の文章を取得するのが無理なのでしょうか。

補足情報(FW/ツールのバージョンなど)

ブラウザ
クローム(バージョン: 108.0.5359.125(Official Build) (64 ビット))

プログラムの参考にしたサイト
https://tetsuooo.net/gas/592/

取得したいサイト
https://rimworld.2game.info/detail.php?id=708455313

取得したい文章
すでに作成した部屋などの構造を設計図化(Blueprints)し迅速な建築計画が可能となります。

使用方法
アーキテクトメニューの設計図から新規作成を選び、設計図化したい既存の構造物をドラッグで選択します。設計図の名前を入力しOKを押すと、その名前で設計図が作成されます。
次回、同様の構造物を建築する際は、アーキテクトの設計図から作成された設計図を選択する事で迅速に建築計画が立てられるようになります。

作成済みの設計図はE、Qで回転させる事が可能です。
作成に必要な総資源コストも表示されます。
又、設計図を右クリックする事でリネーム、削除、書き出しが可能です。
書き出した設計図はセーブデータが保存されているディレクトリと同様の箇所にBlueprintsというフォルダにXMLで書き出されます。これらは新規作成ボタンを右クリックする事で読み込む事が可能な為、セーブ間でも使用可能です。又、ディレクトリのファイルを保存しておけば再インストールした際にも使用できます。

※セーブ間で使用し、MODオブジェクトなどで利用できない項目が存在している場合、エラーがポップし問題のあるオブジェクトが設計図から削除されます。

画像
URL確認と問題の個所の手前
ブレークポイントを待機しています

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/12/25 02:16 編集

・[投稿2022/12/25 00:14 時点の内容に対するコメント] 自分の環境(windows Edgeブラウザ上のGAS)では特に問題なく取得できました。 function Scraping(url,index) { の直後に console.log(url); を入れて、本当に対象のurlを取得しようとしたときにタイムアウトしているのか確認してみて下さい。
runbird

2022/12/25 02:08

ご確認いただきありがとうございます。 自分の説明不足がありました。申し訳ありません。 いくつかconsole.logを入れていましたが可読性向上のため質問のコードからは削除していました。 何回かデバッグしておりurl取得(12.31行目)には問題ないと認識しています。 "let MODnote"の実行個所(37行目)でタイムアウトしている事を確認しています。 画像を質問に追加しましたので参考にご確認ください。
退会済みユーザー

退会済みユーザー

2022/12/25 02:18 編集

URLは正常に取得できているようですね。 自分の環境では(通常実行では)やはり質問者さんの状況を再現できませんでした。 質問者さんの環境だけでこの事象が起きている原因として下記の可能性があります。 ・ネットワークの問題(帯域がひっ迫している等) ・取得したいサイトが、質問者さんのIPをBAN扱いにし、GASによるリクエストに対して故意に正常なレスポンスを返していない。(GASは特殊なヘッダを付けてリクエストするので、PCからブラウザで閲覧することが可能であっても、そのPC(同じIP)の「GASからのリクエストだけ」弾く、といったことは原理的に可能です。特定IPの、GASからのリクエストが、ブラウザと異なる不自然なリクエストであると判断され、そのリクエストを何回も繰り返していると、スクレイピングを嫌うサイトによっては対策としてBANする場合があります) 私も何回かGASから実行していたらBANされるかもしれません。 (時間を空けて累計10回くらいやっていますが今のところBANされている気配はありません) ・Parserライブラリに URLを配列形式を渡しているのが気になりましたが、自分の環境でも配列形式で渡して問題なく取得できているので、これは該当しないと思います。 気になる場合は、 const contentText = UrlFetchApp.fetch(url).getContentText('utf-8'); を const contentText = UrlFetchApp.fetch(url[0]).getContentText('utf-8'); としてみてください。 (結果は変わらない可能性が高いですが) -------------- なお、自分の環境でも下記の状況に限り、実行がそれ以上進まない現象を再現することはできました。 「let ModNote」の行にブレークポイントを入れる →デバッグ実行で実行し、ブレークポイントで止まった場所で「ステップオーバー」ボタンを押す。 →それ以上進まなくなる ※デバッグではなく通常実行の場合は上記と同様に問題なく取得できました。 また、デバッグ実行であっても「ステップオーバー」で1つずつ進めるのではなく「再開」ボタンで実行を再開した場合でも問題なく取得できました。
guest

回答1

0

自己解決

解決しました。
qnoir様のコメントを受け12/25 11時頃に再度実行した所おそらく問題なく文字列を取得できました。
12/23日頃からスクレイピングを始め35行目の実装で300件ほどのリクエストを繰り返していました。
そのため一時的にBANされた可能性が高いと考えています。

言い訳になってしまいますが、当該サイトの利用規約は事前に確認していました。
スクレイピング等の行為を禁止する規約は確認できませんでした。
しかしながら、過剰に負荷をかけた可能性がありご迷惑をかけたかもしれません。

今後、テスト段階では5件ほどのリクエストで挙動を確認したいと思います。

12/25 12:12 追記
ただ、"let MODTitle"(35行目)は正常に実行できていました。
他の原因があるかもしれません。

投稿2022/12/25 03:05

編集2022/12/25 03:12
runbird

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問