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

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

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

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

Q&A

1回答

1144閲覧

Pythonスクレイピングに詳しい方に質問です!(初心者)

Hyde_5348

総合スコア0

Python

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

0グッド

0クリップ

投稿2022/05/13 12:10

from selenium import webdriver
import time
import pandas
from webdriver_manager.chrome import ChromeDriverManager

#キーワード入力
search_word = input("検索キーワード=")

メルカリ

url = 'https://www.mercari.com/jp/search/?keyword=' + search_word

chromedriverの設定とキーワード検索実行

driver = webdriver.Chrome(ChromeDriverManager().install())
driver.set_window_size(1200,1000)
driver.get(url)

ページカウントとアイテムカウント用変数

page = 1
item_num = 0
item_urls = []

while True:
print("Getting the page {} ...".format(page))
time.sleep(1)
items = driver.find_elements_by_class_name("ItemGrid__ItemGridCell-sc-14pfel3-1")
for item in items:
item_num += 1
item_url = item.find_element_by_css_selector("a").get_attribute("href")
print("item{0} url:{1}".format(item_num, item_url))
item_urls.append(item_url)
page += 1

try: next_page = driver.find_element_by_css_selector("li.pager-next .pager-cell:nth-child(1) a").get_attribute("href") driver.get(next_page) print("next url:{}".format(next_page)) print("Moving to the next page...") except: print("Last page!") break

アイテムカウントリセットとデータフレームセット

item_num = 0
columns = ["item_name", "cat1", "cat2", "cat3", "brand_name", "product_state", "price", "url"]
df = pandas.DataFrame(columns=columns)

try: # エラーで途中終了時をtry~exceptで対応
# 取得した全URLを回す
for product_url in item_urls:
item_num += 1
print("Moving to the item {}...".format(item_num))
time.sleep(1)
driver.get(product_url)

time.sleep(2) item_name = driver.find_element_by_xpath("//mer-heading[@class='mer-spacing-b-2']").get_attribute("title-label") print("Getting the information of {}...".format(item_name)) cat = driver.find_elements_by_xpath("//a[@data-location='item:item_detail_table:link:go_search']") cat1 = cat[0].accessible_name cat2 = cat[1].accessible_name cat3 = cat[2].accessible_name try: # 存在しない⇒a, divタグがない場合をtry~exceptで対応 brand_name = driver.find_element_by_css_selector("table.item-detail-table tbody tr:nth-child(3) td a div").text except: brand_name = "" product_state = driver.find_element_by_xpath("//span[@data-testid='商品の状態']").text price = driver.find_element_by_xpath("//mer-price").get_attribute("value") price = price.replace("¥", "").replace(" ","").replace(",", "") print(cat1) print(cat2) print(cat3) print(brand_name) print(product_state) print(price) print(product_url) se = pandas.Series([item_name, cat1, cat2, cat3, brand_name, product_state, price, product_url], columns) df = df.append(se, ignore_index=True) print("Item {} added!".format(item_num))

except:
print("Error occurred! Process cancelled but the added items will be exported to .csv")

#df.to_csv("{}.csv".format(search_word), index=False, encoding="utf_8")
df.to_csv("{}.csv".format(search_word), index=False, encoding="utf_8_sig")
driver.quit()

print("Scraping is complete!")

先日、サイトをみながらこのようなコードを模写していたのですが、サイトの構造が変わってしまい、もう一度同じようなプログラムを作りたいのですが、Webサイトの検証モードの使い方に慣れていなくて、いちいちどこの要素を指しているのかわかりません。

初心者にもわかりやすく教えて頂きたいです。

まず、こちらがどの要素を抜き出しているのかわかりません。
driver.find_elements_by_class_name("ItemGrid__ItemGridCell-sc-14pfel3-1")

次にこのby css_selectorでの特定もよくわかりません。
item.find_element_by_css_selector("a").get_attribute("href")

とりあえず、この二点を教えてほイメージ説明

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

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

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

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

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

y_waiwai

2022/05/13 12:31

このままではコードが読めないので、質問を編集し、</>(コードの挿入)ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
AbeTakashi

2022/05/13 13:44 編集

メルカリは利用規約でスクレイピングを禁止しています 参考) https://help.jp.mercari.com/guide/articles/900/ その他、不適切と判断される行為(禁止されている行為) 抜粋 弊社が提供するインターフェイスとは別の手法を用いてサービスにアクセスすること 質問者さんがこれを遵守するかしないかの問題は別にして、公の場で質問する場合は「特定のサイトの話」にはせずに「一般論」として質問した方がいいと思いますよ。
guest

回答1

0

とりあえず、この二点を教えてほ

まず、こちらがどの要素を抜き出しているのかわかりません。
driver.find_elements_by_class_name("ItemGrid__ItemGridCell-sc-14pfel3-1")

ItemGrid__ItemGridCell-sc-14pfel3-1というクラス名のタグを抜き出しています。

次にこのby css_selectorでの特定もよくわかりません。
item.find_element_by_css_selector("a").get_attribute("href")

aタグのhref属性を抜き出しています。

これでわからないとすると、HTMLやCSSの知識が皆無と言うことなので、まずそこを勉強しないことには話が始まりません。HTML入門や、CSS入門のページはいくらでもあるので、まず、HTMLを読み書き出来るようになりましょう。スクレイピングをするのはそれからです。

投稿2022/05/13 12:51

otn

総合スコア86295

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問