先日あげたBOOTHからサムネを正規表現で自動取得してリストに貼り付けるやつの続きのようなもの。前回のそれは、URLからサムネを引っ張ってくるものだったが、どうせだったらURL自体を自動的に引っ張ってこれるようにならねえ? という発想の元、BOOTHの「3Dモデル」タグの新着順からURLだけを引っ張ってくるスクリプトを書きました。
ソースコード
とりあえずソース見せろという方へ。
function myFunction() {
var aBook = SpreadsheetApp.getActiveSpreadsheet();
var aSheet = aBook.getSheetByName("test")
var rownum = 1;
for (var j = 1; j <= 20; j++) {
var url = 'https://booth.pm/ja/browse/3D%E3%83%A2%E3%83%87%E3%83%AB?page=' + j +'&sort=new'
var response = UrlFetchApp.fetch(url);
var html = response.getContentText('utf-8');
for (var i = 1; i <= 20; i++) {
var hoge = html.match(/https:\/\/booth.pm\/ja\/items\/[0-9]+"\>[^<].*?<\/a?/g)[i-1];
var hoge = hoge.match(/(h.*?)"/)[1];
aSheet.getRange(rownum , 1).setValue(hoge);
rownum += 1;
}
}
}
解説
for (var j = 1; j <= 20; j++) {
var url = 'https://booth.pm/ja/browse/3D%E3%83%A2%E3%83%87%E3%83%AB?page=' + j +'&sort=new'
var response = UrlFetchApp.fetch(url);
var html = response.getContentText('utf-8');
新着ページは20件までしか表示されないので、まとまった量のURLを取得するにはページを2ページ目以降も順次取得していく必要があります。それぞれのページのURLはhttps://booth.pm/ja/browse/3D%E3%83%A2%E3%83%87%E3%83%AB?page=
+ 数字 + &sort=new
、が割り当てられているため、j
のイテレーションで取得していきます。
販売ページのURL取得
各ソースコードの中で、取得したいURLが上図の黄色マーカ部になります。https://booth.pm/ja/items/
+ 数字の連続 + > + モデル名 + 、という規則性があるので、それを正規表現で抜き出すようにします。
for (var i = 1; i <= 20; i++) {
var hoge = html.match(/https:\/\/booth.pm\/ja\/items\/[0-9]+"\>[^<].*?<\/a?/g)[i-1];
var hoge = hoge.match(/(h.*?)"/)[1];
aSheet.getRange(20*(j-1)+i , 1).setValue(hoge);
今回はmatch
と/~/
表記でいきなり正規表現を指定します。タグだけで検索すると<タグ>< /a>という組み合わせも拾ってしまうので、真ん中に`[^<].*?`をはさむことにより目的の文字列を取り出します。この時に大事なのが`/https:\/\/booth.pm\/ja\/items\/[0-9]+"\>[^<].*?<\/a?/g`の末尾の`g`の部分で、これは正規表現が複数マッチした時にすべての戻り値を配列として返すようにするものです(最初の配列は`[0]`から始まる点に注意)。残念ながら、グループ分けの`()`と併用はできないもようで、正確にはこのコードで得られるのは**URL+αの文字列**ですが、まあそこからURLだけを切り出す操作については解説略で……すいません。コードを改良してURLを得られるようにしました(12/02)。
1ページごとに20体の新着3Dモデルがあるので、j
のイテレーションを20回繰り返せば400個のURLが得られます。
免責事項
筆者は正規表現については素人ですので、もっとエレガントな表記があるよ! という場合もあると思われるますが、そういう場合は教えていただきたいです。
また、Webスクレイピングはサーバに負担をかける行為ですので、皆さんもこのコードを試してみてよ! とは気軽には言えないです。ですが何かスクレイピングしたい対象があった時に、このページが参考になれば幸いです。