نحوه خراش دادن چندین صفحه وب با استفاده از پایتون

داده ها در اطراف ما هستند. هر وبسایتی که بازدید میکنید شامل دادههایی در قالب قابل خواندن است که میتوانید برای یک پروژه از آنها استفاده کنید.
و اگرچه شما به راحتی می توانید داده ها را کپی و جایگذاری کنید، بهترین روش برای حجم زیاد داده، انجام اسکراپی وب است.
یادگیری اسکرپینگ وب در ابتدا می تواند مشکل باشد، اما با یک کتابخانه خوب وب اسکرپینگ، کارها بسیار آسان تر خواهد شد.
Scraping وب می تواند ابزار مفیدی برای جمع آوری داده ها و اطلاعات باشد، اما مهم است که اطمینان حاصل شود که آن را به روشی ایمن و قانونی انجام می دهید.
در اینجا چند نکته برای انجام صحیح اسکراپینگ وب وجود دارد:
قبل از اینکه سایتی را خراش دهید، اجازه بگیرید.
شرایط خدمات وب سایت و فایل robots.txt را بخوانید و درک کنید.
تعداد دفعات خراش دادن خود را محدود کنید.
از ابزارهای خراش وب استفاده کنید که به شرایط خدمات صاحبان وب سایت احترام می گذارند.
اکنون که روش صحیح نزدیک شدن به خراش دادن را درک کردید، بیایید وارد آن شویم. در این آموزش گام به گام، نحوه خراش دادن چندین صفحه از یک وب سایت با استفاده از کاربرپسندترین ماژول خراش دادن وب پایتون، سوپ زیبا را شرح خواهیم داد.
این آموزش به دو بخش تقسیم می شود: در مرحله اول یک صفحه را خراش می دهیم. سپس در بخش دوم، چندین صفحه را بر اساس کد استفاده شده در بخش اول خراش می دهیم.
الزامات
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
HTML وب سایت را دریافت کنید
ما قصد داریم یک وب سایت با صدها صفحه رونوشت فیلم را خراش دهیم. ما با خراش دادن یک صفحه شروع می کنیم و سپس نحوه خراش دادن چندین صفحه را نشان می دهیم.
ابتدا اتصال را تعریف می کنیم. در این مثال، از رونوشت فیلم تایتانیک استفاده می کنیم، اما شما می توانید هر فیلمی را که می خواهید انتخاب کنید.
سپس از وب سایت 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
را داریم، می توانیم به سادگی با استفاده از .prettify()
HTML قابل خواندن دریافت کنیم. اگرچه ممکن است از HTML چاپ شده در یک ویرایشگر متن برای یافتن عناصر استفاده کنیم، اما رفتن مستقیم به کد HTML عنصر مورد نظر بسیار ساده تر است. ما این کار را در فاز بعدی انجام خواهیم داد.
صفحه وب و کد HTML را تحلیل کنید
قبل از اینکه شروع به نوشتن کد کنیم، ابتدا باید وب سایتی را که قصد داریم خراش دهیم و کد HTML دریافتی را ارزیابی کنیم تا بهترین استراتژی برای خراش دادن وب سایت را شناسایی کنیم. نمونه رونوشت در زیر موجود است. چیزهایی که باید خراشیده شوند، عنوان و متن فیلم هستند.

برای دریافت کد HTML برای یک عنصر داده شده، مراحل زیر را انجام دهید:
به وب سایت رونوشت تایتانیک بروید.
بر روی عنوان فیلم یا متن آن کلیک راست کنید. فهرست ی را خواهید دید. برای مشاهده کد منبع صفحه، " Inspect " را انتخاب کنید.

چگونه یک عنصر را با سوپ زیبا پیدا کنیم
پیدا کردن یک عنصر در سوپ زیبا آسان است. به سادگی روش .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 separator=' '
اضافه می کنیم تا مطمئن شویم که کلمات بعد از هر خط جدید یک فضای خالی دارند \n
.
transcript = box.find('div', class_='full-script') transcript = transcript.get_text(strip=True, separator=' ')
تا کنون، ما داده ها را با موفقیت خراش داده ایم. برای اطمینان از اینکه همه چیز به درستی کار می کند، متغیرهای title
و transcript
را چاپ کنید.
چگونه داده ها را به یک فایل txt صادر کنیم
می توانید داده ها را در 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
بیایید با ویژگی href
30 فیلم در یک صفحه شروع کنیم. هر عنوان فیلم را در کادر " فهرست رونوشت های فیلم " تحلیل کنید.
پس از آن، ما باید کد HTML را داشته باشیم. یک a
باید با رنگ آبی برجسته شود. هر a
متعلق به عنوان یک فیلم است.

همانطور که می بینیم، پیوندهای داخل href
شامل دامنه root 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')
همانطور که ممکن است به خاطر داشته باشید، پیوندهایی که قبلاً ذخیره کرده بودیم حاوی root subslikescript.com
نبودند، پس باید آن را با عبارت f'{root}/{link}'
الحاق کنیم.
بقیه کد مشابه آنچه در بخش اول این راهنما نوشتیم است.
بسته شدن
اگر می خواهید صفحات وب را مرور کنید، دو گزینه دارید.
هر یک از صفحات قابل مشاهده در صفحه وب را تحلیل کنید (به عنوان مثال، 1، 2، 3، یا 1757). برچسب a
را با ویژگی href
همراه با پیوندهای هر صفحه دریافت کنید. هنگامی که پیوندها را دارید، آنها را با ریشه ترکیب کنید و پس از انجام این کار همانطور که در بخش 2 توضیح داده شده است، ادامه دهید.
از صفحه 2 دیدن کنید و پیوندی را که در آنجا می بینید کپی کنید. اینگونه باید ظاهر شود: subslikescript.com/movies?page=2
. می توانید ببینید که وب سایت یک قالب ثابت برای هر صفحه دارد: f'{website}?page={i}'
. اگر می خواهید ده صفحه اول را مرور کنید، می توانید از متغیر وب سایت مجددا استفاده کنید و بین 1 تا 10 حلقه بزنید.
بیایید در توییتر و لینکدین متصل شویم. همچنین می توانید در کانال یوتیوب من عضو شوید.
کد نویسی مبارک!
ارسال نظر