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

محتویات
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)
از خواندن این مقاله متشکریم، اگر سوالی دارید در قسمت نظرات بپرسید!
سلام من نتونستم دمای هوا را در پایتون استخراج کنم توی سایت weather میرم کدش اینه برای مثلا اکلاهما امریکا را میخوام .CurrentConditions–tempValue–MHmYY {
display: block;
position: relative;
font-size: 3.5rem;
line-height: 1;
font-weight: 500;
}
اینو باید کجای برنامه پایتون قرار بدم؟
سلام خسته نباشید من نیاز دارم در رساله خودم داده های پیش بینی هواشناسی سایت weather را فراخوانی کنم هم سرعت باد و هم درجه حرارات و هم میزان بارش خواستم بدونم باید چطور این برنامه را بنویسم ؟ خواهش میکنم به من جواب بدید