داكن proxyscrape شعار

كيفية كشط الويب الأمازون مع بايثون

بايثون ، كشط ، 03-مايو-20215 دقائق للقراءة

Web scraping is the art of extracting data from the internet and using it for meaningful purposes. It is also sometimes known as web data extraction or web data harvesting. For newbies, it is just the same as copying data from the internet and storing it locally. However, it is a manual process. Web scraping

تجريف الويب هو فن استخراج البيانات من الإنترنت واستخدامها لأغراض ذات معنى. يعرف أيضا أحيانا باسم استخراج بيانات الويب أو حصاد بيانات الويب. بالنسبة للمبتدئين ، يشبه الأمر نسخ البيانات من الإنترنت وتخزينها محليا. ومع ذلك ، فهي عملية يدوية. تجريف الويب هو عملية آلية تعمل بمساعدة برامج زحف الويب. تتصل برامج زحف الويب بالإنترنت باستخدام بروتوكول HTTP وتسمح للمستخدم بجلب البيانات بطريقة آلية. يمكن للمرء أن يعتبر الإنترنت تربة مخصبة وبيانات مثل النفط الجديد ، في حين أن تجريف الويب هو تقنية لاستخراج هذا النفط.

أصبحت القدرة على كشط البيانات وتحليلها من الإنترنت تقنية أساسية سواء كنت عالم بيانات أو مهندسا أو مسوقا. قد تكون هناك حالات استخدام مختلفة قد يكون فيها تجريف الويب مفيدا للغاية. في هذه المقالة ، سنقوم بكشط البيانات من Amazon باستخدام Python. أخيرا ، سنقوم أيضا بتحليل البيانات المسروقة ومعرفة مدى أهميتها لأي شخص عادي أو عالم بيانات أو شخص يدير متجرا للتجارة الإلكترونية.

فقط القليل من الاحتياطات: إذا كنت جديدا على Python وكشط الويب ، فقد يكون من الصعب عليك فهم هذه المقالة. أود أن أقترح الاطلاع على مقالات المستوى التمهيدي في ProxyScrape ثم تعال إلى هذا.

لنبدأ بالكود.

استيراد المكتبات

بادئ ذي بدء ، سنقوم باستيراد جميع المكتبات اللازمة المطلوبة للكود. سيتم استخدام هذه المكتبات لكشط البيانات وتصورها. إذا كنت تريد معرفة تفاصيل كل واحد ، يمكنك زيارة وثائقهم الرسمية.

استيراد الباندا ك PD
استيراد numpy ك np
استيراد matplotlib.pyplot كما plt
استيراد سيبورن ك SNS
٪ ماتبلوتليب مضمنة
استيراد إعادة
وقت الاستيراد
من التاريخ والوقت استيراد التاريخ والوقت
استيراد matplotlib.dates ك mdates
استيراد matplotlib.ticker كمؤشر
من urllib.request استيراد urlopen
من bs4 استيراد شوربة جميلة
طلبات الاستيراد

كشط بيانات أمازون

الآن سنقوم بكشط المعلومات المفيدة من كتب أمازون الأكثر مبيعا. عنوان URL الذي سنقوم به هو كشط هو:

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

نظرا لأننا نحتاج إلى الوصول إلى جميع الصفحات ، فسنقوم بتكرار كل صفحة للحصول على مجموعة البيانات اللازمة. 

للاتصال بعنوان URL وجلب محتوى HTML ، يلزم ما يلي ،

  • get_data: سيتم استخدام هذه الوظيفة لإدخال الصفحة لا كوسيطة.
  • وكيل المستخدم: سيساعد في تجاوز الكشف.
  • سنحدد عنوان URL ل request.get ونمرر وكيل المستخدم كوسيطة.
  • استخراج المحتوى من 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 إلى صفحة + 1.
  • نحتاج أولا إلى تسوية القائمة ثم تمريرها إلى DataFrame.
  • سنقوم أخيرا بحفظ إطار البيانات كملف CSV.
بالنسبة إلى i في النطاق (1 ، no_pages + 1):
    النتائج.إلحاق (get_data(i))
تسطيح = لامدا L: [عنصر للقائمة الفرعية في L للعنصر في القائمة الفرعية]
df = PD. DataFrame (تسطيح (نتائج) ، أعمدة = ['اسم الكتاب' ، 'المؤلف' ، 'التقييم' ، 'Customers_Rated' ، 'السعر'])
df.to_csv('amazon_products.csv', index=False, encoding='utf-8')

قراءة ملف CSV

سنقوم الآن بتحميل ملف csv ،

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

يوضح شكل إطار البيانات أن هناك 100 صف و 5 أعمدة في ملف CSV.

دعونا نرى 5 صفوف من مجموعة البيانات ،

مدافع الرأس(61)

سنقوم الآن ببعض المعالجة المسبقة لعمود التقييمات customers_rated والسعر.

  • نظرا لأن التقييمات من 5 ، فسنقوم بإزالة الجزء الإضافي منها.
  • سنقوم بإزالة الفواصل من العمود customer_rated.
  • في عمود السعر ، سنقوم بإزالة رمز الروبية وتقسيمه حسب النقطة.
  • أخيرا ، سنقوم بتحويل جميع الأعمدة الثلاثة إلى عدد صحيح أو عائم.
df['Rating'] = df['Rating'].apply(lambda x: x.split()[0])
df ['تصنيف'] = pd.to_numeric(df['تصنيف'])
df["السعر"] = df["السعر"].str.replace('₹', '')
df["السعر"] = df["السعر"].str.replace(',', '')
df ['السعر'] = df ['السعر'].apply (لامدا x: x.split ('.') [0])
df ['السعر'] = df ['السعر'] .astype (int)
df["Customers_Rated"] = df["Customers_Rated"].str.replace(',', '')
df['Customers_Rated'] = pd.to_numeric(df['Customers_Rated'], errors='ignore')
df.head()

إذا ألقينا نظرة على أنواع إطار البيانات التي نحصل عليها ،

هناك بعض المعلومات غير المكتملة في الإخراج أعلاه. سنحسب أولا عدد NaNs ثم نسقطها.

مدافع. استبدال (str (0) ، np.نان ، في المكان = صحيح)
مدافع. استبدال (0 ، np.نان ، في المكان = صحيح)
count_nan = لين (DF) - DF. العد ()
count_nan
df = df.dropna ()

الكتب الأعلى سعرا للمؤلفين

سنتعرف الآن على جميع المؤلفين الذين لديهم كتاب الأعلى سعرا. سوف نتعرف على أفضل 20 منهم.

data = data.sort_values(['Rating'],axis=0, تصاعدي = False)[:15]
data

الكتب الأعلى تقييما

سنرى الآن الكتب والمؤلفين الأعلى تقييما فيما يتعلق بتصنيف العملاء. سنقوم بتصفية هؤلاء المؤلفين والكتب التي تحتوي على أقل من 1000 مراجعة ، حتى نحصل على أشهر المؤلفين.

data = df [df ['Customers_Rated'] > 1000] data = data.sort_values (['Rating'] ، المحور = 0 ، تصاعدي = خطأ) [: 15] بيانات

دعونا نتصور الكتب الأعلى تقييما ،

p = الشكل (x_range = data.iloc [: ، 0] ، plot_width = 800 ، plot_height = 600 ، العنوان = "الكتب الأعلى تقييما بأكثر من 1000 عميل تقييم" ، toolbar_location = لا شيء ، الأدوات = "")
 
p.vbar (x = data.iloc [: ، 0] ، أعلى = data.iloc [: ، 2] ، العرض = 0.9)
 
p.xgrid.grid_line_color = لا شيء
p.y_range.start = 0
p.xaxis.major_label_orientation = math.pi/2
عرض (ع)

المؤلفون والكتب الأكثر تقييما من قبل العملاء

كلما زادت التقييمات ، كانت ثقة العميل أفضل. لذلك سيكون أكثر إقناعا ومصداقية إذا أضفنا المؤلفين والكتب الأكثر تقييما من قبل العملاء.

من Bokeh.Transform استيراد factor_cmap
من bokeh.models استيراد أسطورة
من bokeh.palettes استيراد Dark2_5 كلوحة
استيراد أدوات التكرار
من بوكيه.باليتس استيراد D3
يحتوي #colors على قائمة من الألوان التي يمكن استخدامها في المؤامرات
الألوان = itertools.cycle (لوحة)
 
لوحة = d3 ['Category20'] [20]
index_cmap = factor_cmap ("المؤلف" ، لوحة = لوحة ،
                         العوامل = البيانات ["المؤلف"])
p = الشكل (plot_width = 700 ، plot_height = 700 ، العنوان = "كبار المؤلفين: التقييم مقابل تصنيف العملاء")
p.scatter ('تصنيف','Customers_Rated',source=data,fill_alpha=0.6, fill_color=index_cmap,size=20,legend='Author')
p.xaxis.axis_label  = "تصنيف" p.yaxis.axis_label = "تصنيف العملاء" p.legend.location = 'top_left'show(p)

في المخص:

في هذه المقالة ، رأينا ما هو تجريف الويب من خلال أخذ حالة استخدام مهمة للغاية لاستخراج البيانات من Amazon. لم نستخرج البيانات من صفحات أمازون المختلفة فحسب ، بل قمنا أيضا بتصور البيانات باستخدام مكتبات Python المختلفة. كانت هذه المقالة مقالة متقدمة المستوى وقد يكون من الصعب فهمها للأشخاص الجدد في تجريف الويب وتصور البيانات. بالنسبة لهم ، أود أن أقترح الذهاب إلى مقالات حزمة البداية المتاحة في ProxyScrape. تجريف الويب هو أسلوب مفيد للغاية يمكن أن يعطي دفعة لعملك. هناك أيضا بعض الأدوات المدفوعة المذهلة المتوفرة في السوق ، ولكن لماذا تدفع لهم عندما يمكنك ترميز مكشطة خاصة بك. قد لا يعمل الرمز الذي كتبناه أعلاه مع كل صفحة ويب لأن بنية الصفحة قد تختلف. ولكن إذا كنت قد فهمت المفاهيم المذكورة أعلاه ، فلا توجد عقبات أمامك لكشط أي صفحة ويب عن طريق تعديل الكود وفقا لهيكله. آمل أن يكون هذا المقال ممتعا للقراء. كان هذا كل شيء. نراكم في القادمة!