Pythonスクレイピングを使って『小説家になろう』のランキングからテキストデータを取得するサンプルコード
サンプルコード
import requests from bs4 import BeautifulSoup # URLの指定 url = "https://yomou.syosetu.com/rank/list/type/daily_total/" #ユーザーエージェントの設定 headers = {"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0"} # URLにアクセスする 戻り値にはアクセスした結果やHTMLなどが入ったinstanceが帰ってきます response = requests.get(url=url, headers=headers) html = response.content # instanceからHTMLを取り出して、BeautifulSoupで扱えるようにパースします soup = BeautifulSoup(html, "html.parser") # CSSセレクターを使って指定した場所のtextを取得 selector = "#main_rank > div.rankmain_box > div.ranking_inbox" print(soup.select_one(selector)) #html形式 print(soup.select_one(selector).text) #Text形式 print('end')#終了の表示(消しても別によい)
実行結果
<div class="ranking_inbox"> <ul class="move_bar"> <li><a href="#best10">▼10</a></li> <li><a href="#best100">▼100</a></li> <li><a href="#best200">▼200</a></li> <li><a href="#best300">▼300</a></li> </ul> <div class="ranking_list"> <div class="rank_h"> <span class="ranking_number">1位</span> <a class="tl" href="https://ncode.syosetu.com/n6621fl/" id="best1" target="_blank">昏き宮殿の死者の王</a> </div> <table class="rank_table"> <tr> <td class="h_info" colspan="2"> <a href="https://ncode.syosetu.com/novelview/infotop/ncode/n6621fl/" target="_blank">小説情報</a>/作者:<a href="https://mypage.syosetu.com/27455/">槻影</a> </td> </tr> <tr> <td class="left" rowspan="4"> <span class="point"><span class="attention">4,075</span>pt</span><br/> 連載中 <br/>(全8部分) </td> <td class="ex"> 全身に絶え間ない激痛が奔り、衰弱の末死に至る奇病。 それに冒された少年は数年の苦痛の末、絶望を感じる余裕もなく誰にも看取られることなく生を終える。 そして再び目覚めた時――少年は邪悪な死霊魔導師の力により、最下級アンデッド、『死肉人』となっていた。 念願の痛みを感じない身体を手に入れ、歓喜する少年だが、すぐに自分の立場が未だ支配され、病室に軟禁されていた頃と大差ない事に気づく。 ――死にたくない。自由が欲しい。 そのためならば、僕は――甘んじて『怪物』になろう。 ただ平穏を求める少年を、世界は放っておかなかった。 死霊魔術により死体から少年を蘇らせ、エンドと名付け支配せんとする死霊魔導師。 闇に属する者をどこまでも追い詰め、滅する事に命を賭ける終焉騎士団。 多数の魔物を配下に収め、各地に君臨し覇を争う魔王達。 目的は生存と自由。必要な物は力と注意深さ。 これは、自由を求め、時に戦い、時に逃げ出し、時に怯え、時に躊躇う、臆病な死者の王の物語。 </td> </tr> <tr> <td> ハイファンタジー〔ファンタジー〕 </td> </tr> <tr> <td class="keyword"> <a href="/search.php?word=R15">R15</a><a href="/search.php?word=%E6%AE%8B%E9%85%B7%E3%81%AA%E6%8F%8F%E5%86%99%E3%81%82%E3%82%8A">残酷な描写あり</a><a href="/search.php?word=%E3%82%A2%E3%83%B3%E3%83%87%E3%83%83%E3%83%89">アンデッド</a><a href="/search.php?word=%E6%88%A6%E3%81%84">戦い</a><a href="/search.php?word=%E6%88%90%E9%95%B7">成長</a><a href="/search.php?word=%E5%A4%89%E7%95%B0">変異</a><a href="/search.php?word=%E9%80%B2%E5%8C%96">進化</a><a href="/search.php?word=%E6%AD%BB%E9%9C%8A%E9%AD%94%E8%A1%93">死霊魔術</a><a href="/search.php?word=%E5%91%AA%E3%81%84">呪い</a><a href="/search.php?word=%E7%8F%BE%E5%9C%B0%E4%BA%BA%E4%B8%BB%E4%BA%BA%E5%85%AC">現地人主人公</a></td> </tr> <tr> <td> 最終更新日:2019/04/28 00:00 <span class="marginleft">34,900文字</span> </td> </tr> </table> </div> <div class="ranking_list"> ~~中略~~ 100pt 連載中 (全185部分) 私の前世の記憶が蘇ったのは、祖父経由で婚約破棄を言い渡された瞬間だった。同時にここが好きだった少女漫画の世界で、自分が漫画の主人公に意地悪の限りを尽くす悪役……の取り巻きである白豚令嬢、ブリトニーに転生していると気付く。ブリトニーは悪事がバレそうになった悪役に全ての罪を被せられ、切り捨てられて最後には処刑されるという悲劇のデブキャラだ。確実に死刑を回避する方法は、悪役の取り巻きにならないこと。この悪役は自分より際立って醜い者しか周囲に侍らせないので、今から痩せればなんとかなるかもしれない。とりあえず、ダイエットしよう!! ◇◆◇ビーズログ文庫から書籍化&コミカライズ中◇◆◇詳細は活動報告に書いています。 異世界〔恋愛〕 異世界転生悪役令嬢ラブコメダイエット領地改革婚約破棄おデブ令嬢ツンデレ婚約者腹黒従兄デブ専王太子リバウンド少女漫画白豚コメディー純愛三角関係 最終更新日:2019/04/21 20:02 398,725文字 ▲250 ▲200 ▲100 ▲top end
コード説明
ユーザーエージェントの設定
「なろう」のページではユーザーエージェントを設定しないと”ユーザーエージェントが不正です”というエラーが出てしまう。
なおユーザーエージェントは以下のページを参照。
各ブラウザのUserAgent一覧 - Qiita
CSSセレクターを使って指定した場所のtextを取得
#main_rank > div.rankmain_box > div.ranking_inbox
CSSセレクターについてはブラウザ(ここではchromeを想定)の「検証」機能を使うと簡単。以下のページを参考にするとよい。
chromeやfirefoxであれば、ページを右クリックした時にでるコンテクストメニューの「検証(chrome)」や「要素を調査(firefox)」などからたどれば一発でコピペできる。
初心者向け!Chromeの検証機能(デベロッパーツール)の使い方
Python Webスクレイピング テクニック集「取得できない値は無い」JavaScript対応@追記あり6/12 - Qiita
実行結果の保存
ココらへんをご参考に
[Pythonで行う「なろう小説API」の分析 コード例、環境準備、トラブルシューティング](https://karupoimou.hatenablog.com/?page=1555682132)
>結果をテキストファイルに書き込み
参考にしたページ
Beautifulsoup の select_one の使い方 - Qiita
(非常に参考になるページ)
Python Webスクレイピング 実践入門 - Qiita
(日経のページと違って、小説家になろうではユーザーエージェントの設定が必須。なのでこの参考リンクページのサンプルはそのままでは動かない)