はじめに
前回までで、urllib、BeautifulSoupを使った処理を試しました。
しかし、ログインを伴うスクレイピングなどはやっていません。
そこで今回はクッキーを利用したアクセスが可能になるrequestsパッケージを使った例をメモしていきます。
例題として、このサイト(wordpress)にログインし、下書き状態の記事一覧を取得するというプログラムを作っていきます。
本来下書きの記事一覧はログインした状態でないと閲覧できないので、requestsを使って、クッキーを利用しログイン状態を保ちつつ進めていくという形になります。
requestsのインストール
pip install requests
実装
import requests
from bs4 import BeautifulSoup
user_login = "*****"
user_pass = "*****"
session = requests.session()
param = {
"log": user_login,
"pwd": user_pass,
"wp-submit": "ログイン",
"redirect_to": "******",
"testcookie": 1,
}
url_login = "*****"
res = session.post(url_login, data=param)
res.raise_for_status()
res = session.get("*****")
res.raise_for_status()
soup = BeautifulSoup(res.text, "html.parser")
datas = soup.select("a.row-title")
for data in datas:
print(data.string)
結果
PS F:\python_prd> python download.py
pythonでスクレイピング~requests編~
リッチWebView
node.js メール送信
きちんと取得できているかは私しかわかりませんが、執筆中のこの記事「pythonでスクレイピング~requests編~」が取得できているのと、過去に執筆中で飽きて止めた下書きが表示されていますw
解説
requestsをインポートします
import requests
ログイン時に必要な値を変数に格納
user_login = "*****"
user_pass = "*****"
セッションを開始
session = requests.session()
パラメータを定義
これはwordpressからPOSTするときのNetworkの値をdeveloperツールで見て確認します。
param = {
"log": user_login,
"pwd": user_pass,
"wp-submit": "ログイン",
"redirect_to": "******",
"testcookie": 1,
}
ログイン
url_loginにはログイン時にPOSTする際のURL
ログインに失敗したときは例外を発生させます
url_login = "*****"
res = session.post(url_login, data=param)
res.raise_for_status()
ログイン後画面のデータを取得
session.getでクッキーを維持してログイン後のデータを取得します。
そのため、****部分には下書き一覧のURLが入ります。
res = session.get("*****")
res.raise_for_status()
下書き一覧からタイトルを取得
BeautifulSoupでhtmlを解析し、下書き一覧のタイトル部をselectで抽出。
ループで出力します。
soup = BeautifulSoup(res.text, "html.parser")
datas = soup.select("a.row-title")
for data in datas:
print(data.string)
最後に
ログインを伴うサイトへのスクレイピングが可能になりました。
今回は特定のサイトの特定の階層をピンポイントで見に行ったため不要でしたが、URLを再帰的に取得するにはurllinのurljoinというのがとても優秀なようです。絶対パスならそのまま使用、相対パスならBASEパスからURLをよしなにごにょごにょして正しいURLにしてくれるというとても便利なものです。