前提・実現したいこと
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
あなたの回答
tips
プレビュー