مهدی مشایخی
مهدی مشایخی
خواندن ۸ دقیقه·۲ سال پیش

وب اسکرپینگ چند صفحه با پایتون! - مهدی مشایخی

وب اسکرپینگ چند صفحه با پایتون! - مهدی مشایخی
وب اسکرپینگ چند صفحه با پایتون! - مهدی مشایخی

داده ها در اطراف ما هستند. هر وب‌سایتی که بازدید می‌کنید شامل داده‌هایی در قالب قابل خواندن است که می‌توانید برای یک پروژه از آنها استفاده کنید.

و اگرچه شما به راحتی می توانید داده ها را کپی و جایگذاری کنید، بهترین روش برای حجم زیاد داده، انجام اسکراپی وب است.

یادگیری اسکرپینگ وب در ابتدا می تواند مشکل باشد، اما با یک کتابخانه خوب وب اسکرپینگ، کارها بسیار آسان تر خواهد شد.

اسکرپینگ 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شیء را داریم، می توانیم به سادگی با استفاده از HTML قابل خواندن دریافت کنیم. prettify(). اگرچه ممکن است از HTML چاپ شده در یک ویرایشگر متن برای یافتن عناصر استفاده کنیم، اما رفتن مستقیم به کد HTML عنصر مورد نظر بسیار ساده‌تر است. ما این کار را در فاز بعدی انجام خواهیم داد.

صفحه وب و کد HTML را بررسی کنید

قبل از اینکه شروع به نوشتن کد کنیم، ابتدا باید وب سایتی را که می خواهیم خراش دهیم و کد HTML دریافتی را ارزیابی کنیم تا بهترین استراتژی برای خراش دادن وب سایت را شناسایی کنیم. نمونه رونوشت در زیر موجود است. چیزهایی که باید خراشیده شوند، عنوان و متن فیلم هستند.

برای دریافت کد HTML برای یک عنصر داده شده، مراحل زیر را انجام دهید:

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

چگونه یک عنصر را با BeautifulSoup پیدا کنیم؟

پیدا کردن یک عنصر در سوپ زیبا آسان است. .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

چگونه داده ها را به یک فایل 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 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

وبپایتونوب اسکرپینگ
مهدی مشایخی هستم. برنامه نویس هوش مصنوعی و پایتون در زمینه یادگیری ماشینی و عمیق. به همه کمک میکنم تا با هم رشد کنیم! من در توییتر: https://twitter.com/Mashayekhi_AI
شاید از این پست‌ها خوشتان بیاید