PythonでAmazonをWebスクレイピングする方法

パイソン, スクレイピング, 月-1920215分で読める

ウェブスクレイピングとは、インターネットからデータを抽出し、有意義な目的に利用する技術である。ウェブ・データ抽出やウェブ・データ・ハーベスティングと呼ばれることもある。初心者にとっては、インターネットからデータをコピーしてローカルに保存するのと同じです。ただし、手作業になります。ウェブスクレイピング

ウェブスクレイピングとは、インターネットからデータを抽出し、有意義な目的に利用する技術である。ウェブ・データ抽出やウェブ・データ・ハーベスティングと呼ばれることもある。初心者にとっては、インターネットからデータをコピーしてローカルに保存するのと同じです。しかし、これは手作業です。ウェブスクレイピングは、ウェブクローラーの助けを借りて動作する自動化されたプロセスです。ウェブクローラーはHTTPプロトコルを使ってインターネットに接続し、ユーザーが自動化された方法でデータを取得できるようにする。インターネットは肥沃な土壌であり、データは新しい油であると考えることができる。

インターネットからデータをスクレイピングして分析する能力は、あなたがデータサイエンティストであれ、エンジニアであれ、マーケターであれ、必要不可欠な技術となっている。ウェブスクレイピングが大いに役立つユースケースは様々あるだろう。この記事では、Pythonを使ってAmazonからデータをスクレイピングする。最後に、スクレイピングされたデータを分析し、一般人、データサイエンティスト、Eコマースストアを運営する人にとって、それがどれだけ重要かを見てみよう。

ちょっとした注意事項です:もしあなたがPythonやウェブスクレイピングに慣れていないなら、この記事を理解するのは少し難しいかもしれない。にある入門レベルの記事を一通り読んでから、この記事に来ることをお勧めします。 ProxyScrapeにある入門レベルの記事を読んでから、この記事に来ることをお勧めします。

さっそくコードを書いてみよう。

ライブラリのインポート

まず最初に、コードに必要なすべてのライブラリをインポートする。これらのライブラリーは、データのスクレイピングとビジュアライズに使用される。それぞれの詳細を知りたい場合は、公式ドキュメントを参照してほしい。

pandas を pdとして インポートする
npとしてnumpy をインポート
importmatplotlib.pyplotasplt
importseabornassns
matplotlib インライン
インポートre
importtime
fromdatetimeimportdatetime
importmatplotlib.datesasmdates
importmatplotlib.tickerasticker
fromurllib.requestimporturlopen
frombs4importBeautifulSoup
インポートリクエスト

アマゾン・データのスクレイピング

では、アマゾンのベストセラー本から有益な情報をスクレイピングしてみよう。スクレイピングするURLは以下の通り:

https://www.amazon.in/gp/bestsellers/books/ref=zg_bs_pg_’+str(pageNo)+’?ie=UTF8&pg=’+str(pageNo)

すべてのページにアクセスする必要があるので、各ページをループして必要なデータセットを取得する。 

URLに接続し、HTMLコンテンツをフェッチするには、以下が必要である、

  • get_data:この関数は、引数としてページ番号を入力するために使用される。
  • user-agent: 検出を回避するのに役立ちます。
  • request.getにURLを指定し、引数としてユーザーエージェントを渡す。
  • requests.getから内容を取り出す。
  • 指定されたページをスクレイピングし、soup変数に代入する。

私たちの重要なデータが格納される重要なタグには、以下のようなものがある、

  • 書籍名
  • 著者
  • 評価
  • お客様の評価
  • 価格

指定されたページを検査すると、親タグとそれに対応する要素が表示される。

 特定の属性を調べたい場合は、それぞれの属性に移動して調べる。著者、書籍名、評価、価格、顧客の評価など、重要な属性が見つかります。 

私たちのコードでは、amazonに登録していない著者に特別な調査結果を適用するために、入れ子になったif-else文を使用します。 

no_pages = 2
 
def get_data(pageNo):  
    headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0", "Accept-Encoding":"gzip, deflate", "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "DNT":"1","Connection":"close", "Upgrade-Insecure-Requests":"1"}
 
    r = requests.get('https://www.amazon.in/gp/bestsellers/books/ref=zg_bs_pg_'+str(pageNo)+'?ie=UTF8&pg='+str(pageNo), headers=headers)#, proxies=proxies)
    content = r.content
    soup = BeautifulSoup(content)
    #print(soup)
 
    alls = []
    for d in soup.findAll('div', attrs={'class':'a-section a-spacing-none aok-relative'}):
        #print(d)
        name = d.find('span', attrs={'class':'zg-text-center-align'})
        n = name.find_all('img', alt=True)
        #print(n[0]['alt'])
        author = d.find('a', attrs={'class':'a-size-small a-link-child'})
        rating = d.find('span', attrs={'class':'a-icon-alt'})
        users_rated = d.find('a', attrs={'class':'a-size-small a-link-normal'})
        price = d.find('span', attrs={'class':'p13n-sc-price'})
 
        all1=[]
 
        if name is not None:
            #print(n[0]['alt'])
            all1.append(n[0]['alt'])
        else:
            all1.append("unknown-product")
 
        if author is not None:
            #print(author.text)
            all1.append(author.text)
        elif author is None:
            author = d.find('span', attrs={'class':'a-size-small a-color-base'})
            if author is not None:
                all1.append(author.text)
            else:    
                all1.append('0')
 
        if rating is not None:
            #print(rating.text)
            all1.append(rating.text)
        else:
            all1.append('-1')
 
        if users_rated is not None:
            #print(price.text)
            all1.append(users_rated.text)
        else:
            all1.append('0')     
 
        if price is not None:
            #print(price.text)
            all1.append(price.text)
        else:
            all1.append('0')
        alls.append(all1)    
    return alls

