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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

2498閲覧

ニコニコ動画の公開マイリスト検索をクローリングしたい

jackojacko_

総合スコア17

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2017/10/02 16:20

###前提・実現したいこと
ニコニコ動画の公開マイリスト(=この動画を登録しているマイリスト一覧)をPythonでクローリングしようと思っています。
ニコニコ動画の公開マイリスト検索(/openlist/sm****)は、AND検索もOR検索もNOT検索もできるっぽい」にある通り、"http://www.nicovideo.jp/openlist/動画ID"の形で取得できるのですが、この画面はログインしないと閲覧できません。
そのため「PythonでCookieを使ってWebサイトにログイン - matsulibの日記」を参考に、この記事のプログラムを再現して動画をダウンロードするところまでは行ったのですが、URLを先程の公開マイリストのページに置き換えるとうまく働かない状況です。
ダウンロードは出来ているのでログインは出来ていると思うのですが、アドバイスいただけると幸いです。

###該当のソースコード

Python

1import requests 2import lxml.html 3from urllib.request import build_opener, HTTPCookieProcessor 4from urllib.parse import urlencode, parse_qs 5from http.cookiejar import CookieJar 6from lxml.html import fromstring 7 8# Cookie利用opener 9opener = build_opener(HTTPCookieProcessor(CookieJar())) 10 11encoding = 'utf_8' # Webサイトの文字コード 12 13post = { 14 'mail_tel': 'メールアドレス', 15 'password': 'パスワード' 16} 17data = urlencode(post).encode('utf_8') 18 19# ログインCookieを取得 20response = opener.open('https://secure.nicovideo.jp/secure/login', data) 21 22# レスポンスの読込、保存 23# with open('out.html', 'w', encoding=encoding) as f: 24# f.write(response.read().decode(encoding)) 25response.close() 26 27# クローリング 28## 最終的には公開マイリストの被登録件数を取得したいと考えています。 29url = 'http://www.nicovideo.jp/openlist/nm10007815' 30with opener.open(url) as response: 31 print(url) 32 root = lxml.html.fromstring(response.read()) 33#ここのrootがNoneになっていました。 34 size = None 35 elems = root.find('.//div[@class="mb8p4"]') 36 if elems is not None: 37 for elem in elems: 38 size = elem.find('.//p[@class="font12"]').find('.//strong').text 39 print(size)

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

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

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

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

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

guest

回答1

0

ベストアンサー

記載のコードを実行してみましたが、ログインできればページは問題なく取得できているようです。

登録数の取得時に<p>タグ直前の<h1>を参照してエラーとなっているようでしたので、下記のように変更して登録数を取得しています。

Python

1with opener.open(url) as response: 2 root = lxml.html.fromstring(response.read()) 3 4 size = None 5 elems = root.find('.//div[@class="mb8p4"]') 6 if elems is not None: 7 size = elems.find('.//p[@class="font12"]').find('.//strong').text 8 print(size) 9

投稿2017/10/03 10:35

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

jackojacko_

2017/10/03 11:31

ありがとうございます!タグの記述の問題でしたか……
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問