ど素人スクレイピング③

おはこんばんにちは。マタキチです。
コンビニって偉大。なんてったって24時間だから。もう止められない止まらないよねっつって。そんな思いを胸にマタキチ一昨日コンビニに行ったわけです。深夜1時ごろに。週末呑みたいな的な飲み物を買いに行ったわけです。そしたらいつものコンビニの風景が変わってたんです。あれ?ここはJapanかなっつーくらい異国情緒溢れるメンバーに変わってました。ラグビー日本代表かなっつって。んでもってお酒をレジに持っていったら、無言でレジ打ちスタート。なるほど、そうゆう新しい試みかと。無言でいっちゃってやっちゃってと思った矢先、店員が野球部一年生くらいの声で
「ハタチカ!!!!?」っつって。大きい声にびっくりして思わずこちらも店内に響き渡る声で「ハタチ!!!!!!」っつって。本当はアラサーなので年齢詐称だなっつって。ちょっとした岡本夏生だなって。そして後ろに並んでいたお客さん爆笑。しかも身分証の確認はなしと。マタキチはこれからお店に通ってあの子を一流のコンビニ店員に育てたいと思います。

pythonのスクレイピングを勉強しているのでかき留めようかと思います。忘備録的な意味合いが強いのであしからず。見てくださった方でご指摘等ありましたら嬉しいです。


ログインの必要なサイトからダウンロード

Webサイトと言っても色々あります。今回は会員制サイトのスクレイピングを目的にまとめていきたいと思います。まずはクッキーとセッションについて。

クッキーとセッション

クッキー(Cookie)とはWebブラウザーを通してサイト訪問者のPCに一時的にデータを書込んで保存する仕組みのこと。これはHTTP通信のヘッダーを介して入出力される仕組みになっています。つまりは訪問毎にデータの改変が容易に可能ということです。つまり「カートの中身」などの情報には向いていますが、「パスワード」や「ログインID」といった重要な情報を保持するのには向いていない仕組みです。
そこで、セッションの仕組みが導入されました。セッションはクッキーを使用してデータを保存する点では同じですが、固有ID(例:ID = 1234)を保存します。実際のデータ(ログインIDなど)はWebサーバに保存されていて、固有IDと紐づいています。なので、クッキーで保存した固有IDを使用してサーバから重要な情報を取り出す仕組みになっています。

会員制サイトのスクレイピング

それでは会員制サイトのスクレイピングをしていきましょう。使うライブラリー、モジュールをインポートしていきます。作業手順としては「ログインページを開く」「フォームにユーザー名とパスワードを入力してフォーム送信」「ログイン後のページが表示されるのでマイページリンクをクリック」です。この手順をpythonを使って記述していきます。

#必要なモジュール、ライブラリーのインポート
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin

#パスワードとユーザ名
USER = "JS-TESTER"
PASS = "ipCU12ySxI"

#セッションの開始
session = requests.session()

#ログイン
login_info = {"username_mlbbs6" : USER , "password_mmlbbs6" : PASS, "back" : "index.php" , "mml_id" : "0" }

url_login = "https://uta.pw/sakusibbs/users.php?action=login&m=try"
res = session.post(url_login, data=ligin_info)
res.raise_for_status()

#マイページのURLをピックアップ
soup = BeautifulSoup(res.text, "html.parser")
a = soup.select_one(".islogin a")
if a is None:
    print("マイページが取得できませんでした")
    quit()

#URLを相対から絶対に変換
url_mypage = urljoin(url_login, a.attrs["href"])
print("マイページ=", url_mypage)

#マイページにアクセス
res = session.get(url_mypage)
res.raise_for_status()

#マイページのお気に入りリストのタイトル列挙
soup = BeautifulSoup(res.text, "html.parser")
links = soup.select("#favlist li > a")
for a in links:
    href = a.attrs["href"]
    title = a.get_text()
    print("<", title, "> =", href)

今回は「mypage.py」って名前でファイル保存、cmdで実行した結果がこちら。

$python3 mypage.py
マイページ= https://uta.pw/sakusibbs/users.php?user_id=32
< 今日も明日もJS三昧 by JS-TESTER > = post.php?mml_id=161
< 眠ってもデバッグ by JS-TESTER > = post.php?mml_id=162
< プリンとシュークリーム by JS-TESTER > = post.php?mml_id=246
< 吾輩はテスターである by JS-TESTER > = post.php?mml_id=268
< 吾輩はテスターである その2 by JS-TESTER > = post.php?mml_id=269
< ポケベルが鳴らなくて by 月城 麻里奈 > = post.php?mml_id=796
< Aqours音頭で踊ろうよ by 月城 麻里奈 > = post.php?mml_id=797
< 空虚=Angel lover by 月城 麻里奈 > = post.php?mml_id=664
< 紅い薔薇の誘惑 by 月城 麻里奈 > = post.php?mml_id=780
< 愛を失う事が怖くて by 月城 麻里奈 > = post.php?mml_id=782
< 愛なんてない by 月城 麻里奈 > = post.php?mml_id=781
< 小悪魔ガール by 月城 麻里奈 > = post.php?mml_id=784
< 笑顔でサヨナラしようよ by 月城 麻里奈 > = post.php?mml_id=783
< 朱い夏の愛に溺れたい by 月城 麻里奈 > = post.php?mml_id=786
< 君が天使だから by 月城 麻里奈 > = post.php?mml_id=785
< LOVEの文字が消えないように by 月城 麻里奈 > = post.php?mml_id=787
< ゴメンねサヨナラ by 月城 麻里奈 > = post.php?mml_id=789
< この愛にトドメを刺してよ by 月城 麻里奈 > = post.php?mml_id=788
< 格好 by Homary > = post.php?mml_id=167
< メダリオン by Homary > = post.php?mml_id=164
< Seraphim by Homary > = post.php?mml_id=180
< 桜花 by Homary > = post.php?mml_id=172
< 命想い by Homary > = post.php?mml_id=184
< ぼんやり by Homary > = post.php?mml_id=181
< つまびく by Homary > = post.php?mml_id=209

こんな感じでお気に入りの一覧を取得できました。「ポケベルが鳴らなくて」と「小悪魔ガール」が個人的に気になりました。

今回使用したページは下記になります。
作詞掲示板uta.pw

まとめ

今回は会員制サイトにログインして、指定のページにある情報一覧の取得でした。データが綺麗に取り出せた時は楽しいですね。勉強しよーっと。


この記事が気に入ったらサポートをしてみませんか?