これは以下の機能を果たす、

  • forループの中でデータを収集する。
  • このループは、各ページを1から1ページずつ繰り返し処理する。
  • まずリストを平坦化し、それをDataFrameに渡す必要がある。
  • 最後に、データフレームをCSVファイルとして保存する。
for i in range(1,no_pages+1):
    results.append(get_data(i))
flatten = lambda l:[item for sublist in l for item in sublist].
df = pd.DataFrame(flatten(results),columns=['Book Name','Author','Rating','Customers_Rated','Price'])
df.to_csv('amazon_products.csv', index=False, encoding='utf-8')

CSVファイルの読み込み

次にcsvファイルを読み込む、

df =pd.read_csv("amazon_products.csv")
df.shape

データフレームの形状は、CSVファイルに100行5列があることを示している。

データセットの5行を見てみよう、

df.head(61)

ここでは、rating、customers_rated、priceカラムの前処理を行う。

  • 評価は5点満点なので、余計な部分は削除する。
  • customer_ratedカラムからカンマを取り除く。
  • 価格欄ではルピー記号を削除し、ドットで分割する。
  • 最後に、3つの列をすべて整数または浮動小数点に変換する。
df['Rating']= df['Rating'].apply(lambda x: x.split()[0])
df['Rating']= pd.to_numeric(df['Rating'])
df["Price"]= df["Price"].str.replace('₹','')
df["Price"] = df["Price"].str.replace(',','')
df['Price']= df['Price'].apply(lambda x: x.split('.')[0])
df['Price']= df['Price'].astype(int)
df["Customers_Rated"]= df["Customers_Rated"].str.replace(',','')
df['Customers_Rated']= pd.to_numeric(df['Customers_Rated'], errors='ignore')
df.head()

データフレームのタイプを見てみよう、

上の出力には不完全な情報がある。まずNaNの数を数え、それから削除する。

df.replace(str(0), np.nan,inplace=True)
df.replace(0, np.nan,inplace=True)
count_nan = len(df) - df.count()
count_nan
df =df.dropna()

作家別最高値本

これから、最も高額な本を出版したすべての著者を知ることになる。その中からトップ20を紹介しよう。

data=data.sort_values(['評価'],axis=0,ascending=False)[:15].
データ

人気書籍

顧客評価の高い本と著者を表示します。レビュー数が1000未満の著者や本は除外され、最も有名な著者が表示されます。

data= df[df['Customers_Rated'] > 1000].
data=data.sort_values(['評価'],axis=0,ascending=False)[:15].
データ

上位にランクインしている本を可視化してみよう、

p = figure(x_range=data.iloc[:,0],plot_width=800,plot_height=600,title="顧客評価1000人以上の人気書籍",toolbar_location=None,tools="")
 
p.vbar(x=data.iloc[:,0],top=data.iloc[:,2],width=0.9)
 
p.xgrid.grid_line_color = None
p.y_range.start = 0
p.xaxis.major_label_orientation = math.pi/2
show(p)

お客様から最も評価の高い著者と書籍

評価が高ければ高いほど、顧客からの信頼も厚くなる。そのため、顧客から最も高い評価を得ている著者や書籍を追加すれば、より説得力が増し、信頼性が高まります。

from bokeh.transformimport factor_cmap
from bokeh.modelsimport レジェンド
from bokeh.palettesimport Dark2_5 as palette(パレットとしてDark2_5をインポート
インポート itertools
from bokeh.palettesimport d3
#colorsは プロットで使用できる色のリストです。
colors = itertools.cycle(palette)
 
パレット = d3['Category20'][20]
index_cmap =factor_cmap('Author', palette=palette、
                         factors=data["Author"])
p=figure(plot_width=700,plot_height=700, title = "トップ著者:評価 vs. 評価された顧客")
p.scatter('Rating','Customers_Rated',source=data,fill_alpha=0.6, fill_color=index_cmap,size=20,legend='Author')
p.xaxis.axis_label='RATING'
p.yaxis.axis_label='CUSTOMERS RATED'
p.legend.location='top_left'
 
表示(p)

まとめ

この記事では、Amazonからデータを抽出するという非常に重要なユースケースを取り上げ、Webスクレイピングとは何かを見てきた。様々なamazonのページからデータを抽出するだけでなく、様々なPythonライブラリを使ってデータを可視化しました。この記事は上級レベルの記事であり、ウェブスクレイピングやデータ可視化の初心者には理解しにくいかもしれない。そのような方には、以下のスターターパックの記事をお勧めする。 ProxyScrape.ウェブスクレイピングは、あなたのビジネスを後押ししてくれるとても便利なテクニックだ。市場には素晴らしい有料ツールもあるが、自分でスクレイパーをコード化できるのに、なぜ有料なのか。上に書いたコードは、ページの構造が異なるため、すべてのウェブページで機能するとは限りません。しかし、もしあなたが上記のコンセプトを理解したのであれば、その構造に応じてコードを修正することで、どんなウェブページでもスクレイピングできるようになる。この記事が読者にとって興味深いものであれば幸いである。以上である。また次の記事でお会いしましょう!