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

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

新規登録して質問してみよう
ただいま回答率
85.35%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Python

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

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

1回答

4894閲覧

python + seleniumでスクレイピングできないサイトがある(sessionIDが取得できていない)

nkiki

総合スコア18

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Python

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

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/05/30 07:36

下記手順でスクレイピングしようとしてますが、herokuからのアクセスのみ、うまくアクセスできません。ローカルでは、アクセスできます。

実行したコードは下記になります。

python

1# -*- coding: utf-8 -*- 2from selenium.webdriver.common.alert import Alert 3from selenium import webdriver 4import os 5import time 6import logging 7wtime = 15 8ztime = 2 9def reserving_tm(start_day,driver): 10 open('tm.log', "w+").close 11 logging.basicConfig(filename='tm.log', level=logging.DEBUG) 12 for i in range(2): 13 try: 14 options = webdriver.ChromeOptions() 15 if(os.path.isfile("E:\scprogram\chromedriver.exe")):#ローカル用 16 #options.add_argument('--headless') 17 #options.add_argument('--disable-gpu') 18 chromedriver_path = "E:\scprogram\chromedriver.exe" 19 driver = webdriver.Chrome(chromedriver_path, options=options) 20 else: #heroku用 21 options.binary_location = '/app/.apt/usr/bin/google-chrome' 22 options.add_argument('--headless') 23 options.add_argument('--disable-gpu') 24 driver = webdriver.Chrome(options=options) 25 driver.get("https://resv.city.meguro.tokyo.jp/Web/Home/WgR_ModeSelect") 26 time.sleep(ztime) 27 s = driver.page_source.replace(" ","").replace("\n","").replace("\t","") 28 print(s[0:300]) 29 print(driver.current_url) # URLを確認する 30 break 31 except: 32 print("NG") 33 log_print() 34 driver.close()# ブラウザを閉じる 35 driver.quit() # chromedriver.exeを閉じる 36 raise 37 log_print() 38 driver.close()# ブラウザを閉じる 39 driver.quit() # chromedriver.exeを閉じる 40 return [] 41def log_print(): 42 tmp = open('tm.log', "r").read() 43 print(tmp) 44 open('tm.log', "r").close 45def popup_click(driver,sss): 46 while True: 47 try: 48 Alert(driver).accept() #ポップアップが出てきた時にクリックする。 49 if(sss != ""): 50 print("P1",sss) 51 except: 52 if(sss != ""): 53 print("P2",sss) 54 break 55if __name__ == "__main__": 56 print(reserving_tm("","")) 57

とすると問題なくスクレイピングできる時(ローカル環境)は、下記のようなログが出てきます

OK

1#print(s[0:300])の結果###### 2<!DOCTYPEhtml><!--[ifIE8]><htmlclass="lt-ie9ie8"lang="ja"><![endif]--><!--[ifIE9]><htmlclass="lt-ie10ie9"lang="ja"><![endif]--><!--[if(gteIE10)|!(IE)]><!--><htmlxmlns="http://www.w3.org/1999/xhtml"lang="ja"><!--<![endif]--><head><metacharset="utf-8"/><title>目黒区施設予約システム</title><metahttp-equiv="Pragma 3#print(driver.current_url)の結果###### 4https://resv.city.meguro.tokyo.jp/Web/Home/WgR_ModeSelect 5#print(tmp)の結果(長いので後半は省略)###### 6DEBUG:selenium.webdriver.remote.remote_connection:POST http://127.0.0.1:50445/session {"capabilities": {"firstMatch": [{}], "alwaysMatch": {"browserName": "chrome", "platformName": "any", "goog:chromeOptions": {"extensions": [], "args": []}}}, "desiredCapabilities": {"browserName": "chrome", "version": "", "platform": "ANY", "goog:chromeOptions": {"extensions": [], "args": []}}} 7DEBUG:urllib3.connectionpool:Starting new HTTP connection (1): 127.0.0.1:50445 8DEBUG:urllib3.connectionpool:http://127.0.0.1:50445 "POST /session HTTP/1.1" 200 825 9DEBUG:selenium.webdriver.remote.remote_connection:Finished Request 10DEBUG:selenium.webdriver.remote.remote_connection:POST http://127.0.0.1:50445/session/8aa11c1ed44e39e9cc373653ca868a0c/url {"url": "https://resv.city.meguro.tokyo.jp/Web/Home/WgR_ModeSelect", "sessionId": "8aa11c1ed44e39e9cc373653ca868a0c"} 11DEBUG:urllib3.connectionpool:http://127.0.0.1:50445 "POST /session/8aa11c1ed44e39e9cc373653ca868a0c/url HTTP/1.1" 200 72 12DEBUG:selenium.webdriver.remote.remote_connection:Finished Request 13DEBUG:selenium.webdriver.remote.remote_connection:GET http://127.0.0.1:50445/session/8aa11c1ed44e39e9cc373653ca868a0c/source {"sessionId": "8aa11c1ed44e39e9cc373653ca868a0c"}

