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

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

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

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

Python

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

Q&A

解決済

1回答

1496閲覧

Python3 スクレイピングでログイン出来ずタイムアウト?になる

khaii21

総合スコア65

Python 3.x

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

Python

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

0グッド

3クリップ

投稿2018/06/01 18:12

編集2018/06/02 06:34

前提・実現したいこと

Python 3です。
Cookie認証が必要となるサイトに対してスクレイピングのコードを書きました。
ポートが閉じているわけではないのですが、どうやらタイムアウトしている様子です。
他の検証環境でスクリプト自体は正常に動作する事を確認しています。
他者がPerlで同様なスクリプトを作成しましたが、問題なく可動している事もあり
接続経路には問題がないのではないかと考えています。

Perlでは下記のモジュールを利用して問題なく接続が出来ます use LWP::UserAgent use HTTP::Request use HTTP::Cookies

原因をつきとめる為に、これから何を調べればよいのか行き詰まっています。
原因の特定、問題解消のためにお知恵を貸して頂けないでしょうか。

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

実行後、暫くしてから下記のメッセージが出力されてエラー終了します。

通常のエラーメッセージ(抜粋) Traceback (most recent call last): File "hoge.py", line 159, in <module> response = opener.open(hoge_url, data) File "requests.py", line 532, in open response = meth(req, response) File "requests.py", line 642, in http_response 'http', request, response, code, msg, hdrs) File "requests.py", line 564, in error result = self._call_chain(*args) File "requests.py", line 504, in _call_chain result = func(*args) File "requests.py", line 756, in http_error_302 return self.parent.open(new, timeout=req.timeout) File "requests.py", line 526, in open response = self._open(req, data) File "requests.py", line 544, in _open '_open, req) File "requests.py", line 504, in _call_chain result = func(*args) File "requests.py", line 1361, in https_open context=self._context, check_hostname=self._check_hostname) File "requests.py", line 1320, in do_open raise URLError(err) urllib.error.URLError: <urlopen error [Errno 110] Connectopn time out>
import backtrace を仕込んで出力したエラー内容を降順(抜粋) 756 request.py http_error_302 --> return self.parent.open(new, timeout=req.timeout) 504 request.py _call_chain --> = func(*args) 564 request.py error --> result = self._call_chain(*args) 642 request.py http response --> 'http', request, response, code, msg, hdrs) 532 request.py open --> response = meth(req, response) 160 request.py <module> --> response = opner.open(hoge_url, data)

該当のソースコード

#!/usr/bin/python3 # -*- coding: utf-8 -*- from urllib.request import build_opener, HTTPCookieProcessor from urllib.parse import urlencode, parse_qs from http.cookiejar import CookieJar import ssl ssl._create_default_https_context = ssl._craete_unverified_context hoge_url = "https://hoge.co.jp/login" encoding = " utf-8" post = { "action": "login", "account": "アカウント" "password": "パスワード" } opener = build_opener(HTTPCookieProcessor((CookieJar())) data = urlencode(post).encode(encoding) response = opener.open(hoge_url, data) response.close()

試したこと

同じ実行環境でcurlコマンドを試すと、認証エラーのレスポンスが返ってくるので接続は可能な様子です。
python2で同じようなスクリプトを書いてみて試しましたが上記のエラーとなります。
エラー内容からリダイレクト?の影響でタイムアウトしていると考えたのですが
対話式で該当のサイトにgetリクエストした場合には200のレスポンスが返ってきます。

>>> import requests >>> res = requests.get('https://hoge.co.jp/login') >>> 200

少し見えてきたこと

該当のURLですが、requestsモジュールを使うとレスポンスが返って来ました。

import requests post = { "action": "login", "account": "アカウント" "password": "パスワード" } hoge_url = "https://hoge.co.jp/login" response = response.post(URL, data=post) print(response.text)

Python初心者であるため、色々と検索して下記の手法を組んだのですが、
こちらはCookie認証が必要との情報を見かけて取り入れました。

opener = build_opener(HTTPCookieProcessor((CookieJar())) data = urlencode(post).encode(encoding) response = opener.open(hoge_url, data)

上記とrequestsモジュールとの違いをきちんと理解できていませんが、
もし上記と同様なことをrequestsモジュールを使って出来るのであれば、きちんと
認証が通るのではないかと考えています。

requestsモジュールを使ったCookie認証のやり方をご存知の方がいらっしゃいましたら
ご教授頂けないでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

requestsモジュールを使ったCookie認証

Sessionオブジェクトを生成すれば、良いような。

Python

1import requests 2 3post = { 4 "action": "login", 5 "account": "アカウント" 6 "password": "パスワード" 7} 8 9s = requests.Session() 10URL = "https://example.co.jp/login" 11response = s.post(URL, data=post) 12print(response.text) 13

◇参考情報
0. 【Python3】ログイン機能付サイトでスクレイピング【requests】【BeautifulSoup】
0. セッションの利用
0. 例示/実験用として利用できるドメイン名

投稿2018/06/02 06:58

編集2018/06/02 07:02
umyu

総合スコア5846

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

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

khaii21

2018/06/02 08:15

ご回答ありがとうございます。 分からないながらも試行錯誤して何とか認証を通る事が確認出来ました。 今回該当するURLで認証を行い、そこから更に先のサイトからデータが引けました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問