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

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

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

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

selenium

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

Q&A

解決済

1回答

2955閲覧

selenium データスクレイピングエラー

aki1228

総合スコア11

Python 3.x

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

selenium

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

0グッド

0クリップ

投稿2022/11/14 08:15

編集2022/11/14 23:56

前提

Pythonでseleniumを利用してデータのスクレイピングを実施しています。

https://www.usamega.com/powerball/results/1  ←この数字

最後の数字はカウントアップしていき、現在は126までホームページが存在します。
最初の1は問題なく取得できるのですが、whileで回して2以降でエラーになります。

実現したいこと

2以降のスクレイピングを実施するための手段を教えていただけませんでしょう。

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

2のURLで「Just a moment...」のタイトルでうまくいっていないようです。
最初は1でも同様のエラーが出力されていましたが、ヘッダーを追加したらうまくいくようになりました。

エラーメッセージ

DevTools listening on ws://127.0.0.1:54694/devtools/browser/26d885ba-e1e0-4669-bdfa-78be33bac8ec
URL番号の値
1

https://www.usamega.com/powerball/results/1

<title>Powerball Past Results | USA Mega</title> matの要素数= 338 1回終わり----------------------------------------------------- URL番号の値 2 =========================================== https://www.usamega.com/powerball/results/2 <title>Just a moment...</title> Traceback (most recent call last): File "C:\Users\user02\loto6\powerball_web2.py", line 89, in <module> lis = TABLES.find_all('li') AttributeError: 'NoneType' object has no attribute 'find_all'

該当のソースコード

デバッグでprintを多用してますがご容赦ください。

Python 3.10.8

python

1import time 2import random 3import pandas as pd 4from selenium import webdriver 5from selenium.webdriver.chrome.options import Options 6from selenium.webdriver.common.by import By 7from bs4 import BeautifulSoup 8import chromedriver_binary 9import numpy as np 10import json 11import pickle 12 13 14 15#Powerball history result URL 16powerball_url = 'https://www.usamega.com/powerball/results/' # 1~ 17 18num = 1 19mat = [] # test 20 21 22options = webdriver.ChromeOptions() 23options.add_argument('--headless') 24options.add_argument('--disable-gpu') 25options.add_argument('--no-sandbox') 26options.add_argument('--ignore-certificate-errors') 27options.add_argument('--allow-running-insecure-content') 28options.add_argument('--disable-web-security') 29options.add_argument('--disable-desktop-notifications') 30options.add_argument("--disable-extensions") 31options.add_argument('--lang=en') 32options.add_argument('--blink-settings=imagesEnabled=false') 33options.add_argument('--log-level=1') 34options.add_argument("--disable-blink-features=AutomationControlled") 35#headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'} 36options.add_argument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36") 37options.binary_location = "C:\\Program Files\\Google\\Chrome Beta\\Application\\chrome.exe" 38driver = webdriver.Chrome('chromedriver', options=options) 39 40 41 42 43#driver = webdriver.Chrome(executable_path='絶対パス') 44while num <= 3: 45 46 print("URL番号の値") 47 print(num) 48 print("===========================================") 49 50 #当選ページのURL 51 url = powerball_url + str(num) 52 53 print(url) 54 55 num += 1 # 次のページに移動するためにnumに1を追加 56 time.sleep(random.uniform(60, 120)) # 60-120秒Dos攻撃にならないようにするためにコードを止める 57 58''' 59 if num != 2: 60 cookies = pickle.load(open("cookies.pkl", "rb")) 61 for cookie in cookies: 62 driver.add_cookie(cookie) 63''' 64 65 #該当ページを取得 66 driver.get(url) 67 68''' 69 if num == 2: 70 pickle.dump(driver.get_cookies() , open("cookies.pkl","wb")) 71''' 72 73 74 time.sleep(5) 75 html = driver.page_source.encode('utf-8') 76 soup = BeautifulSoup(html, "html.parser") 77 print(soup.title) 78 #print(soup.html) 79 80 TABLES = [] 81 82 TABLES = soup.find('table', {'class': 'results pb'}) 83 84 #len(table) 85 #print(len) 86 #print(TABLES) 87 88 r = [] 89 lis = [] 90 91 92 lis = TABLES.find_all('li') ← エラーが起きている場所 93 94 for li in lis: # thead -> liタグを探す 95 r.append(li.text) # liタグのテキストを保存 96 mat.append(r) # 行をテーブルに保存 97 98 #print(mat[0]) 99 print("matの要素数=", len(mat)) 100 101

 +++++++++++++++++++++++++++++++++
