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

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

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

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Google Apps Script

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

解決済

GASを使ってFANZAサイトのスクレイピングをしたい(年齢認証を突破したい)

majin
majin

総合スコア11

Cookie

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Google Apps Script

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

1回答

0グッド

1クリップ

466閲覧

投稿2022/12/02 11:26

編集2022/12/02 11:29

前提

多少プログラムの知識があるものの、そこまで詳しくないのでトンチキなことを行っている可能性があります。
ご助言頂けますと幸いです。

実現したいこと

GASを使用して、FANZA(DMM)のGAMEランキングを定時取得し、
パースしてランキングをスプレッドシートに記録していきたい。
※Parserライブラリを使用。

対象は下記2URL
FANZA(R18) https://games.dmm.co.jp/list/pc?sort=popular
DMM(一般) https://games.dmm.com/list/pc?sort=popular

DMMのランキングはすでに取得できており、
スプレッドシートへの書き込み、定時実行は確認済み。

下記でPHPで同じようなことをしており、それを参考にFANZA版の方も組んでいたがうまくいかず。。。
https://xn--f6q12aj29i.com/adult-affiliate/fanza-scraping-agecheck/#toc1

Cookie中のage_check_doneという変数に1が立っていれば大丈夫っぽいのですが、
そもそもCookieの扱いがいまいちわからず頓挫しております。

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

FANZA版の年齢認証を突破できない。

該当のソースコード

GoogleAppScript(GAS)

1 2// 毎日FANZAのランキングを取ってきてくれるスクリプト 3 4function rankGet(){ 5 /******************************FANZAのランキングを取得******************************/ 6 var fanza_url = 'https://games.dmm.co.jp/list/pc?sort=popular'; 7 8 // 年齢認証を突破用 9 var options = { 10 'http' : { 11 method : 'GET', 12 headers : { 13 'Cookie' : 'age_check_done=1"' 14 } 15 } 16 }; 17 18 //URLにアクセスしてHTMLを取得 19 var responseDMM = UrlFetchApp.fetch(fanza_url,options); 20 21 //URLにアクセスしてHTMLを取得 22 var responseTextFZ = responseDMM.getContentText(); 23 24 // htmlを受け取ってjsonをパースしてリストにして返す。 25 var dataListFZ = jsonParse(responseTextFZ); 26 27 // スプレッドシートに書き込み 0:FANZA 1:DMM 2:テスト 28 writeSp(dataListFZ,0); 29 30 /***DMMのランキングを取得***/ 31 //URLを指定 32 var dmm_url = 'https://games.dmm.com/list/pc?sort=popular'; 33 34 //URLにアクセスしてHTMLを取得 35 var responseDMM = UrlFetchApp.fetch(dmm_url); 36 37 //レスポンスを文字列として取得 38 var responseTextDMM = responseDMM.getContentText(); 39 //Parserを使ってjson部分抜き出し 40 jsonString = Parser.data(responseTextDMM).from('<script id="__NEXT_DATA__" type="application\/json">').to('</script>').build(); 41 42 // htmlを受け取ってjsonをパースしてリストにして返す。 43 var dataListDMM = jsonParse(jsonString); 44 45 // スプレッドシートに書き込み 0:FANZA 1:DMM 2:テスト 46 writeSp(dataListDMM,1); 47} 48 49 50/******************************関数群******************************/ 51// 受け渡したhtmlデータからjsonを抜き出してリスト化して戻す。 52function jsonParse(jsonString){ 53 //jsonをパース 54 var jsonData = JSON.parse(jsonString); 55 56 //取得したjsonのリスト部分を抜き出し 57 var rankList = jsonData.props.pageProps.__APOLLO_STATE__; 58 59 // 日付データ準備 60 var now = new Date(); 61 var today = new Date(now.getFullYear(), now.getMonth(), now.getDate()); 62 var date = Utilities.formatDate( today, 'Asia/Tokyo', 'yyyy/MM/dd'); 63 64 //書き込み用データ準備 65 var dataList = [] 66 var count = 1; 67 68 //rankListの内容を出力 69 for (var i in rankList){ 70 // typeがGameのもののみ抜き出す。 71 if(rankList[i]['__typename'] === 'Game'){ 72 73 /* 取れるデータ 74 "Game:636533-social": { 75 "__typename": "Game", 76 "id": "636533-social", 77 "gameId": "636533", 78 "name": "ミストトレインガールズ〜霧の世界の車窓から〜 X", 79 "description": "少女たちと幻霧に挑むファンタジーRPG", 80 "thumbnail": "https://pics.dmm.co.jp/freegame/app/636533/200.gif", 81 "genre": "RPG", 82 "type": "BROWSER", 83 "newRelease": false, 84 "link": "https://games.dmm.co.jp/detail/MistTrainGirlsX/", 85 "idHash": "43fa4d51f4288617f2257ab68643bd589b987be1daad84a62909f57b39dc1b55", 86 "device": "PC" 87 }, 88 */ 89 90 // パースしたデータを格納 91 var res = [ 92 date, 93 count, 94 rankList[i]['gameId'], 95 rankList[i]['name'], 96 rankList[i]['genre'], 97 rankList[i]['type'], 98 rankList[i]['newRelease'] 99 ] 100 // ログ出力 101 Logger.log(res); 102 103 // 出力に連結 104 dataList.push(res) 105 106 // ランキングカウントを+1 107 count+=1; 108 } 109 } 110 // リザルトを戻す 111 return dataList; 112} 113 114// 配列をもらって、スプレッドシートに書き込む。 115function writeSp(dataList,sheet_no){ 116 //書き込みたいスプレッドシートのID 117 var id = "◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆"; 118 // IDからスプレッドシートを取得 119 var spreadsheet = SpreadsheetApp.openById(id); 120 // 最初のシートを取得(今回はシート1) 121 var sheet = spreadsheet.getSheets()[sheet_no]; 122 123 // 書き込み範囲を作成 124 var startRow = sheet.getLastRow()+1; // 最終行を取得 125 var row = dataList.length; // データ数を取得 126 var col = dataList[0].length; // データ列数を取得 127 128 // 書き込み範囲を指定 129 var addRange = sheet.getRange(startRow, 1, row, col); 130 131 // 一括書き込み 132 addRange.setValues(dataList); 133 134 // 一括書き込みの参考 135 // https://tetsuooo.net/gas/1107/# 136} 137/******************************関数群******************************/

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

