技術

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

この前書いたAmazonの商品個別ページのURLからASINを取得するというエントリに載せた、ウノウのアレを移植した関数で色々試してみてたところ、なんか思ったよりもASINを抽出出来る割合が少ないというか取りこぼしが多いんじゃないかという気がしたため、真面目に自力で作ってみました。(正直汚ねぇコードだなーとも思ってたし。)

処理内容は、amazonのurlかチェックして、もしそうならasinを含むかどうかチェックするという感じです。

def get_asin_from_url(url):
	'''urlからasinを抽出'''
	url = url.lower()
	amazon_r = re.compile(r'^https?://(?:[^.]+\.)?(?:images-)?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)
	
	pattern = '''
	(?:	# 以下のパターンのいずれかから始まり(一応URLエンコードした値も併記)
		/asin/| %2fasin%2f|
		&asins?=| %26asins?%3d|
		=asin/| %3dasin%2f|
		&a=| %26a%3d|
		/dp/| %2fdp%2f|
		/dp/accessories/| %2fdp%2faccessories%2f|
		/dp/artist-redirect/| %2fdp%2fartist-redirect%2f|
		/dp/product-details/| %2fdp%2fproduct-details%2f|
		/dp/samples/| %2fdp%2fsamples%2f|
		/exec/obidos/isbn/| %2fexec%2fobidos%2fisbn%2f|
		/gp/offer-listing/| %2fgp%2foffer-listing%2f|
		/gp/product/| %2fgp%2fproduct%2f|
		/gp/product/images/| %2fgp%2fproduct%2fimages%2f|
		/gp/product/product-description/| %2fgp%2fproduct%2fproduct-description%2f|
		/gp/product/toc/| %2fgp%2fproduct%2ftoc%2f|
		/images/p/| %2fimages%2fp%2f|
		/product-reviews/| %2fproduct-reviews%2f|
		/sim/| %2fsim%2f	# 最後は縦棒を付けない!
	)
	([0-9a-z]{10}) # The ASIN!
	(?:	# 以下のパターンのいずれかで終わる
		/|
		\?|
		&|
		\.|
		%|
		$
	)
	'''
	asin_r = re.compile(pattern, re.VERBOSE)
	asin = asin_r.search(path)
	if asin:
		return asin.group(1).upper()
	else:
		return None

でまぁ、テストデータとしてasinを含むかどうかに限らず様々なパターンのamazonのurlを約18,000件ぐらい用意しまして、今回の関数と前回の関数にかけてみました。
今回の関数だと、約18,000件中約16,000件からasinを抽出出来ました。
もちろんテストケースと目視でざっと確認したところ、おかしい点は見当たりませんでした。(取りこぼしや、asinじゃないものを誤認識する事は無いようでした。)
もちろん精度100%ではないと思いますが。
一方、前回の関数だと、約18,000件中約7,000件しかasinを抽出出来ませんでした。

ダメっすね。ウノ…ゲフンゲフン

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です



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

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