🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
スクレイピング

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

Python

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

selenium

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

Q&A

2回答

2243閲覧

SeleniumでURLを取得したいがエラーがでる

Yuu412

総合スコア37

スクレイピング

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

Python

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

selenium

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

0グッド

1クリップ

投稿2019/10/12 14:45

編集2019/10/12 18:20

PythonでSeleniumを用いてWebスクレイピングの勉強をしています。
"serch word"をメルカリで検索をかけて、出てきた商品それぞれのURLを取得したいのですが、下記のようにエラーが出力され思い通りにプログラムが動きません。

どこか間違えているところや解決策が思い浮かんだ方がいらっしゃればご回答宜しくお願い致します。

Python

1import pandas as pd 2from selenium import webdriver 3import time 4import sys 5import os 6import csv 7 8driver = webdriver.Chrome(executable_path=r'C:\Selenium_re\chromedriver.exe') # ブラウザを起動 9 10serch_word = "ルンバ" #検索ワードを設定 11words = serch_word.split(" ") 12serch_words = words[0] 13for i in range(1,len(words)): 14 serch_words = serch_words + "+" + words[i] 15 16#URLを設定する 17url = "https://www.mercari.com/jp/search/?keyword=" + serch_words #メルカリのURLを設定 18 19page = 1 20 21#リストを作成 22columns = ["Name","price","sold","URL"] 23df = pd.DataFrame(columns=columns) 24 25#設定したURLを開く 26driver.get(url) # urlを開く 27 28''' 29try: 30''' 31while page <= 100: 32 #商品ごとのページ情報を取得(CSSの情報で選択している) 33 posts = driver.find_elements_by_css_selector("body > div.default-container > main > div.l-content > section > div.items-box-content.clearfix > section:nth-child(1) > a") #例ではitem-boxの前にピリオドある 34 #何ページの情報を取得しているか表示 35 print(str(page) + "ページを取得中") 36 37 #商品ごとの名前や価格、購入済みかどうか、URLを取得 38 for post in posts: 39 #商品名 40 title = post.find_element_by_css_selector("body > div.default-container > main > div.l-content > section > div.items-box-content.clearfix > section:nth-child(1) > a > div > h3").text 41 42 #商品価格 43 price = post.find_element_by_css_selector("body > div.default-container > main > div.l-content > section > div.items-box-content.clearfix > section:nth-child(1) > a > div > div > div.items-box-price.font-5").text 44 45 #余計なものを削除 46 price = price.replace('¥', '') 47 price = price.replace(',', '') 48 49 #購入済み = 1, 未購入 = 0 50 sold = 0 51 if len(post.find_elements_by_css_selector("item-sold-out-badge")) > 0: 52 sold = 1 53 54 #URLを取得 55 URL = post.find_element_by_css_selector("a").get_attribute("href") 56 se = pd.series([title, price, sold, URL],columns) 57 df = df.append(se, columns) 58 59 page += 1 60 #次のページに進むためのURLを取得 61 url = driver.find_element_by_css_selector('body > div.default-container > main > div.l-content > ul > li.pager-next.visible-pc > ul > li:nth-child(1)').get_attribute('href') 62 print("Morving to next page.....") 63''' 64except: 65''' 66print("Next page is nothing") 67 68driver.quit 69 70filename = "mercari" + serch_word + ".csv" 71df.to_csv(filename, encoding = 'utf-8-sig') 72
1ページを取得中 Traceback (most recent call last): File "C:\Python\test0.py", line 55, in <module> URL = post.find_element_by_css_selector("a").get_attribute("href") File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\selenium\webdriver\remote\webelement.py", line 430, in find_element_by_css_selector return self.find_element(by=By.CSS_SELECTOR, value=css_selector) File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\selenium\webdriver\remote\webelement.py", line 659, in find_element {"using": by, "value": value})['value'] File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\selenium\webdriver\remote\webelement.py", line 633, in _execute return self._parent.execute(command, params) File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute self.error_handler.check_response(response) File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"a"} (Session info: chrome=77.0.3865.120)

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

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

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

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

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

meg_

2019/10/13 05:44

メルカリはスクレイピング禁止のようです。 コードとしてはページ読み込み完了を待って処理する必要があるかと思います。
guest

回答2

0

全体的にCSSセレクタに頼り過ぎています。
このDOMはclass属性が豊富なのでそちらをメインにしてあげるといいでしょう。

python

1page = 1 2while page < 100: 3 print(str(page) + 'page now') 4 for post in driver.find_elements_by_class_name('items-box'): 5 6 # 4要素取得 7 title = post.find_element_by_class_name('items-box-name').text 8 price = post.find_element_by_class_name('items-box-price').text.replace('¥','').replace(',','') 9 sold = 1 if len(post.find_elements_by_class_name('item-sold-out-badge')) > 0 else 0 10 url = post.find_element_by_tag_name('a').get_attribute('href') 11 12 # ここでパンダ処理 13 14 # 次のページへ 15 try: 16 if page == 1: 17 driver.find_elements_by_class_name('pager-cell')[5].post.find_element_by_tag_name('a').click() 18 else: 19 driver.find_elements_by_class_name('pager-cell')[7].post.find_element_by_tag_name('a').click() 20 sleep(5) 21 except IndexError: 22 break 23 page = page + 1 24 print('go to next page') 25 26print('done!') 27driver.quit() 28exit()

投稿2019/10/13 15:48

shirai

総合スコア1290

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

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

0

エラーメッセージとコードが合わないので、思っているのと違うファイルを実行しています。

投稿2019/10/12 15:08

otn

総合スコア85882

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

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

Yuu412

2019/10/12 18:21

試行錯誤していた別のファイルを間違えて投稿していました。 差し替えましたので再度宜しくお願い致します。
otn

2019/10/13 10:23

エラーメッセージは、 Message: no such element: Unable to locate element: {"method":"css selector","selector":"a"} です。 行番号が合いませんが、 > URL = post.find_element_by_css_selector("a").get_attribute("href") が該当行のようなので、postの中にaタグがないのでしょう。 おそらく、 posts = driver.find_elements_by_css_selector("body > div.default-container > main > div.l-content > section > div.items-box-content.clearfix > section:nth-child(1) > a") が間違えているんでしょうね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問