如何使用 Python 对亚马逊进行网络抓取

蟒蛇, 搜索, Mar-06-20245 分钟阅读

网络搜索是一种从互联网上提取数据并将其用于有意义的目的的艺术。它有时也被称为网络数据提取或网络数据采集。对于新手来说,这与从互联网上复制数据并将其存储在本地是一样的。不过,这是一个手动过程。网络抓取

网络搜索是一种从互联网上提取数据并将其用于有意义的目的的艺术。它有时也被称为网络数据提取或网络数据采集。对于新手来说,这与从互联网上复制数据并将其存储在本地是一样的。不过,这是一个手动过程。网络抓取是一种借助网络爬虫的自动化流程。网络爬虫使用 HTTP 协议连接到互联网,允许用户以自动方式获取数据。我们可以将互联网视为肥沃的土壤,将数据视为新的石油,而网络抓取就是提取石油的技术。

无论您是数据科学家、工程师还是营销人员,从互联网上抓取和分析数据的能力都已成为一项必不可少的技术。在各种使用案例中,网络搜刮都可能提供巨大帮助。在本文中,我们将使用 Python 从亚马逊搜索数据。最后,我们还将分析搜刮到的数据,看看它对普通人、数据科学家或经营电子商务商店的人来说有多重要。

提醒您一点:如果你是Python 和网络搜刮的新手,这篇文章可能会有点难懂。我建议您先阅读以下网站上的入门级文章 ProxyScrape的入门级文章,然后再来看这篇文章。

让我们开始编写代码吧。

导入图书馆

首先,我们将导入代码所需的所有必要库。这些库将用于数据搜刮和可视化。如果你想了解每个库的详细信息,可以访问它们的官方文档。

importpandasaspd
importnumpyasnp
importmatplotlib.pyplotasplt
importseabornassns
%matplotlib inline
importre
导入时间
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,并将 user-agent 作为参数传递。
  • 从 requests.get 提取内容。
  • 抓取指定页面并将其赋值给汤变量。

我们的重要数据所在的一些重要标签包括

  • 书名
  • 作者
  • 评级
  • 客户评分
  • 价格

如果检查给定的页面,就会看到父标签及其相应的元素。

 如果您想查看某个属性,请逐一查看。你会发现作者、书名、评分、价格、顾客评分等一些重要属性。 

在我们的代码中,我们将使用嵌套的 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 页开始到 page+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)

现在,我们将对评分、客户评分和价格列进行一些预处理。

  • 由于评分满分为 5 分,我们将删除多余的部分。
  • 我们将删除 customer_rated 列中的逗号。
  • 在价格栏中,我们将去掉卢比符号,并用圆点分割。
  • 最后,我们将把所有三列转换为整数或浮点数。
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(['Rating'],axis=0,ascending=False)[:15]
数据

最受好评的书籍

现在,我们将看到顾客评分最高的书籍和作者。我们将过滤掉评论少于 1000 条的作者和书籍,这样我们就能看到最著名的作者。

data= df[df['Customers_Rated'] > 1000].
data=data.sort_values(['Rating'],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
显示(p)

最受顾客好评的作家和书籍

评分越高,客户的信任度就越高。因此,如果我们添加客户评分最高的作者和书籍,就会更有说服力和可信度。

from bokeh.transformimport factor_cmap
from bokeh.modelsimport Legend
from bokeh.palettesimport Dark2_5 as palette
导入 itertools
从 bokeh.palettes导入 d3
#colors包含可用于绘图颜色列表
colors = itertools.cycle(palette)
 
palette = d3['Category20'][20]
index_cmap =factor_cmap('Author', palette=palette、
                         factors=data["Author"])
p=figure(plot_width=700,plot_height=700, title ="Top Authors:评分与客户评分")
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='客户评价
p.legend.location='top_left' (左上角
 
显示(p)

总结

在本文中,我们通过从亚马逊提取数据这一非常重要的用例,了解了什么是网络刮擦。我们不仅从不同的亚马逊页面中提取了数据,还使用不同的 Python 库将数据可视化。本文是一篇高级文章,对于初次接触网络抓取和数据可视化的人来说可能难以理解。对于他们来说,我建议阅读以下网站上的入门包文章 ProxyScrape.网络搜刮是一项非常有用的技术,可以为你的业务助一臂之力。市场上也有一些令人惊叹的付费工具,但如果你能编写自己的代码,为什么还要付费呢?我们上面编写的代码可能并不适用于每个网页,因为网页结构可能有所不同。但是,如果你已经理解了上述概念,那么根据网页结构修改代码,你就可以毫无障碍地搜刮任何网页了。希望这篇文章对读者有帮助。就写到这里。下篇再见!