【python】副業もできる!スクレイピングウエブブラウザ自動操作BeautifulSoup編

ブラウザ操作

seleniumに続きBeautifulSoupのスクレイピングもアップしました。Amazonサイトから商品一覧をCSVに出力する例です。selenium編と比較してみることで、より深くスクレイピングの実際をご理解いただけるかと思っています。

#副業
#BeautifulSoup
#python
#プログラム

0:00:00 イントロ
0:00:10 スクレイピングの代表
0:02:00 ➀動かなくなるのを回避
0:07:36 ②BeautifulSoupのすっきりしたコード
0:13:24 ③画像を見える形でcsvに表示
0:16:25 エンディング

◆動画で紹介したプログラム
※開発環境はpycharmです。2022年3月時点で動作しています。コードは自己責任の上、ご自由にお使いください。

【selenium_amazon.py】
import csv
import datetime
from urllib.request import Request, urlopen

from bs4 import BeautifulSoup

# スクレイピング対象のURL(Amazonサイトの時計 ロレックスで検索した結果のページ)
url = ‘https://www.amazon.co.jp/s?k=%E6%99%82%E8%A8%88+%E3%83%AD%E3%83%AC%E3%83%83%E3%82%AF%E3%82%B9&__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2PIXHDK7JAZMT&sprefix=%E6%99%82%E8%A8%88+%E3%83%AD%E3%83%AC%E3%83%83%E3%82%AF%E3%82%B9%2Caps%2C177&ref=nb_sb_noss_1’
hdr =
‘User-Agent’: ‘Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11’,
‘Accept’: ‘text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8’,
‘Accept-Charset’: ‘ISO-8859-1,utf-8;q=0.7,*;q=0.3’,
‘Accept-Encoding’: ‘none’,
‘Accept-Language’: ‘ja-JP,en-US;q=0.7,en-GB;q=0.3’,
‘Connection’: ‘keep-alive’

req = Request(url, headers=hdr)
page = urlopen(req)
soup = BeautifulSoup(page, “lxml”)

# 商品のまとまりのタグをリストで取得(classがsg-col-innerであるdivの要素を全て取得)
goods_list = soup.find_all(‘div’, ‘class’: ‘sg-col-inner’)

maker_list = soup.findAll(‘span’, ‘class’: ‘a-size-base-plus a-color-base’)
price_list = soup.findAll(‘span’, ‘class’: ‘a-price-whole’)
image_list = soup.findAll(‘img’, ‘class’: ‘s-image’)
description_list = soup.findAll(‘span’, ‘class’: ‘a-size-base-plus a-color-base a-text-normal’)

# 以下のコメントを外すと、コンソールで取得できた要素を見ることができます。
# for maker in maker_list:
# print(maker.string.strip())
# for price in price_list:
# print(price.string.strip())
# for image in image_list:
# print(image.get(‘src’))
# for description in description_list:
# print(description.string.strip())

# print(len(goods_list))
# print(len(maker_list))
# print(len(price_list))
# print(len(image_list))
# print(len(description_list))

# CSV形式でファイル出力
today = datetime.datetime.now().strftime(‘%Y.%m.%d’)
with open(‘Amazon’ + str(today) + ‘.csv’, ‘w’, encoding=’CP932′, errors=’replace’) as f:
writer = csv.writer(f, lineterminator=”n”)
writer.writerow([‘No’, ‘商品名’, ‘値段’, ‘画像URL’, ‘画像’, ‘商品説明’])
no = 1
previousMaker, previousPrice, previousImage, previousDescription = ”, ”, ”, ”
for goods in goods_list:
try:
maker = goods.find(‘span’, ‘class’: ‘a-size-base-plus a-color-base’).string.strip()
except:
maker = ‘[No Maker]’
try:
price = goods.find(‘span’, ‘class’: ‘a-price-whole’).string.strip()
except:
price = ‘[No Price]’
try:
image = goods.find(‘img’, ‘class’: ‘s-image’).get(‘src’)
except:
image = ‘[No Image]’
try:
description = goods.find(‘span’, ‘class’: ‘a-size-base-plus a-color-base a-text-normal’).string.strip()
except:
description = ‘[No Description]’
if not ((maker == ‘[No Maker]’ or maker == ”)
and price == ‘[No Price]’ and image == ‘[No Image]’
and description == ‘[No Description]’) and
not (maker == previousMaker and price == previousPrice
and image == previousImage and description == previousDescription):
writer.writerow([no, maker, price, image, ‘=IMAGE(D’ + str(no + 1) + ‘)’, description])
no += 1
previousMaker = maker
previousPrice = price
previousImage = image
previousDescription = description

Pythonでスクレイピング、BeautifulSoupでAmazonサイトの例をPycharmで開発してたプログラムを解説しています。

コメント

タイトルとURLをコピーしました