از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
مقدمه ای بر Web Scraping با پایتون
سرفصلهای مطلب
معرفی
Web-scraping یک تکنیک مهم است که اغلب در زمینه های مختلف، به ویژه علم داده و داده کاوی استفاده می شود. پایتون تا حد زیادی به عنوان زبان پیشرو برای خراش دادن وب در نظر گرفته می شود، دلیل آن ماهیت باتری های پایتون است. با پایتون، می توانید یک اسکریپت اسکریپ ساده در حدود 15 دقیقه و در کمتر از 100 خط کد ایجاد کنید. بنابراین صرف نظر از کاربرد، وب اسکراپینگ مهارتی است که هر برنامه نویس پایتون باید زیر کمربند خود داشته باشد.
قبل از اینکه شروع کنیم به دست گرفتن -روی، باید به عقب برگردیم و در نظر بگیریم که web-scraping چیست، چه زمانی باید از آن استفاده کنیم و چه زمانی از استفاده از آن اجتناب کنیم.
همانطور که قبلاً می دانید، وب اسکرپینگ تکنیکی است که برای استخراج خودکار داده ها از وب سایت ها استفاده می شود. آنچه که درک آن مهم است این است که خراش دادن وب یک تکنیک تا حدی خام برای استخراج داده ها از منابع مختلف – معمولاً صفحات وب است. اگر توسعه دهندگان یک وب سایت به اندازه کافی سخاوتمند باشند تا یک API برای استخراج داده ها ارائه دهند، این یک راه بسیار پایدارتر و قوی تر برای دسترسی به داده ها خواهد بود. بنابراین، به عنوان یک قانون سرانگشتی، اگر یک وب سایت یک API برای بازیابی داده های خود به صورت برنامه نویسی ارائه می دهد، از آن استفاده کنید. اگر یک API در دسترس نیست، فقط پس از آن از web-scraping استفاده کنید.
همچنین مطمئن شوید که از قوانین یا محدودیتهای مربوط به خراش دادن وب برای هر وبسایتی که استفاده میکنید، پیروی کنید، زیرا برخی آن را مجاز نمیدانند. با روشن بودن این موضوع، بیایید مستقیماً وارد آموزش شویم.
برای این آموزش، ما می خواهیم خراش دهیم http://quotes.toscrape.com/
، سایتی که نقل قول های معروف نویسندگان مشهور را فهرست می کند.
خط لوله خراش وب
ما می توانیم وب اسکرپینگ را به عنوان یک خط لوله حاوی 3 جزء درک کنیم:
- در حال دانلود: دانلود وب HTML-page
- تجزیه: تجزیه HTML و بازیابی داده های مورد علاقه ما
- ذخیره سازی: ذخیره سازی داده های بازیابی شده در دستگاه محلی ما در قالبی خاص
دانلود HTML
منطقی به نظر می رسد که استخراج هر گونه داده از یک وبpage، ابتدا باید آن را دانلود کنیم. دو راه برای انجام این کار وجود دارد:
1. استفاده از کتابخانه های اتوماسیون مرورگر
می توانید از کتابخانه های اتوماسیون مرورگر مانند سلنیوم برای دانلود HTML از وب page. سلنیوم به شما امکان می دهد یک مرورگر، مثلا کروم را باز کنید و آن را هر طور که می خواهید کنترل کنید. می توانید وب را باز کنید-page در یک مرورگر و سپس کد HTML آن را دریافت کنید page، همه با استفاده از سلنیوم خودکار شده اند.
با این حال، این روش یک اشکال بزرگ دارد – به طور قابل توجهی کندتر است. دلیل آن سربار اجرای مرورگر و رندر کردن HTML در مرورگر است. این روش فقط باید در موارد استثنایی استفاده شود – مواردی که محتوایی که میخواهیم حذف کنیم از کد جاوا اسکریپت در مرورگر استفاده میکند یا از ما میخواهد روی دکمهها/پیوندها کلیک کنیم تا به دادهها برسیم، کاری که سلنیوم میتواند برای ما انجام دهد.
2. استفاده از کتابخانه های HTTP
کتابخانه های HTTP، مانند ماژول Requests یا Urllib، به شما اجازه می دهد درخواست HTTP را ارسال کنید، برخلاف روش اول، نیاز به باز کردن هر مرورگری را دور بزنید. این روش همیشه باید ترجیح داده شود، زیرا بسیار سریعتر از سلنیوم است.
حالا اجازه دهید به شما نشان دهم که چگونه می توانیم با استفاده از کتابخانه های سلنیوم و درخواست ها به این جزء خط لوله دست پیدا کنیم:
استفاده از درخواست ها
را نصب کنید requests
ماژول با موارد زیر:
$ pip install requests
و اکنون می توانید از آن در کد خود مانند زیر استفاده کنید:
import requests
result = requests.get('http://quotes.toscrape.com/')
page = result.text
در اینجا، یک درخواست HTTP GET به URL ارسال می شود که تقریباً مترادف با دانلود صفحه وب است. سپس، می توانیم منبع HTML را دریافت کنیم page با دسترسی به شیء نتیجه ای که توسط requests.get()
روش.
استفاده از سلنیوم
می توانید نصب کنید selenium
ماژول از طریق pip
:
$ pip install selenium
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://quotes.toscrape.com/')
page = driver.page_source
در اینجا ابتدا با ایجاد یک شروع می کنیم webdriver
شی، که نشان دهنده مرورگر است. با انجام این کار مرورگر کروم باز می شود روی کامپیوتری که کد را اجرا می کند سپس با تماس با get
روش از webdriver
شی، ما می توانیم URL خود را باز کنیم. و در نهایت، ما کد منبع را با دسترسی به page_source
دارایی از webdriver
هدف – شی.
در هر دو مورد، منبع HTML URL در ذخیره می شود page متغیر به عنوان یک رشته
تجزیه HTML و استخراج داده ها
بدون وارد شدن به علم کامپیوتر نظری، میتوانیم تجزیه را به عنوان یک تعریف کنیم process تجزیه و تحلیل یک رشته به طوری که بتوانیم محتویات آن را درک کنیم و بنابراین به راحتی به داده های درون آن دسترسی پیدا کنیم.
در پایتون، دو کتابخانه وجود دارد که می توانند در تجزیه HTML به ما کمک کنند: سوپ زیبا و Lxml. Lxml یک چارچوب سطح پایین تری نسبت به BeautifulSoup است و ما می توانیم از Lxml به عنوان backend در BeautifulSoup استفاده کنیم، بنابراین برای اهداف تجزیه HTML ساده، BeautifulSoup کتابخانه ترجیحی خواهد بود.
اما قبل از اینکه وارد تجزیه و تحلیل شویم، باید وب را تجزیه و تحلیل کنیم.page’ HTML است و ببینید که چگونه داده هایی که می خواهیم خراش دهیم ساختار یافته و قرار دارند. فقط زمانی که به آن اطلاعات مجهز شده باشیم، می توانیم اطلاعات مورد نظر خود را از HTML تجزیه شده بدست آوریم. اما خوشبختانه، ما مجبور نیستیم کد منبع را در یک ویرایشگر باز کنیم و هر عنصر HTML را به صورت دستی درک کرده و با داده های مربوطه در رندر شده مرتبط کنیم. page. اکثر مرورگرها یک بازرس مانند ابزارهای توسعه دهنده کروم، که به ما امکان می دهد فقط با کلیک کردن به سرعت به کد HTML هر عنصر نگاه کنیم روی آنها
برای انجام این کار در کروم، وب را باز کنید page در کروم، سپس کلیک راست کنید روی داده هایی که می خواهید خراشیده و انتخاب کنید بازرسی کنید. در فایرفاکس این گزینه نامیده می شود عنصر را بازرسی کنید – که همان چیزی است، اما فقط یک نام متفاوت است.
متوجه خواهید شد که پنجره ای در پایین پنجره کروم باز می شود که حاوی کد منبع عنصری است که روی آن کلیک کرده اید روی. کمی کد منبع را مرور کنید تا در مورد روش ساختار دادههایی که میخواهیم خراش دهیم در کد HTML ساختاری پیدا کنید.
همانطور که می توانید بعد از کمی بررسی متوجه شوید، هر نقل قول روی http://quotes.toscrape.com/
موجود در a div
با class="quote"
صفت. در آن div
، متن نقل قول در الف است span
با class="text"
و نام نویسنده در الف است small
برچسب زدن با class="author"
. این اطلاعات زمانی مورد نیاز خواهد بود که ما واقعاً HTML را تجزیه و اطلاعات خود را استخراج کنیم.
حالا بیایید تجزیه HTML را شروع کنیم page با استفاده از BeautifulSoup. اما ابتدا باید آن را نصب کنیم:
$ pip install beautifulsoup4
پس از نصب، می توانید آن را در کد خود به این صورت فراخوانی کنید:
from bs4 import BeautifulSoup
soup = BeautifulSoup(page, 'html.parser')
اول از همه، ما یک را ایجاد می کنیم تجزیه شد نسخه از page با انتقال آن به BeautifulSoup
سازنده کلاس همانطور که می بینید، یک آرگومان دوم را نیز به سازنده ارسال می کنیم. html.parser
. این نام تجزیه کننده ای است که Beautiful Soup قرار است از آن برای تجزیه رشته ای که به آن ارسال کرده اید استفاده کند. شما همچنین می توانید از تجزیه کننده استفاده کنید lxml
، که قبلاً در مورد آن صحبت کردیم، با توجه به اینکه شما کتابخانه Lxml را نصب کرده اید.
quotes = soup.find_all('div', class_='quote')
سپس، همه را استخراج می کنیم div
برچسب ها در page حاوی class="quote"
همانطور که می دانیم اینها هستند div
s حاوی نقل قول برای انجام این کار، Beautiful Soup 4 یک find_all
تابع. نام تگ و نام کلاس را به را ارسال کردیم find_all
تابع، و همه تگهایی را که شرایط را برآورده میکنند، برگرداند، یعنی برچسبهایی که حاوی نقل قولهای ما هستند.
نکته مهمی که در اینجا باید به آن توجه کرد این است که ما در اینجا با ساختارهای درختی کار می کنیم. متغیر soup
، و همچنین هر عنصر از quotes
، درختان هستند. به نوعی عناصر از quotes
بخش هایی از بزرگتر هستند soup
درخت به هر حال، بدون اینکه وارد بحث دیگری شویم، بیایید ادامه دهیم روی.
scraped = ()
for quote in quotes:
text = quote.find('span', class_='text').text
author = quote.find('small', class_='author').text
scraped.append((text, author))
می دانیم که متن نقل قول در الف است span
برچسب زدن با class="text"
و نویسنده در الف است small
برچسب زدن با class="author"
. برای استخراج آنها از عناصر نقل قول، ما دوباره از یک تابع مشابه استفاده می کنیم. find
. این find
تابع همان آرگومان های را می گیرد find_all
تابع. تنها تفاوت این است که اولین تگ را با رعایت شرایط برمی گرداند، در حالی که find_all
لیستی از برچسب ها را برمی گرداند. همچنین، ما می خواهیم به text
ویژگی شی برگشتی، که حاوی متن محصور شده در آن تگ است.
بنابراین، همانطور که در کد مشاهده می کنید، تمام عناصر لیست را حلقه می کنیم quotes
و متن نقل قول و نام نویسنده را استخراج کنید و آنها را به عنوان لیستی از لیست ها با نام ذخیره کنید scraped
. این scraped
لیست، هنگام چاپ روی را console، به نظر می رسد این است:
(('“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”',
'Albert Einstein'),
('“It is our choices, Harry, that show what we truly are, far more than our abilities.”',
'J.K. Rowling'),
('“There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.”',
'Albert Einstein'),
('“The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.”',
'Jane Austen'),
("“Imperfection is beauty, madness is genius and it's better to be absolutely ridiculous than absolutely boring.”",
'Marilyn Monroe'),
('“Try not to become a man of success. Rather become a man of value.”',
'Albert Einstein'),
('“It is better to be hated for what you are than to be loved for what you are not.”',
'André Gide'),
("“I have not failed. I've just found 10,000 ways that won't work.”",
'Thomas A. Edison'),
("“A woman is like a tea bag; you never know how strong it is until it's in hot water.”",
'Eleanor Roosevelt'),
('“A day without sunshine is like, you know, night.”',
'Steve Martin'))
ذخیره سازی داده های بازیابی شده
هنگامی که داده ها را به دست آوردیم، می توانیم آنها را در هر قالبی که می خواهیم ذخیره کنیم، به عنوان مثال، یک فایل CSV، پایگاه داده SQL، یا پایگاه داده NoSQL. برای سخت گیری، این مرحله نباید به عنوان بخشی از خراش دادن به حساب بیاید process، اما با این حال، برای کامل شدن به طور خلاصه به آن می پردازم.
من میتوانم بگویم محبوبترین روش ذخیرهسازی دادههای خراششده، ذخیره آنها بهعنوان صفحهگسترده CSV است، بنابراین من به شما به طور خلاصه روش انجام این کار را به شما نشان میدهم. من وارد جزئیات نمی شوم، برای آن باید به اسناد رسمی پایتون مراجعه کنید. بنابراین بدون هیچ مقدمه ای، بیایید وارد کد شویم.
import csv
with open('quotes.csv', 'w') as csv_file:
writer = csv.writer(csv_file, delimiter=',')
for quote in scraped:
writer.writerow(quote)
همانطور که می بینیم، کد کاملاً توضیحی است. ما در حال ایجاد یک CSV هستیم writer
شی از باز شده quotes.csv فایل، و سپس نقل قول ها را یک به یک با استفاده از writerow
تابع. همانطور که مشخص است، writerow
تابع یک لیست را به عنوان ورودی می پذیرد و سپس آن را به عنوان یک ردیف در CSV می نویسد.
نتیجه گیری و مراحل بعدی
این آموزش باید به شما کمک کند تا در حین یادگیری پیادهسازی یک اسکراپر ساده، درک کنید که اساساً خراش دادن چیست. این نوع اسکراپر باید برای اتوماسیون ساده یا بازیابی داده در مقیاس کوچک کافی باشد. اما اگر می خواهید مقادیر زیادی داده را به طور موثر استخراج کنید، باید به خصوص به چارچوب های خراش دادن نگاه کنید خراشیده. این به شما کمک می کند تا با استفاده از چند خط کد، اسکراپرهای بسیار سریع و کارآمد بنویسید. از هر چارچوبی که استفاده میکنید، در زیر آن سطح براق، آن چارچوب نیز از این اصول اولیه خراش دادن استفاده میکند، بنابراین درک این آموزش باید به شما کمک کند تا دانش اساسی را برای ماجراهای خراشیدن خود بسازید.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-25 18:32:03