آموزش رزبری پای

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

Raspberry Pi یک پلت فرم عالی برای یادگیری پایتون است و یکی از مفیدترین کابرد های پایتون استخراج داده ها از صفحات وب است. در این آموزش، یاد خواهید گرفت که چگونه محتویات یک صفحه وب را با استفاده از پایتون بخوانید و آن داده ها را در ترمینال نمایش دهید.

با استفاده از کتابخانه URLLIB

کتابخانه urllib یک بسته داخلی پایتون برای مدیریت URL (Uniform Resource Locator) است. این پکیج دارای چندین ماژول برای مدیریت URL ها است. مثلا:

  • urllib.request – برای باز کردن صفحات وب استفاده می شود
  • urllib.error – برای تعریف کلاس های استثنا از استثناهای urllib.request استفاده می شود
  • urllib.parse – برای تجزیه رشته های URL و ساختار مجدد آنها استفاده می شود
  • urllib.robotparser – برای تجزیه فایل های robot.txt استفاده می شود

از سوی دیگر پکیج urllib2 همتای این کتابخانه برای Python 2 است. این بسته اگر چه تفاوت های جزئی دارد اما در کل یکسان است. هر دو کتابخانه روش هایی برای دسترسی راحت به صفحات وب ارائه میکنند. از آنجایی که ما میخواهیم از آخرین نسخه پایتون استفاده کنیم، کتابخانه urllib را فراخوانی میکنیم.

برای نشان دادن نحوه عملکرد کتابخانه، داده های دما را از weather.com استخراج کرده و در ترمینال Raspberry Pi چاپ می کنیم.

بیایید ابتدا کد را بررسی کنیم.

کد پایتون استخراج داده از سایت

برای من خیلی جالب است که فقط 9 خط کد پایتون برای استخراج داده ها از یک صفحه وب لازم است:

import urllib.request

url = "http://www.weather.com"
req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'})
html = str(urllib.request.urlopen(req).read())
templine = '<span data-testid="TemperatureValue" class="_-_-node_modules-@wxu-components-src-organism-CurrentConditions-CurrentConditions--tempValue--3KcTQ">'
stringstart = html.find(templine)
stringend = stringstart + len(templine)
print("Temperature is", html[stringend:stringend+2]+"°C")

توضیح کد ها:

ابتدا ماژول urllib.request را فراخوانی میکنیم. ساده ترین راه برای باز کردن و خواندن یک URL، وارد کردن تابع: urllib.request.urlopen (‘url your here’) است. متأسفانه یک مشکل وجود دارد، اکثر سایت‌ها قدردان اسکریپت‌هایی نیستند که داده‌هایشان را جمع‌آوری می‌کنند زیرا بدون سود سرورهایشان را سنگین می‌کنند. برای غلبه بر این مشکل، باید تغییراتی اعمال کنیم. یعنی هدر http را تغییر دادیم و User-Agent قرار میدهیم تا مانند یک کاربر واقعی نشان داده شود (سایت متوجه نشود که این یک برنامه کامپیوتری برای جمع آوری داده ها هست). هدر ها بیت هایی هستند که حاوی اطلاعاتی درباره شما هستند.

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

req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'}) 

ما این خط را در یک متغیر ذخیره میکنیمو آن را به urllib.request.urlopen ارسال میکنیم.

تا به اینجا ما تمام کد های HTML سایت مورد نظر را دریافت کردیم. حالا با این همه کد HTML چه کنیم؟ چگونه دما را از بین هزاران خط کد بدست آوریم؟

استخراج داده ها از یک صفحه وب

برای استخراج مقدار دما از سایت weather.com، به وب سایت بروید. متن یا گرافیکی را که مقدار دما را نشان می دهد انتخاب کنید. راست کلیک کرده و Inspect را انتخاب کنید. توجه داشته باشید که این روش بروت فورس خالص است. راه های بیشتری برای انجام این کار وجود دارد، و صادقانه بگویم، استفاده از API بسیار ساده تر و قابل اعتماد خواهد بود.

