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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

Python

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

Scrapy

Scrapyは、Pythonで開発されたオープンソースソフトウェアです。スクレイピングという、Webサービスから必要な情報を取り出したり自動操作をしたりする技術を使うものです。

Q&A

0回答

1057閲覧

[scapy]Amazonページの画像URLに該当するタグが抽出できない

chiguh28

総合スコア0

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

Python

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

Scrapy

Scrapyは、Pythonで開発されたオープンソースソフトウェアです。スクレイピングという、Webサービスから必要な情報を取り出したり自動操作をしたりする技術を使うものです。

0グッド

0クリップ

投稿2021/08/28 16:54

前提・実現したいこと

Amazonのページから商品画像のURLを取得したいと思っています。

やり方としては下記画像の赤枠で囲った箇所の画像1枚ごとのタグ(liタグ)をBeautifulsoupのselectメソッドで取得し、
liタグの中にimgタグがありますので、imgタグのsrc部分を抽出してリストに追加していくという方法です。

イメージ説明

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

Beautifulsoupのselectメソッドでliタグを指定しても該当タグが一つも取得できない

該当のソースコード

python

1from bs4 import BeautifulSoup 2from ec_site_scrapy.items import EcSiteScrapyItem 3import re 4 5 6class ItemParser(): 7 def __init__(self, response) -> None: 8 self.soup = BeautifulSoup(response.body, "html.parser") 9 self.response = response 10 11 12class AmazonItemParser(ItemParser): 13 def parse(self): 14 name = self.get_name() 15 description = self.get_description() 16 price = self.get_price() 17 seller_url = self.get_seller_url() 18 code = self.get_code() 19 img_list = self.get_image() 20 21 return EcSiteScrapyItem( 22 name=name, 23 description=description, 24 price=price, 25 seller_url=seller_url, 26 code=code, 27 img_list=img_list, 28 item_url=self.response.url 29 ) 30 31 def get_price(self): 32 selected_html = self.soup.select('.a-span12 span.a-color-price') 33 34 if not selected_html: 35 selected_html = self.soup.select( 36 '.a-color-base span.a-color-price') 37 38 pattern = r'\d*,?\d*,?\d*\d' 39 regex = re.compile(pattern) 40 matches = re.findall(regex, selected_html[0].text) 41 price = matches[0].replace(',', '') 42 return int(price) 43 44 def get_name(self): 45 selected_html = self.soup.select('#productTitle') 46 title = selected_html[0].text 47 title = title.replace(' ', '') 48 title = title.replace('\n', '') 49 return title 50 51 def get_description(self): 52 selected_html = self.soup.find_all( 53 'ul', class_='a-unordered-list a-vertical a-spacing-mini') 54 if len(selected_html) > 0: 55 description = selected_html[0].get_text() 56 else: 57 description = '' 58 return description 59 60 def get_image(self): 61 # 今回の画像取得に該当するメソッドになります。 62 63 img_list = [] 64 65 selected_html = self.soup.select( 66 'li.a-spacing-small.item.imageThumbnail.a-declarative') 67 print(selected_html) # ここの出力結果が空配列になっている 68 print(len(selected_html)) 69 if len(selected_html) > 0: 70 for select in selected_html: 71 img_tag = select.find('img') 72 img_list.append(img_tag['src']) 73 74 return img_list 75 76 def get_code(self): 77 CODE_INDEX = 5 78 selected_html = self.soup.find('div', id='detailBullets_feature_div') 79 80 if selected_html: 81 regist_info_text = selected_html.get_text() 82 83 regist_info_text_list = regist_info_text.split("\n") 84 85 for index, text_line in enumerate(regist_info_text_list): 86 if 'ASIN' in text_line: 87 # ASINが見つかった4つ後ろにコードが存在する /n:/nコード 88 code = regist_info_text_list[index + CODE_INDEX] 89 break 90 elif 'JAN' in text_line: 91 code = regist_info_text_list[index + CODE_INDEX] 92 break 93 else: 94 code = '' 95 96 return code 97 else: 98 return '' 99 100 def get_seller_url(self): 101 selected_html = self.soup.select('#merchant-info') 102 103 if selected_html: 104 # 最初のaタグが出品者情報になる 105 a_tag = selected_html[0].find('a') 106 return self.response.urljoin(a_tag['href']) 107 108 selected_html = self.soup.find_all( 109 'span', class_='tabular-buybox-text') 110 if len(selected_html) == 4: 111 a_tag = selected_html[3].find('a') 112 return self.response.urljoin(a_tag['href']) 113 114 return 'https://www.amazon.co.jp/gp/help/customer/display.html?nodeId=202008070' 115

試したこと

Googleのデベロッパーツールで該当CSSを検索かけてヒットすることは確認していますので、
取得できると思っていたのですが、何故か取れずに困っています。
もし、何か情報を知っていましたら教えていただきたく思います。

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

request部分に関してはscrapy2.5.0を利用しています。

環境は下記になります。
Windows10
python 3.7.8

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

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

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

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

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

meg_

2021/08/29 01:54

Amazonの利用規約には「この利用許可には・・・(省略)・・・データマイニング、ロボットなどのデータ収集・抽出ツールの使用は、一切含まれません。」との記述がありますがスクレイピンングしても大丈夫でしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問