技術

Amazonの商品個別ページのURLからASINを取得する

風邪を引いてしまいました。鼻風邪ってやつです。熱は大したことないですが頭痛が辛いです。

自動でネットをクロールしAmazonアソシエイトリンクを収集するロボットを作って、いわゆる話題の商品なんてのを見れると面白そうだなと寝ているときに思いつきまして、試しに色々実験しているところです。

サクっとクローラを作って、とりあえず10万URLほど集めてみましたが、自作のASIN抽出コードの精度が微妙に低いことに気が付きました。
ネット上でASIN抽出の正規表現なんかを検索してみましたが、なかなか決定版!といった雰囲気のある記事がなく。というか全体的に情報が古い。
正規表現で一発とはいきませんが、そのなかでも比較的新しく(それでも古め)、きちんと書かれてるっぽいウノウラボのAmazonの商品個別ページのURLからASINを取得するという記事を参考に、JavaScriptで書かれたサンプルをPythonに移植してみました。

def get_asin_from_url(url):
	'''
	urlからasinを抽出
	'''
	amazon_r = re.compile(r'^https?://(?:www\.)?amazon\.(?:com|ca|co\.uk|de|co\.jp|jp|fr|cn)/(.+)$')
	amazon = amazon_r.match(url)
	if not amazon:
		return None
	
	path = amazon.group(1)
	paths = path.split('/')
	if paths[0].lower() == 'exec':
		paths = paths[1:]
	if len(paths) <= 1 or paths[1] == '':
		return None
	
	if paths[0] in ['OBIDOS', 'obidos', 'o']:
		if paths[1].lower() == 'asin' and len(paths) >= 3 and paths[2] != '':
			return paths[2]
		else:
			isbn_r = re.compile(r'^isbn(?:=|%3d)(.+)$')
			isbn = isbn_r.match(paths[1])
			if isbn:
				return isbn.group(1)
			elif paths[1].lower() == 'tg' \
			and len(paths) >= 5 \
			and paths[2].lower() == 'detail' \
			and paths[3] == '-':
				is_asin_r = re.compile(r'^[0-9a-zA-Z]{10}$')
				is_asin = is_asin_r.match(paths[4])
				if is_asin:
					return paths[4]
				elif len(paths) >=6 and paths[5] != '':
					return paths[5]
	elif paths[0] == 'gp':
		gp_r = re.compile(r'^gp/product(?:/product-description)?/([0-9a-zA-Z]{10})')
		gp = gp_r.match(path)
		if gp:
			return gp.group(1)
	else:
		pd_r = re.compile(r'/?dp(?:/product-description)?/([0-9a-zA-Z]{10})')
		pd = pd_r.match(path)
		if pd:
			return pd.group(1)
	return None

見ての通り、元のJavaScriptのコードをそのまま馬鹿正直にPythonに書き換えた感じになってます。
アルゴリズム的にロバストさはあまりなさげな雰囲気ですが、誤認識がなくなったのでこれでよしとします。

とりあえず被参照回数の降順にAmazonの話題の商品を半手作業で集計してみましたが、みごとにアニメ関連の商品ばかりでした。
個人的にはPC関連商品が見れるとよかったんですが。
クロール開始ページの選定を誤ったかなw

コメントを残す

メールアドレスが公開されることはありません。



※画像をクリックして別の画像を表示

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください