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

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

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

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

スクレイピング

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

Google Apps Script

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

Q&A

解決済

1回答

3145閲覧

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

majin

総合スコア11

Cookie

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

スクレイピング

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

Google Apps Script

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

0グッド

1クリップ

投稿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/******************************関数群******************************/

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

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

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

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

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

guest

回答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

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問