0

自己解決

最適解ではないかもしれませんが、自己解決したので追記。
年齢認証ページに一度アクセスしてCookieを取得、取得したCookieに年齢認証チェック済み情報を追記。
その情報を持って改めてランキングページにアクセス。

Google

1 //認証突破用に一度アクセスする。 2 var age_check_url = 'https://www.dmm.co.jp/age_check/=/declared=yes/?rurl=https%3A%2F%2Fgames.dmm.co.jp%2Flist%2Fpc'; 3 4 //URLにアクセスしてCookieを取得 5 var cookies = UrlFetchApp.fetch(age_check_url).getHeaders()["Set-Cookie"]; 6 // 年齢認証用にCookieを追加 7 cookies = cookies.concat("; age_check_done=1") 8 // セット 9 var headers = { Cookie: cookies }; 10 11 //欲しいデータのページへ遷移 12 var fanza_url = 'https://games.dmm.co.jp/list/pc?sort=popular'; 13 14 // 必要情報準備準備 15 var get_options = { 16 method: "get", 17 headers: headers, 18 followRedirects: true, 19 }; 20 21 //FANZAランキングにアクセス 22 var responseFZ = UrlFetchApp.fetch(fanza_url,get_options); 23 24 //レスポンスを文字列として取得 25 var responseTextFZ = responseFZ.getContentText(); 26 //Parserを使ってjson部分抜き出し 27 var jsonString = Parser.data(responseTextFZ).from('<script id="__NEXT_DATA__" type="application\/json">').to('</script>').build(); 28 29 // htmlを受け取ってjsonをパースしてリストにして返す。 30 var dataListFZ = jsonParse(jsonString); 31 32 // スプレッドシートに書き込み 0:FANZA 1:DMM 2:テスト 33 writeSp(dataListFZ,0); 34 ///////////////////////// FANZAのランキングを取得

投稿2022/12/03 14:26

majin

総合スコア11

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Cookie

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Google Apps Script

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