url |
^https://(www|touch)\.pixiv\.net/novel/(show\.php|series/\d+) |
pageElement |
//main/div/p|//section[@id='novel-text-container']|//section/div/div/div[child::h1]//p[@id]|//div[@class='novel-details-view']//div[contains(@class,'comment-text') and contains(@class,'f-caption-s')] |
nextLink |
//div[@id='spa-contents']//div[contains(@class,'series-navigation')]/div[@class='navigation-container']/a[contains(@href,'/novel/show.php?') and contains(@class,'gtm-novel-work-series-next')]|//a[contains(@href,'/novel/show.php?') and contains(@class,'gtm-novel-work-series-next')] |
title |
//main/section//h1[not(preceding::div[child::a[contains(@href,'/series/')]])]|//div[@class='title-scroller']|//main/section//div[following::h1]/a[contains(@href,'/series/')] |
subtitle |
//main/section//main//h2 |
author |
//div[contains(@class,'user-details-card')]/a[contains(@href,'/users/') and @class='user-details-name']|//main/section//h2//div[preceding-sibling::a]/a[contains(@href,'/users/')] |
firstPageLink |
//main/section//div[preceding-sibling::nav]//a[contains(@href,'/novel/show.php?id=')]|//div[@id='spa-contents']//div[@class='works-grid-list']//div[contains(@class,'list-item') and contains(@class,'is-list')]//a[contains(@href,'/novel/show.php?') and @class='novel-title'] |
tag |
//main/section//footer//li//a[contains(@href,'/tags/')]|//div[@id='spa-contents']//div[@class='novel-details-view']//div[contains(@class,'display-tags')]/span[following-sibling::div[@class='tags-editor']]/a[contains(@href,'/tags/')] |
isNeedHeadless |
true |
nextButton |
div[direction="next"] button, nav.novel-pager-container span:nth-child(3):not(.invisible) |
firstPageButton |
div#spa-contents div.novel-details-view .navigation-container button:not(button[disabled=disabled]) |
forceClickButton |
main div.charcoal-token > div > div > div > div > button, #wrapper #contents #spa-contents > div > div.novel-details-view > div.swipe-detector > div > div > .button-link |
waitSecondInHeadless |
2.0 |
injectStyle |
main {white-space:pre-wrap;} p.novel-paragraph{white-space:pre-wrap;} |
exampleUrl |
https://www.pixiv.net/novel/show.php?id=8919908#1 |
memo |
pixiv小説の個々の小説は通常(?)とはちょっと違う形でカテゴライズされているため、かなりややこしい SiteInfo になっているため、メモを残す。
まず、isNeedHeadless は true である必要がある。これは本文がHTML上に現れるためには JavaScript が動作する必要があるためである。
次に、pixiv小説におけるページは「>次へ」といった感じのボタン(<a> ではないのでJavaScriptで .click() する必要がある)を押してめくるのであるが、この時URLは変化しない(正確に言うと # より後ろの部分が変化する)。
そのため、まず最初に検索すべきはこの「>次へ」のボタンである。
これは nextButton に CSS selector を書く事によって行う。
このボタンが確認できるのは例えばこのURLである。
https://www.pixiv.net/novel/show.php?id=8919908#3
次に、「>次へ」といったボタンで手繰って行った後に開くべきページについて。
pixiv小説は「シリーズ」という物で続きの話が投稿される場合がある。
このシリーズの次の話を手繰るのは <a> で行けそうであるので nextLink を用いる(余談だがシリーズの次の話はIDが異なる。どうやらそれぞれの小説は個々に独立していて、シリーズとして関連性を与えているという概念らしい)。
このシリーズの次の話へのリンクが確認できるのは例えばこのURLである。
https://www.pixiv.net/novel/show.php?id=13381749
この中の、「#41 強くてニューゲームは都市伝説。上手に「待て」が出来るかな?」というボタンがそれである。
次に、firstPageLink と firstPageButton について。
pixiv小説では個々の小説のタイトルページ(表紙?)も存在する。
これは例えば
https://www.pixiv.net/novel/show.php?id=8919908
といった物がそれに当たるのであるが、これはブラウザで開くと勝手に最初のページを開くような動作を取ることがあるため、この挙動に当たってしまうとタイトルページの解析はできない。
また、シリーズの一覧ページというものもあり、こちらは例えばこのURL
https://www.pixiv.net/novel/series/1270584
で確認できる。
このシリーズ一覧での最初の小説へのリンクについては firstPageButton で対応する。
なお、pixiv小説はスマホのような狭い画面とPCのような広い画面でHTMLのDOM構造が大きく異るタイプであるので、どちらの側でも動作するような値を指定する必要がある事を注記しておく。(Chromeのdevtoolでクライアントを変えてリロードすればそれぞれのDOM構造を確認できるはずである) |
overrideUserAgent |
Mozilla/5.0 (Mac OS X) AppleWebKit (KHTML, like Gecko) |