آموزش رایگان وب اسکرپینگ در پایتون
این آموزش یکی از پستهای زیرمجموعه آموزشهای مرتبط با پایتون میباشد، که به آموزش رایگان وب اسکرپینگ در پایتون میپردازد. در صورتی که تمایل دارید کل آموزشهای مرتبط با پایتون را مشاهده کنید، از این لینک استفاده کنید. در ضمن اگه حوصله خوندن متن ندارید، میتونید از ویدیو آخر این پست استفاده کنید و از متن صرف نظر کنید. همچنین اگه با خواندن این مطلب سوالی برای شما پیش اومد، خوشحال میشم که اون را از طریق راههای ارتباطی که در همین وبسایت موجوده، باهام مطرح کنید.
پیشنیاز این آموزش آشنایی با پایتون، HTML و CSS هست.
این پست به صورت ماهانه بروز میشه و مطالب جدیدی بهش اضافه میشه.
وب اسکرپینگ چیه؟
وب اسکرپینگ یعنی در زمان کوتاهی، اطلاعات قابل مشاهده در یک صفحه وب را استخراج کنید. (تعریفی که آوردم، بنظرم خیلی خلاصه، کافی و مفید بود ولی اگه دنبال تعریف خیلی مفصلتری هستید میتونید از این لینک استفاده کنید)
کاربرد وب اسکرپینگ چیه؟
وب اسکرپینگ میتونه برای تحقیقات بازار، جمعآوری اطلاعات در زمینههای مختلف، پیدا کردن سرنخ فروش و… کاربرد داشته باشه.
یک مثال از وب اسکرپینگ
فرض کنید شما یک محصول خوراکی تولید کردهاید، و الان قصد دارید اون را بفروشید، برای همین نیاز به لیستی از سوپرمارکتهای شهرتون به همراه آدرس و شماره تماسشون دارید تا با آنها تماس بگیرید و برای محصول خودتون بازاریابی کنید. شروع به جستجو در وب میکنید و به وبسایتی میرسید که اتفاقا لیستی از سوپرمارکتهای شهر خودتون را گذاشته، یه چیزی مثل عکس پایین (البته دادههای داخل این صفحه وب واقعی نیست و من برای آموزش ایجادش کردم):
حالا شما نیاز دارید اطلاعات این صفحه وب را داخل یک فایل اکسل بریزید تا هم بتونید همه سوپرمارکتها را یکجا در گوشی خودتون به عنوان مخاطب ذخیره کنید و هم شرح حالی برای هر سوپرمارکتی که تماس میگیرید، بنویسید تا بعدا یادتون نره که به هر کدوم چی گفتید و چیکار کردید (یه حالت CRM). راهی که اول به ذهن هممون میرسه اینه که دونه دونه این دیتا را داخل اکسل کپی و پیست کنیم، خب این راه قطعا منطقی نیست، چون درسته که الان در این صفحه فقط 9 تا سوپرمارکت داریم، ولی اگه 1000 تا بود چی؟ اینجوری که کپی پیست کردن اینها یک ماه کامل طول میکشه! اینجاست که وب اسکرپینگ به کمکمون میاد. با وب اسکرپینگ در چند ثانیه این اطلاعات را وارد اکسل میکنیم.
وب اسکرپینگ با پایتون
من برای این آموزش از زبان پایتون استفاده میکنم ولی وب اسکرپینگ را میشه با زبانهای برنامهنویسی دیگه مثل سیشارپ هم انجام داد. همچنین حتما لازمه بگم که فرایند اسکرپ کردن هر صفحه وب با صفحه دیگر فرق داره، بعضی مواقع ممکنه خیلی آسون و بعضی مواقع این فرایند میتونه خیلی پیچیده باشه، همچنین بعضی مواقع نیاز به خلاقیت از طرف شما هم داره.
قدم اول - شناخت ساختار صفحه وب
قدم اول اینه که ساختار اون صفحهای که قراره اسکرپش کنید را بشناسید. برای اینکار مفیدترین ابزار ما Inspect خود مرورگر هست. باید به دنبال ID یا Class یا هر چیز مشترک بین اِلمانهایی باشیم که قصد داریم اونها را استخراج کنیم. من صفحه مربوط به سوپرمارکتها را بررسی کردم و متوجه شدم، همه مستطیلها با حاشیه سیاه رنگ، داخل تگ section هستند و همه یک کلاس css مشترک به نام supermarket دارند، همچنین داخل این section سه تگ div وجود داره، که اولی نام سوپر مارکت را داره و کلاس css اون به نام name هست و دومی با کلاس address، آدرس سوپرمارکت را در خودش داره، و سومی هم که تلفن را درون خودش داره، اسم کلاسش tel هست. این ساختار برای کل سوپرمارکتهای داخل صفحه صدق میکند. اگه این قسمت براتون پچیده بود و متوجه نشدید اصلا نگران نباشید، ویدیو آخر این پست را ببینید تا کاملا متوجه بشید.
قدم دوم - نوشتن کد پایتون
کد پایتون برای اسکرپ کردن صفحه بالا به شکل زیر هست، در ادامه هر خط این کد را توضیح میدهم:
from bs4 import BeautifulSoup as bs
import requests as rs
import csv
headers = {"User-agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36"}
url = "https://miladrouhi.com/test/"
page = rs.get(url , headers=headers)
file = open('output.csv' , 'w' , encoding='utf-8')
writer = csv.writer(file)
writer.writerow(['نام' , 'آدرس' , 'شماره تماس'])
soup = bs(page.content, "html.parser")
sections = soup.find_all("section" , class_="supermarket")
for section in sections:
title = section.find("div", class_="name")
address = section.find("div", class_="address")
tel = section.find("div", class_="tel")
writer.writerow([title.text , address.text , tel.text])
file.close()
- خط اول کتابخانه BeautifulSoup وارد کردم، این بهترین کتابخانه در پایتون برای وب اسکرپینگ هست (حواستون باشه که اول باید هر کتابخانهای که بکار میبرید را از طریق pip نصب کنید).
- خط دوم کتابخانه requests را وارد کردم، این کتابخانه برای تبادل دیتا با یک لینک کاربرد داره.
- خط سوم برای وارد کردن کتابخانه csv هست که به ما کمک میکنه دیتای خروجی را داخل یک فایل csv ذخیره کنیم.
- خطوط پنجم تا هفتم به صفحه وبی که در متغیر url مشخص کردهاید، یک request میفرسته و جواب را در متغیر page ذخیره میکنه.
- خطوط نهم تا یازدهم یک فایل csv جدید ایجاد میکنه و اون فایل را به کتابخانه csv میده تا اولین سطر فایل (یعنی همون header دیتا) را در فایل بنویسه.
- در خط سیزدهم یک شی از کلاس BeautifulSoup ایجاد میشه و content متغیر page به عنوان پارامتر اول به سازنده کلاس داده شده. برای پارامتر دوم هم دقیقا مانند کد عمل کنید.
- در خط چهاردهم به کمک BeautifulSoup تمامی تگهای section در صفحه وب که کلاس supermarket دارند در متغیر sections ذخیره میشوند.
- در خط پانزدهم یک حلقه روی متغیر sections تشکیل میشه. دلیل اینکار اینه که بتونیم اطلاعات تمامی sectionهایی که داخل sections هست را استخراج کنیم.
- در خط شانزدهم داخل section را بررسی میکنیم و برای استخراج نام سوپرمارکت، در section به دنبال تگ div با کلاس name میگردیم تا محتوای داخلش را درون متغیر title ذخیره کنیم. دقیقا مشابه همین کد، برای استخراج آدرس و شماره تماس سوپرمارکتها در خطوط هفدهم و هجدهم هم انجام شده.
- در خط بیستم با کمک خاصیت text متغیرهای استخراج شده، یک سطر جدید در فایل csv خودمان ایجاد کردهایم و دادهها را درون آن نوشتهایم.
- در خط بیست و سوم هم فایل csv خودمان را بسته ایم.
الان دیگه فقط کافیه که کد را اجرا کنیم تا یک فایل csv شامل اطلاعات سوپرمارکتها به ما بده.