↓ここからデータスクレイピング処理
+++++++++++++++++++++++++++++++++

試したこと

スリープを多めにとったり、Cookieを保存、読み出してリトライしましたがうまく動作しません。

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

※様々な場所からコピペしながらプログラムしているのでコメントは間違っているかもしれません、気にしないでください。

Python 3.10.8

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

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

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

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

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

CHERRY

2022/11/14 10:32

Python の場合、インデントが崩れると 正しく動きませんので、インデントがわかるように マークダウン記法を利用してコードを記載していただけないでしょうか。 https://teratail.com/help/question-tips#questionTips37 参照 ( コードが、 <code> から </> に変わっています。 )
rykss

2022/11/14 11:12

TABLESという変数が何もないようです。おそらくTableタグのスクレイピングが上手く行っていない可能性があります プログラム89行目にてエラーが発生しているので記載のコードをもう少し下の方まで記載してほしいです
aki1228

2022/11/14 11:35

CHERRYさん やっとソースを囲みました。。。。
aki1228

2022/11/14 11:37

rykssさん 1回目は(URLが1の時には正常に動作してます。) ○https://www.usamega.com/powerball/results/1 ✕https://www.usamega.com/powerball/results/2
CHERRY

2022/11/14 14:13

肝心のエラーが出ている箇所のコードが無いようです...
rykss

2022/11/14 14:19

なにも解決していませんが念のため… 原因ははっきりとはわかりませんが、「Just a moment」と表示されているのでやはりなにかしらのアクセス制限に引っかかっているのだと思います 通常のブラウザで表示してもその画面が再現できないため、再現出来るコードを載せるのもいいかも知れません(回答が得られやすくなるかも知れないです)
aki1228

2022/11/14 23:46

CHERRYさん どのようなスクレイピングコードをいれても 上記のようなエラーは2周目には起きると思っています。 多分 なんらかの連続したプログラムアクセスの制限に引っかかっているのではないかと推測されます。 なのでお手上げでこちらに投稿しました。
aki1228

2022/11/14 23:57

念のため、エラーの起きている場所をコードに加えました。
guest

回答1

0

ベストアンサー

回答としては怪しいのですが、投稿者様が発見した同類の症状がある質問・回答のざっくりとした訳です
リンク:https://stackoverflow.com/questions/64165726/selenium-stuck-on-checking-your-browser-before-accessing-url

今回の「Just a moment...」の文からしてcloudflareのボット対策に弾かれているようです
そういったセキュリティがあるサイトではseleniumを最適化しないといけないのですが、有志の方が作ってくれたものがあるようです。

undetected-chromedriver - ultrafunkamsterdamhttps://github.com/ultrafunkamsterdam/undetected-chromedriver
インストール:pip install undetected-chromedriver

中身はボット検知されにくいユーザーエージェントなどを都度付与しているようで(多分)、使い方は通常seleniumとあまり変わらないようです

python

1import undetected_chromedriver as uc 2url = "<WEBSITE>" 3driver= uc.Chrome() 4driver.get(url)

driverパスなどのオプションも

python

1#... 2options = us.ChromeOptions() 3#ここにオプション設定 4uc.Chrome(options=options) 5#...

となります
より詳細な情報は上記のgithubから見れるので気になる場合は見るといいかも知れません

投稿2022/11/15 07:50

編集2022/11/15 07:54
rykss

総合スコア100

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

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

aki1228

2022/11/15 09:08

ありがとうございます。 上記、試してみます。
aki1228

2022/11/16 05:09

rykssさん 結論から申し上げますと問題なく2以降のページの値を取得できるようになりました。 import undetected_chromedriver as uc url = "<WEBSITE>" driver= uc.Chrome() driver.get(url) こちらを利用したのでオプションはなくても動作するようです。 これからブラッシュアップして利用してみます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問