داده ها در اطراف ما هستند. هر وبسایتی که بازدید میکنید شامل دادههایی در قالب قابل خواندن است که میتوانید برای یک پروژه از آنها استفاده کنید.
و اگرچه شما به راحتی می توانید داده ها را کپی و جایگذاری کنید، بهترین روش برای حجم زیاد داده، انجام اسکراپی وب است.
یادگیری اسکرپینگ وب در ابتدا می تواند مشکل باشد، اما با یک کتابخانه خوب وب اسکرپینگ، کارها بسیار آسان تر خواهد شد.
اسکرپینگ Scraping وب می تواند ابزار مفیدی برای جمعآوری داده ها و اطلاعات باشد، اما مهم است که اطمینان حاصل شود که آن را به روشی ایمن و قانونی انجام می دهید.
در اینجا چند نکته برای انجام صحیح اسکراپینگ وب وجود دارد:
اکنون که روش مناسب برای نزدیک شدن به خراش دادن را فهمیدید، بیایید وارد آن شویم. در این آموزش گام به گام، نحوه خراش دادن چندین صفحه از یک وب سایت با استفاده از کاربرپسندترین ماژول خراش دادن وب پایتون، سوپ زیبا را شرح خواهیم داد.
این آموزش به دو بخش تقسیم می شود: در مرحله اول یک صفحه را خراش می دهیم. سپس در بخش دوم، چندین صفحه را بر اساس کد استفاده شده در بخش اول خراش می دهیم.
پایتون Python 3 : برای این آموزش باید از Python 3 استفاده کنید، زیرا کتابخانه ای که ما استفاده خواهیم کرد یک کتابخانه Python است. برای دانلود و نصب پایتون به وب سایت رسمی مراجعه کنید.
کتابخانه Beautiful Soup: Beautiful Soup یک بسته پایتون برای تجزیه ساختار یافته داده ها است. برای صفحات تجزیه شده، یک درخت تجزیه تولید می کند که می توانید از آن برای استخراج داده ها از HTML استفاده کنید. این به شما امکان می دهد با HTML به همان روشی که می توانید با یک صفحه وب با استفاده از ابزارهای توسعه دهنده تعامل داشته باشید، تعامل داشته باشید.
برای شروع استفاده از آن، ترمینال خود را راهاندازی کنید و Beautiful Soup را نصب کنید:
$ pip install beautifulsoup4
کتابخانه ریکوئست: کتابخانه ریکوئست استاندارد پایتون برای ایجاد درخواست های HTTP است. ما از این به همراه Beautiful Soup برای بدست آوردن HTML برای یک وب سایت استفاده خواهیم کرد.
$ pip install requests
نصب یک تجزیه کننده: برای استخراج داده ها از متن HTML، به یک تجزیه کننده نیاز داریم. ما lxml
در اینجا از تجزیه کننده استفاده خواهیم کرد. برای نصب این تجزیه کننده، دستور زیر را اجرا کنید:
pip install lxml
توجه : برای دنبال کردن این آموزش نیازی نیست که حرفه ای پایتون باشید.
همانطور که قبلا توضیح دادم، ما با درک نحوه خراش دادن یک صفحه وب شروع می کنیم. سپس به خراش دادن چندین صفحه وب خواهیم پرداخت.
بیایید اولین اسکراپر خود را بسازیم.
ابتدا، بیایید کتابخانه های مورد نیاز خود را وارد کنیم:
import requests from bs4 import BeautifulSoup
ما می خواهیم یک وب سایت با صدها صفحه رونوشت فیلم را خراش دهیم. ما با خراش دادن یک صفحه شروع می کنیم و سپس نحوه خراش دادن چندین صفحه را نشان می دهیم.
ابتدا اتصال را تعریف می کنیم. در این مثال، از رونوشت فیلم تایتانیک استفاده می کنیم، اما شما می توانید هر فیلمی را که می خواهید انتخاب کنید.
سپس یک به وب سایت می دهیم request
و یک پاسخ دریافت می کنیم که آن را در متغیر نتیجه ثبت می کنیم. .text
پس از آن، از روشی برای بازیابی محتوای وب سایت استفاده می کنیم.
یک
lxml
در نهایت، از تجزیه کننده برای بدست آوردن soup
, که شی حاوی تمام داده های ساختار تودرتو است استفاده می کنیم که بعداً دوباره از آن استفاده خواهیم کرد.
website = 'https://subslikescript.com/movie/Titanic-120338' result = requests.get(website) content = result.text soup = BeautifulSoup(content, 'lxml') print(soup.prettify())
هنگامی که ما soup
شیء را داریم، می توانیم به سادگی با استفاده از HTML قابل خواندن دریافت کنیم. prettify()
. اگرچه ممکن است از HTML چاپ شده در یک ویرایشگر متن برای یافتن عناصر استفاده کنیم، اما رفتن مستقیم به کد HTML عنصر مورد نظر بسیار سادهتر است. ما این کار را در فاز بعدی انجام خواهیم داد.
قبل از اینکه شروع به نوشتن کد کنیم، ابتدا باید وب سایتی را که می خواهیم خراش دهیم و کد HTML دریافتی را ارزیابی کنیم تا بهترین استراتژی برای خراش دادن وب سایت را شناسایی کنیم. نمونه رونوشت در زیر موجود است. چیزهایی که باید خراشیده شوند، عنوان و متن فیلم هستند.
برای دریافت کد HTML برای یک عنصر داده شده، مراحل زیر را انجام دهید:
پیدا کردن یک عنصر در سوپ زیبا آسان است. .find()
به سادگی روش را روی سوپ از قبل آماده شده اعمال کنید.
به عنوان مثال، کادر حاوی عنوان، توضیحات و متن فیلم را پیدا کنید. درون یک تگ قرار دارد article
و کلاس main-article
روی آن قرار دارد. برای یافتن آن باکس می توانیم از کد زیر استفاده کنیم:
box = soup.find('article', class_='main-article')
عنوان فیلم در یک h1
برچسب محصور شده و فاقد نام کلاس است. پس از یافتن آن، از.get_text()
تابع برای بازیابی متن درون گره استفاده می کنیم:
title = box.find('h1').get_text()
رونوشت در یک div
برچسب گنجانده شده است و دارای کلاس است full-script
. در این سناریو، آرگومان های پیش فرض را در تابع تغییر می دهیم.get_text()
تا متن را دریافت کنیم.
ما با تنظیم strip=True
حذف فضاهای پیشرو و عقب شروع می کنیم. سپس یک فضای خالی به جداکننده اضافه می کنیم separator=' '
تا مطمئن شویم که کلمات بعد از هر خط جدید یک فضای خالی دارند \n
.
transcript = box.find('div', class_='full-script') transcript = transcript.get_text(strip=True, separator=' ')
تا کنون، ما داده ها را با موفقیت خراش داده ایم. برای اطمینان از اینکه همه چیز به درستی کار می کند، متغیرهای title
و را چاپ کنید .transcript
میتوانید دادهها را در قالبهای، و سایر فرمتها ذخیره CSV
کنید JSON
. در این مثال، داده های استخراج شده را در فایل a.txt ذخیره می کنیم. with
برای انجام این کار، همانطور که در کد زیر نشان داده شده است، از کلمه کلیدی استفاده می کنیم :
with open(f'{title}.txt', 'w') as file: file.write(transcript)
به خاطر داشته باشید که از f
-string برای تنظیم نام فایل به عنوان فیلم استفاده کنید. پس از اجرای کد، باید یک.txt
فایل در پوشه کاری خود داشته باشیم.
اکنون که با موفقیت دادهها را از یک صفحه وب حذف کردهایم، آماده حذف رونوشتها از چندین صفحه هستیم!
در صفحه رونوشت، به پایین پیمایش کنید و روی همه فیلمنامههای فیلم کلیک کنید. می توانید آن را در پایین صفحه وب پیدا کنید.
اسکرین شات تمام رونوشت های فیلم را نشان می دهد. این وب سایت دارای 1757 صفحه است که تقریباً 30 رونوشت فیلم در هر صفحه دارد.
href
در این بخش با بدست آوردن ویژگی هر لینک چندین لینک را خراش می دهیم. ابتدا باید وب سایت را تغییر دهیم تا اسکراپین مجاز باشد. متغیر جدید وب سایت ما به صورت زیر خواهد بود:
root = 'https://subslikescript.com' website = f'{root}/movies'
دلیل اصلی root
تعریف متغیر در کد کمک به خراش چندین صفحه وب بعداً است.
بیایید با href
ویژگی 30 فیلم در یک صفحه شروع کنیم. هر عنوان فیلم را در کادر " فهرست رونوشت های فیلم " بررسی کنید.
پس از آن، ما باید کد HTML را داشته باشیم. یک a
برچسب باید با رنگ آبی برجسته شود. هر a
برچسب متعلق به یک عنوان فیلم است.
همانطور که می بینیم، پیوندهای درون دامنه ریشهhref
subslikescript.com را شامل نمی شود. به همین دلیل است که قبل از الحاق یک متغیر ریشه ایجاد کردیم.
بیایید تمام a
عناصر موجود در صفحه را جستجو کنیم.
در Beautiful Soup از.find_all()
روشی برای مکان یابی عناصر مختلف استفاده می کنیم. برای استخراج پیوندی که مربوط به رونوشت هر فیلم است، باید پارامتر را وارد کنیم href=True
.
box.find_all('a', href=True)
برای دریافت لینک ها از href، ['href']
به عبارت بالا اضافه کنید. با این حال، از آنجایی که. find_all()
متد یک لیست را برمی گرداند، باید از طریق آن حلقه بزنیم و hrefs
یک به یک در حلقه دریافت کنیم.
for link in box.find_all('a', href=True): link['href']
همانطور که در زیر نشان داده شده است می توانیم از درک لیست برای ذخیره پیوندها استفاده کنیم:
links = [link['href'] for link in box.find_all('a', href=True)] print(links)
اگر لیست پیوندها را چاپ کنید، پیوندهایی که می خواهیم خراش دهیم، قابل مشاهده خواهند بود. در مرحله زیر، هر صفحه را خراش می دهیم.
برای خراش دادن رونوشت هر پیوند، مراحلی را که برای اولین رونوشت استفاده کردیم، تکرار می کنیم. این بار، این مراحل را در حلقه زیر قرار می دهیم for
.
for link in links: result = requests.get(f'{root}/{link}') content = result.text soup = BeautifulSoup(content, 'lxml')
همانطور که ممکن است به خاطر داشته باشید، پیوندهایی که قبلاً ذخیره کرده بودیم حاوی ریشه نبودند subslikescript.com
، بنابراین باید آن را با عبارت ترکیب کنیم f'{root}/{link}'
.
بقیه کد مشابه آنچه در بخش اول این راهنما نوشتیم است.
ممنون که این مطلب رو خوندید ، اگه سوالی درمورد برنامه نویسی داشتید میتونید در شبکه های اجتمایی من بپرسید.
وبسایت : mahdimashayekhi.ir
گیت هاب: MahdiMashayekhi-AI
لینکدین: MahdiMashayekhi
توییتر: Mashayekhi_AI
یوتیوب: MahdiMashayekhi
اینستاگرام: MahdiMashayekhi.ai