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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

1787閲覧

【Python】requests、BeautifulSoupによってQiitaにログインしたい

konan_

総合スコア4

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/06/02 07:46

編集2020/06/02 08:05

前提・実現したいこと

requests、BeautifulSoupによってQiitaにログインしたいのですが
POST通信が上手くできておらず、ログインできません。

コードの流れとしては12行目でログインをした後
authenticity_tokenを取得
その後login_dataを保持した上でPOST通信によりログインしたいと思っております。

発生している問題・エラーメッセージ

request.py:72: GuessedAtParserWarning: No parser was explicitly specified, so I'm using the best available HTML parser for this system ("html.parser"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently. The code that caused this warning is on line 72 of the file request.py. To get rid of this warning, pass the additional argument 'features="html.parser"' to the BeautifulSoup constructor. soup = BeautifulSoup(r.text) Traceback (most recent call last): File "request.py", line 79, in <module> res.raise_for_status() File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/requests/models.py", line 941, in raise_for_status raise HTTPError(http_error_msg, response=self) requests.exceptions.HTTPError: 500 Server Error: Internal Server Error for url: https://qiita.com/login

該当のソースコード

python

1import requests 2from bs4 import BeautifulSoup 3 4login_data = { 5 'authenticity_token':"", 6 'identity':'〇〇', 7 'password':'〇〇', 8 'commit':'Qiita にログイン' 9} 10 11session = requests.Session() 12r = session.get('https://qiita.com') 13soup = BeautifulSoup(r.text) 14r.raise_for_status() 15 16auth_token = soup.find(attrs={'name': 'authenticity_token'}).get('value') 17login_data['authenticity_token'] = auth_token 18 19res = session.post('https://qiita.com/login', login_data) 20res.raise_for_status()

試したこと

Cromeで実際の通信の様子を確認することや
様々な参考資料を読みここまで書いたのですがここからが進みません。
おそらくとても些細なことかと思うのですが、ご教示頂きたいと思っております。

補足情報(FW/ツールのバージョンなど)

Mac、Python 3.8.3

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

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

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

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

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

x98000

2020/06/02 10:27

公式apiを使えない理由は何かありますか?スクレイピングよりも確実でpythonサンプルも幾つかありますよ。
konan_

2020/06/02 10:34

今回のQiita全く別のサイトで スクレイピングでしか取得できないデータを取るため、 そのサンプルプログラムをQiitaを対象に書いていたのですが サンプルのつもりが思った以上につまずいてしまった次第です。
guest

回答1

0

tokenの取得に失敗している様です。

HTML

1<meta name="csrf-param" content="authenticity_token"> 2<meta name="csrf-token" content="hogehogehogehogehogehogehogehoge==">

tokenは"csrf-token"というname属性のmeta要素に格納されているので
そこを指定して抽出する必要があります。

以下でmeta要素を指定してauthenticity_tokenを指定して抽出する事ができます。

python

1auth_token = soup.find('meta', {'name':'csrf-token'}).get('content')

投稿2020/06/30 10:40

nto

総合スコア1438

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問