プログラム関係の備忘録。技術系記事1000記事以上を目指すブログ

pythonでスクレイピング~requests編~

  • 2021年4月16日
  • 2021年4月16日
  • python
  • 1031view
  • 0件

はじめに

前回までで、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にしてくれるというとても便利なものです。