NGな時は下記のようになり、「print(tmp)」の結果に大きな差異がありました。
sessionIdが空になっています。

NG

1#print(s[0:300])の結果###### 2<html><head><script>start("/");</script><script>addRow("app","app",1,4096,"4.0kB",1590819313,"5/30/20,6:15:13AM");</script><script>addRow("bin","bin",1,4096,"4.0kB",1590657682,"5/28/20,9:21:22AM");</script><script>addRow("dev","dev",1,380,"380B",1590818537,"5/30/20,6:02:17AM");</script><script>addRo 3#print(driver.current_url)の結果###### 4file:/// 5#print(tmp)の結果(長いので後半は省略)###### 6DEBUG:selenium.webdriver.remote.remote_connection:POST http://127.0.0.1:51328/session {"capabilities": {"firstMatch": [{}], "alwaysMatch": {"browserName": "chrome", "platformName": "any", "goog:chromeOptions": {"extensions": [], "binary": "/app/.apt/usr/bin/google-chrome", "args": ["--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36", "--headless", "--disable-gpu"]}}}, "desiredCapabilities": {"browserName": "chrome", "version": "", "platform": "ANY", "goog:chromeOptions": {"extensions": [], "binary": "/app/.apt/usr/bin/google-chrome", "args": ["--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36", "--headless", "--disable-gpu"]}}} 7DEBUG:urllib3.connectionpool:Starting new HTTP connection (1): 127.0.0.1:51328 8DEBUG:urllib3.connectionpool:http://127.0.0.1:51328 "POST /session HTTP/1.1" 200 679 9DEBUG:selenium.webdriver.remote.remote_connection:Finished Request 10DEBUG:selenium.webdriver.remote.remote_connection:POST http://127.0.0.1:51328/session/df06546271cc0a1c21f285cbf4de46c4/url {"url": "https://resv.city.meguro.tokyo.jp/Web/Home/WgR_ModeSelect"} 11DEBUG:urllib3.connectionpool:http://127.0.0.1:51328 "POST /session/df06546271cc0a1c21f285cbf4de46c4/url HTTP/1.1" 200 14 12DEBUG:selenium.webdriver.remote.remote_connection:Finished Request 13DEBUG:selenium.webdriver.remote.remote_connection:GET http://127.0.0.1:51328/session/df06546271cc0a1c21f285cbf4de46c4/source {}

webサーバー側が発行するsessionIdが取得できていないため、通信中のユーザーを識別できずにwebサイトが取得できていないようです。何か良い方法を知っていましたら教えていただけると助かります。ちなみに上記には記載してませんが、user_agentを変えてもアクセスできず、headlessモードを使わない状態でも無理でした。

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

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

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

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

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

shirai

2020/05/30 09:42

対象サイトに接続できていないのは間違いなさそうですが以下はないですか? WAF的なものにアウトバウンド通信が弾かれているのではないか。 そのパスに本当にchromedriverは存在するか。 chromedriverのバージョンは合致しているか。 chromedriverのchmodは与えられているか。 options.binary_locationでパスを指定しているが、ローカルと同じやり方でパスを指定したらどうなるか。
nkiki

2020/05/30 10:19

chromeドライバの件は問題ないことを確認しています。herokuから同じ設定で他のサイトのデータを読むことができているためです。昔から運用している個人的なプログラムを走らせてたりもしているので、疑うところがありません。上記のサイトだけ、なぜかアクセスができないです。ローカルPCでは、アクセスできなかったことが無いというのと、他のサイトならherokuでも問題なくアクセスできている状態です。海外のアクセスを遮断してるのかなー。。。と思ったり色々調べていて行き詰っているところです。。 (1)WAF的なものにアウトバウンド通信が弾かれているのではないか。 (2)そのパスに本当にchromedriverは存在するか。 (3)chromedriverのバージョンは合致しているか。 上記の1~3件ですが、herokuを使った他のシステム(これとのほぼコピペ)で問題なく稼働しています。 ウェブサイト起因である可能性が高いです。 (4)chromedriverのchmodは与えられているか。 すみません。分からないので調査します。 (5)options.binary_locationでパスを指定しているが、ローカルと同じやり方でパスを指定したらどうなるか。 options.binary_location = '/app/.apt/usr/bin/google-chrome'をローカルで使い方が分からず。。。ファイルを持ってくることは可能なのかもわかりません。他のシステムでchromeは動作していますので、こちらも怪しむところではないと考えています。driver.get()の中身を変えて、そのあとをサイトごとに変えているだけで複数のシステムをheroku上で組んでいます。
guest

回答1

0

串をさしたらどうなりますか?
プロキシサーバは適宜探してみてください。

python

1options.add_argument('--proxy-server=http://111.222.123.234:1234')

投稿2020/05/31 08:39

shirai

総合スコア1290

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問