استخراج داده از سایت با رزبری پای

پس از کلیک روی Inspect، مجموعه کدی را خواهید دید که مقدار دما از آن گرفته شده است (شکل زیررا ببینید). شما باین این کد را کپی کنید و در برنامه خود قرار دهید. در تصویر زیر کد مورد نظر ما میشود:

اگر در مورد این مطلب سوالی دارید در قسمت نظرات بپرسید

<span data-testid=”TemperatureValue” class=”_-_-node_modules-@wxu-components-src-organism-CurrentConditions-CurrentConditions–tempValue–3KcTQ”>

پیدا کردن کلاس مورد نظر استخراج

در مرحله بعد، برای یافتن آن عنصر span خاص از کل کد HTML، از تابع ()find استفاده خواهیم کرد. این تابع به سادگی مکان اولین کاراکتر یا رشته ای را که به صورت عدد صحیح نشان داده اید برمی گرداند. به عنوان مثال، بیایید به دنبال کلمات “Hello World” باشیم. اگر از تابع find برای جستجوی حرف o استفاده کنید، عدد 4 را برمی گرداند، زیرا o اول در اندیس پنجم رشته قرار دارد (رشته ها با [0] شروع می شوند).

پس از اینکه مکان آن را به دست آوردیم، به سادگی طول آن را تغییر میدهیم  تا مکان دما را بدست آوریم. اکنون که می دانیم مقدار کجاست، می توانیم آن را با استفاده از علامت : (دونقطه) چاپ کنیم. نماد : به شما امکان می دهد با تعیین مکان اولین و آخرین کاراکتر، یک تکه از یک رشته را جدا کنید.

استخراج داده از اینترنت با پایتون

در نهایت کد را در ترمینال اجرا کنید. اکنون برنامه باید داده ها را از وب سایت استخراج کرده و در ترمینال شما نمایش دهد. می‌توانید هر زمان که بخواهید آن را آزمایش کنید و این کد دمای فعلی مکانتان را بر اساس آدرس IP رایانه‌تان به شما نشان می‌دهد.

با استفاده از کتابخانه BEAUTIFULSOUP

اگر بخواهید میتوانید پروژه مشابه را با کتابخانه Beautifulsoup انجام دهید.

import urllib.request
from bs4 import BeautifulSoup as soup

my_url2 = 'https://weather.com'
req = urllib.request.Request(my_url2, headers={'User-Agent': 'Mozilla/5.0'})
uClient2 = urllib.request.urlopen(req)
page_html2 = uClient2.read()
uClient2.close()

page_soup2 = soup(page_html2, "html.parser")
temp = page_soup2.find('div', 
{"class":"_-_-node_modules-@wxu-components-src-organism-CurrentConditions-CurrentConditions--primary--3xWnK"})
print(temp.span.text)

از خواندن این مقاله متشکریم، اگر سوالی دارید در قسمت نظرات بپرسید!

3.3 (3 نفر)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام ما را دنبال کنید.

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید قرار بدهم. سوالات مربوط به این مطلب را در قسمت نظرات همین مطلب اعلام کنید. سعی میکنم در اسرع وقت به نظرات شما پاسخ بدهم.

2 نظر

  1. سلام من نتونستم دمای هوا را در پایتون استخراج کنم توی سایت weather میرم کدش اینه برای مثلا اکلاهما امریکا را میخوام .CurrentConditions–tempValue–MHmYY {
    display: block;
    position: relative;
    font-size: 3.5rem;
    line-height: 1;
    font-weight: 500;
    }
    اینو باید کجای برنامه پایتون قرار بدم؟

  2. سلام خسته نباشید من نیاز دارم در رساله خودم داده های پیش بینی هواشناسی سایت weather را فراخوانی کنم هم سرعت باد و هم درجه حرارات و هم میزان بارش خواستم بدونم باید چطور این برنامه را بنویسم ؟ خواهش میکنم به من جواب بدید

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *