شعار proxyscrape داكن

كيفية كشط الويب من أمازون باستخدام بايثون

بايثون, كشط, May-19-20215 دقائق للقراءة

كشط الويب هو فن استخراج البيانات من الإنترنت واستخدامها لأغراض مفيدة. كما يُعرف أحيانًا باسم استخراج بيانات الويب أو جمع بيانات الويب. بالنسبة للمبتدئين، فهو يشبه تمامًا نسخ البيانات من الإنترنت وتخزينها محليًا. ومع ذلك، فهي عملية يدوية. تجريف الويب

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

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

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

لنبدأ بالرمز.

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

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

استيراد بانداس ك pd
استيراد numpy ك np
استيراد matplotlib.pyplot ك plt
استيراد سيبورن ك sns
% مضمنة في Matplotlib
استيراد إعادة
استيراد الوقت
من التاريخ والوقت استيراد التاريخ والوقت
استيراد matplotlib.dates باسم mdates
استيراد matplotlib.ticker كمؤشر 
من urllib.request استيراد urlopen من 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 وتمرير وكيل المستخدم كوسيطة.
  • استخراج المحتوى من طلبات.get.
  • كشط الصفحة المحددة وتعيينها إلى متغير الحساء.

فيما يلي بعض العلامات المهمة التي تندرج تحتها بياناتنا المهمة,

  • اسم الكتاب
  • المؤلف
  • التقييم
  • تقييم العملاء
  • السعر

إذا قمت بفحص الصفحة المحددة، سترى العلامة الأصلية والعناصر المقابلة لها.

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

في الكود الخاص بنا، سنستخدم عبارات if-إذا-إلا المتداخلة لتطبيق نتائج إضافية على المؤلفين غير المسجلين في أمازون. 

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

سيؤدي ذلك الوظائف التالية,

  • اجمع البيانات داخل حلقة للتكرار.
  • ستقوم الحلقة بالتكرار على كل صفحة، بدءًا من الصفحة 1 إلى الصفحة + 1.
  • نحتاج أولًا إلى تسطيح القائمة ثم تمريرها إلى DataFrame.
  • سنقوم في النهاية بحفظ إطار البيانات كملف CSV.
بالنسبة إلى i في النطاق(1, no_pages+1):
    نتائج.append(get_data(i))
التسطيح = lambda l: [العنصر للقائمة الفرعية في l للعنصر في القائمة الفرعية]
df = pd.DataFrame(flatten(results),columns=['Book Name','author','Rating','Customers_Rated', 'Price'])
df.to_csv('amazon_products.csv'، فهرس=False، ترميز='utf-8')

قراءة ملف CSV

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

df = pd.read_csv("amazon_products.csv")
شكل df.form

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

دعنا نرى الصفوف الخمسة من مجموعة البيانات,

دف.هيد(61)

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

  • بما أن التقييمات من 5، سنحذف الجزء الإضافي منه.
  • سنزيل الفواصل من عمود تصنيف_العميل.
  • في عمود السعر سنزيل رمز الروبية ونقسمه بنقطة.
  • وأخيراً، سنقوم بتحويل الأعمدة الثلاثة إلى أعداد صحيحة أو عائمة.
df['Rating] = df['Rating].apply(lambda x: x.split()[0])
df['Rating '] = pd.to_numeric(df['Rating'])
df[" السعر"] = df["السعر"].str.replace("₹", '')
df[" السعر"] = df["السعر"].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()

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

هناك بعض المعلومات الناقصة في المخرجات أعلاه. سنقوم أولاً بحساب عدد الصامتات الصفرية ثم نحذفها.

df.replace(str(0), np.nan, inplace=صحيح)
df.replace(0, np.nan, inplace=صحيح)
Count_nan = len(df) - df.count()
العد_نان
df = df.dropna()

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

سنتعرف الآن على جميع المؤلفين أصحاب الكتب الأعلى سعراً. سنتعرف على أعلى 20 مؤلفاً منهم.

البيانات = data.sort_values(['Rating'],axis=0, ascending=False)[:15]
البيانات

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

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

البيانات = df[df['Customers_Rated] > 1000]
البيانات = data.sort_values(['Rating'],axis=0, ascending=False)[:15]
البيانات

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

p = figure(x_range=data.iloc[:,0]، plot_width=800، plot_height=600، title="الكتب الأعلى تقييماً مع أكثر من 1000 تقييم من العملاء"، tool_location=None، tool=""")
 
p.vbar(x=data.iloc[:,0]، top=data.iloc[:,2]، العرض=0.9)
 
p.xgrid.grid_line_color = لا شيء
p.y_range.start = 0
p.xaxis.major_label_orientation = math.pi/2
إظهار(p)

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

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

من bokeh.transform استيراد عامل_cmap من bokeh.transform 
من bokeh.models استيراد أسطورة
من bokeh.palettes استيراد Dark2_5 كلوحة ألوان
استيراد itertools
من bokeh.palettes استيراد d3
تحتوي#الألوان على قائمة بالألوان التي يمكن استخدامها في المخططات
الألوان = itertools.cycle(palette)
 
لوحة الألوان = d3['Category20'][20]
index_cmap = factor_cmap("المؤلف"، لوحة الألوان = لوحة الألوان,
                         العوامل=بيانات["المؤلف"]))
p = الشكل(plot_width=700،plot_height=700، العنوان = "أفضل المؤلفين: التقييم  مقابل تقييم العملاء"))
p.مبعثر('تصنيف'،'الزبائن_مصنفين'، المصدر=بيانات,ملء_ألفا=0.6، ملء_اللون=index_cmap، الحجم=20، وسيلة الإيضاح='مؤلف')
p.xaxis.axis.axis_label = 'RATING'
p.yaxis.axis.axis_label = ' تقييم العملاء'
p.legend.location = 'top_left'
 
إظهار(p)

الخاتمة

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