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 ، يلزم ما يلي ،
بعض العلامات المهمة التي ستوضع تحتها بياناتنا المهمة هي ،
إذا قمت بفحص الصفحة المحددة ، فسترى العلامة الأصل والعناصر المقابلة لها.
إذا كنت ترغب في فحص سمة معينة ، فانتقل إلى كل واحدة منها وافحصها. ستجد بعض السمات المهمة للمؤلف واسم الكتاب والتصنيف والسعر وتقييم العملاء.
في الكود الخاص بنا ، سنستخدم عبارات 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
سيؤدي هذا الوظائف التالية ،
بالنسبة إلى 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 ،
df = pd.read_csv ("amazon_products.csv")
df.shape
يوضح شكل إطار البيانات أن هناك 100 صف و 5 أعمدة في ملف CSV.
دعونا نرى 5 صفوف من مجموعة البيانات ،
مدافع الرأس(61)
سنقوم الآن ببعض المعالجة المسبقة لعمود التقييمات customers_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. تجريف الويب هو أسلوب مفيد للغاية يمكن أن يعطي دفعة لعملك. هناك أيضا بعض الأدوات المدفوعة المذهلة المتوفرة في السوق ، ولكن لماذا تدفع لهم عندما يمكنك ترميز مكشطة خاصة بك. قد لا يعمل الرمز الذي كتبناه أعلاه مع كل صفحة ويب لأن بنية الصفحة قد تختلف. ولكن إذا كنت قد فهمت المفاهيم المذكورة أعلاه ، فلا توجد عقبات أمامك لكشط أي صفحة ويب عن طريق تعديل الكود وفقا لهيكله. آمل أن يكون هذا المقال ممتعا للقراء. كان هذا كل شيء. نراكم في القادمة!