KTR推しBLOG

Nim言語を使ってWebスクレイピング(nimquery) その1

2024-01-24

Nim言語の使い方を調べていく中で試した内容についてメモ書きを残しておきます。

気が向いた時に更新をするという方針で運用していたら期間が空いてしまったので、興味のあることを対象として進めていこうかなぁと思っております。前回まで天気の情報を取得する方法について調べておりましたが、今回はDLsiteから取りたい情報を取得する方法を調べたり、試したりしてわかったことを書いていこうと思います。

最初にコードの実行方法だけ載せておきます。ソースファイル名は任意です。

nim r -d:ssl --hints:off .\scraping_sample.nim

Nim言語でスクレピングを行う際に標準の機能だと、CSSセレクタやXPathを使ってhtmlから要素を抜き出すことが現状は出来ないようです。色々と調べていく中でnimqueryというライブラリが現状やりたかったことに近い機能を持っているようなので使っていくことにしました。Githubのドキュメントの記載例に従って書きつつ、取得したい内容を取れるのか試した時のソースの処理内容は以下のような感じです。

from xmltree import `$`
from htmlparser import parseHtml
import std/[httpClient, strutils]
import nimquery

# URLを作る
const dataType = "day"
const genre = "r18"
let baseUrl = "https://www.dlsite.com/maniax/ranking/" & dataType & "?category=voice&date=30d"

# レスポンスを取得する
let site = baseUrl
var client = newHttpClient()
let src = client.getContent(site)

# 要素を取得する
let xml = parseHtml(src)
for i in countup(1, 100):
    let elements = xml.querySelectorAll("#ranking_table > tbody > tr:nth-child(" & i.intToStr & ") > td:nth-child(3) > dl > dt > a")
    echo elements

実行すると抜粋となりますが、以下のような内容が取れたので私のやりたかった処理が実現出来たかなぁと思っております。

@[<a href="https://www.dlsite.com/maniax/work/=/product_id/RJ01144225.html">【ブルーアーカイブ】カヨコASMR~穏やかで温かい距離感~</a>]
@[<a href="https://www.dlsite.com/maniax/work/=/product_id/RJ01144236.html">【ブルーアーカイブ】ヒマリASMR~ほどけた心をゆだねられ~</a>]
@[<a href="https://www.dlsite.com/maniax/work/=/product_id/RJ01134942.html">★限定版【密着×背徳肯定】ダウナー義姉の逆NTR子作りライフ【男性受け】</a>]
@[<a href="https://www.dlsite.com/maniax/work/=/product_id/RJ01135393.html">【完全新作3本セット】超耳元密着型☆お耳が気持ちよくなるオンラインソープ始めました♪【5時間30分】</a>]
@[<a href="https://www.dlsite.com/maniax/work/=/product_id/RJ01129639.html">【両耳ねっとり耳舐め♪】双子の彼女といけない関係~二人と付き合うのって罪ですか?</a>]
@[<a href="https://www.dlsite.com/maniax/work/=/product_id/RJ01142500.html">【十日間限定特典】鼓膜を、舐める。~深奥耳舐めでゾワゾワ甘い勃起と優しい発射~【『深奥部』舐め】</a>]
@[<a href="https://www.dlsite.com/maniax/work/=/product_id/RJ01134131.html">【1/23日まで 早期限定4大特典 + 40%OFF!】【オホ声×女将軍】~国一番の雌に選ばれたボクのお役目は種馬でした…♪【過去作が50%オフになるクーポンつき!】</a>]

今後はその他の必要な情報を取得して加工して保存する処理を試していこうと思っております。

参考