در این مقاله، من به بررسی علم اطلاعات با استفاده از پایتون می پردازم و اینکه چگونه می توانید از لاگ فایل های آپاچی اطلاعات استخراج کنید و از آن ها به درک بهتر بازدید کنندگان خود و آنچه انجام می دهند برسید.
اولین کار مربوط به وب من در سال 1995 بود، توسعه برنامه های وب در تایم وارنر. هنگامی که اولین بارآنجا کار کردم، برنامه نویسان و مدیران ما همه وظایف را انجام می دادند. اما با گذشت زمان، مثل تمام شرکت ها و سازمان های در حال رشد شروع به تخصصی کردن کارها کردیم. یکی از توسعه دهندگان مسئول لاگ فایلها شد، آنها را ذخیره کرد و تجزیه و تحلیل اساسی در آنها انجام داد.
اگر چه من می دانستم که این کار مهمی بود ولی سال ها طول کشید تا من درک کنم که کار آن توسعه دهنده از برنامه هایی که من در حال نوشتن بودم مهم تر بود. توسعه دهنده ای که روی این فایلها کار کرد و کسی که آنها را برای کارفرمایان ما تجزیه و تحلیل کرد، این امکان را داد تا بفهمیم چه کسانی از سیستم ما استفاده می کنند و چه کارهایی انجام داده اند و از کجا آمده اند. همچنین توسط لاگ فایل های مربوطه فهمیدیم چه ارتباطی میان داده های مختلف وجود دارد. ما محتوا و برنامه های کاربردی که مردم را به سایت می آورد ارائه کرده بودیم اما تجزیه و تحلیل آن فرد بود که به ما فهماند اهداف کسب و کار ما در حال تحقق یافتن است.
در طی دهه گذشته، با محبوبیت وب در بین مردم و آگاهی شرکت ها از استفاده از چنین داده هایی برای افزایش سودآوری و نیز رشد علم اطلاعات، آنالیز داده ها را امری ضروری می دانم. در حال حاضر ما در داده ها غرق شده ایم و با استفاده از ابزارها و کتابخانه های تحلیلی قادر به درک آنها هستیم.
در این مقاله، من به بررسی علم اطلاعات با استفاده از پایتون می پردازم و اینکه چگونه می توانید از لاگ فایل های آپاچی اطلاعات استخراج کنید و از آن ها به درک بهتر بازدید کنندگان خود و آنچه انجام می دهند برسید. در مقالات آینده، قصد دارم چگونگی استفاده از علم اطلاعات برای تجزیه و تحلیل این لاگ فایل ها با راه های مختلف را توضیح دهم. این کار آگاهی شما از داده های خام و پاسخ به پرسش های زیادی در مورد وب سایت تان را فراهم می کند. در آینده من ارائه تصویری قدرتمندی از تجزیه و تحلیل را توضیح خواهم داد که آن را می توان به مدیران و مشتریان خود ارائه کرد.
علم داده و پایتون
من در مقطع کارشناسی ارشد چیزی به نام "علوم یادگیری" خوانده ام. وقتی که من آنجا بودم، ما اغلب به طنز میگفتیم که رشته ای که شامل کلمه "علم" است احتمالا یک علم واقعی نیست! صرف نظر از اینکه علم اطلاعات واقعا یک علم است یا نه، به صراحت می توان گفت مهم و در حال رشد است زیرا به اهالی کسب و کار اجازه می دهد تا بر اساس داده هایی که جمع آوری کرده اند تصمیم گیری کنند. هرچه داده ها بیشتر باشند اطلاعات هوشمندانه تری به ما می دهند و بهتر می توان خواسته ها و نیازهای کاربران و مشتریان را پیش بینی کرد.
علم داده به عنوان تقاطع برنامه نویسی و آمار که به یک دامنه خاص اعمال شده مطرح می شود.شما داده ها را جمع آوری می کنید و سپس با استفاده از روش های آماری پاسخ سوالاتی را که داده ها قادر به پاسخ آنها هستند را می بینید. برای این کار پیش زمینه در آمار می تواند مفید باشد، نه تنها به خاطر اینکه شما را با انواع تجزیه و تحلیل هایی که ممکن است به کارتان بیایید آشنا می کند، بلکه آن به شما احساس اطمینان از ارتباطی که یافته اید می دهد. با فهمیدن اینکه چه کسانی بیشترین بازدید کننده های شما هستند، ممکن است کشف کنید که وب سایت تان تنها در میان مردم یک منطقه خاص از جهان محبوب است یا شما آن را در یک بخش از جهان بسیار تبلیغ کرده اید.
شما می توانید پروژه علم داده را با پرسش یک سوال و یا با زیر و رو کردن داده ها درجنبه های گوناگون به امید کشف یک رابطه جالب شروع کنید. با این وجود، علم داده انتظار دارد تا شما با دانستن روش های مختلف و اعمال یکی یا چند تا از آنها به سوالات خود پاسخ دهید. سپس برای تعیین اینکه آیا آن پاسخ ها قابل توجه هستند از آزمون های آماری استفاده کنید زیرا آنها صرفا می توانند تصادفی بوده باشند.
پایتون که برای مدت طولانی توسط مدیران سیستم، توسعه دهندگان وب و محققان استفاده می شود، یک انتخاب محبوب در میان افراد مشغول به کار در علم داده است. این نتیجه ی چندین عامل است. اول، پایتون دارای یک منحنی یادگیری معروف کم عمق است که برای برنامه نویسان مبتدی برای شروع و انجام کارها در زمان کوتاه مناسب است.
دوم اینکه پایتون به راحتی با انواع فرمت های داده و پایگاه داده کار می کند. بنابراین داده های خام شما چه یک فایل متنی یا از نوع پایگاه داده رابطه ای، پایگاه داده NoSQL، فایل CSV و فایل اکسل و یا حتی چیزی غیر معمول تر باشد، پایتون قادر به خواندن آن به راحتی و به سرعت خواهد بود.
سوم، کتابخانه های تجزیه و تحلیل داده در پایتون، مانند نامپای، SciPy و کتابخانه متپلات، سالهای زیادی است که در حال توسعه هستند ویک تعادل فوق العاده از قابلیت ها همچنین قدرت بیان و اجرا با راندمان بالا را ارائه می دهند. در سال های اخیر، کتابخانه پاندا به عنوان یک کتابخانه ی مفید اضافه شده است.
در نهایت با توسعه IPython، که در حال حاضر به عنوان Jupyter شناخته می شود، به توسعه دهندگان و دانشمندان داده ها توانایی ارتباط برقرار کردن با برنامه ها و داده های خود را (با یک REPL سنتی) ارائه می کند که در یک صفحه وب که به راحتی می تواند در میان کاربران به اشتراک گذاشته شود و یا از طریق پست الکترونیکی برای استفاده خارج از خط و تجزیه و تحلیل ارسال می شود. در حال حاضر من در تمام کلاس های پایتونم از نوت بوک IPython استفاده می کنم. زیرا نه تنها آن دموی برنامه نویسی را با کیفیت بالا محیا می کند همچنین برنامه ها و اسناد را برای دانش آموزان ارسال می کند تا آنها بتوانند از آنچه در کلاس بحث شده درک بهتری داشته باشند.
ورود اطلاعات
اولین مرحله از هر پروژه علم داده این است که داده ها آماده باشند. در مورد تجزیه و تحلیل فایلهای آپاچی شما ممکن است فکر کنید تنها دریافت فایل ها کافی است! با این حال، پاندا- کتابخانه پایتون که من برای تجزیه و تحلیل داده ها در این مثال استفاده می کنم- مانند بسیاری از سیستم های علم داده ی دیگر (برای مثال، زبان R) انتظار دارد که داده ها در فرمت CSV باشند. این بدان معناست که شما نیاز به تبدیل لاگ فایل به فایل CSV دارید.
انجام چنین کاری در پایتون کاملا سر راست است. در اینجا یک نمونه از لاگ فایل آپاچی را می بینیم:
122.179.187.119 - - [22/Jan/2016:11:57:26 +0200] "GET
↪/wp-content/uploads/2014/10/3D_book.jpg HTTP/1.1" 200 302222
↪"http://blog.lerner.co.il/turning-postgresql-rows-arrays-array/"
↪"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like
↪Gecko) Chrome/47.0.2493.0 Safari/537.36"
122.179.187.119 - - [22/Jan/2016:11:57:27 +0200] "POST
↪/wp-admin/admin-ajax.php HTTP/1.1" 200 571
↪"http://blog.lerner.co.il/turning-postgresql-rows-arrays-array/"
↪"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like
↪Gecko) Chrome/47.0.2493.0 Safari/537.36"
54.193.228.6 - - [22/Jan/2016:11:57:29 +0200] "GET
↪/category/python/feed/ HTTP/1.1" 200 25856 "-" "Digg Feed
↪Fetcher 1.0 (Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_1)
↪AppleWebKit/534.48.3 (KHTML, like Gecko) Version/5.1
↪Safari/534.48.3)"
معنی هر خط برنامه به صورت زیر است:
آدرس IPای که درخواست کرده بود.
دو رشته (نمایش با - کاراکتر) نیاز به انجام با احراز هویت.
برچسب زمان.
درخواست HTTP، شروع با روش درخواست HTTP (معمولا GET یا POST) و یک آدرس.
کد نتیجه، که در آن 200 نشان دهنده "OK" است.
تعداد بایت منتقل شده است.
ارجاع، به معنی URLای که کاربر از آن آمده است.
روشی که در آن مرورگر خود را شناسایی می کند.
این اطلاعات ممکن است کمی محدود به نظر برسد، اما شما می توانید آن را برای فهم تعداد زیادی از عوامل بهتر مانند بازدید کنندگان وبلاگ خود استفاده کنید. توجه داشته باشید که این شامل اطلاعاتی که بسته های تجزیه و تحلیل داده مبتنی بر جاوا اسکریپت (برای مثال، گوگل آنالیز) ارائه میکنند نمی شود. مانند جلسه، اطلاعات و کوکی های مرورگر و ... . با این وجود، به شما اصول اولیه خوبی را می دهد.
دو گام نخست هر پروژه علم داده به این صورت است: 1) وارد کردن داده ها و 2) پاک کردن داده ها. دلیلش این است که هر منبع داده ،اطلاعاتی که شاید مفید و مرتبط با اهداف ما نیست داشته باشد، که خراب کردن آمار و یا اضافه کردن بی فایده داده را به دنبال دارد. بنابراین، در اینجا من قصد دارم با ورود لاگ فایل آپاچی به پایتون این خطوط بی ربط را حذف کنم. البته تلقی "بی ربط" تا حدودی ذهنی است.
اجازه دهید با یک تجزیه بسیار ساده از لاگ فایل آپاچی شروع کنیم. یکی از اولین چیزهایی که برنامه نویسان پایتون یاد می گیرند این است که چگونه به تکرار در خطوط یک فایل بپردازند:
infile = 'short-access-log'
for line in open(infile):
print(line)
کد بالا فایل را خط به خط چاپ می کند. با این حال، در این مثال، من علاقه مند به چاپ آن نیستم بلکه من علاقه مند به تبدیل آن به یک فایل CSV هستم. علاوه بر این، من می خواهم خطوطی که کمتر مهم هستند یا داده ی جعلی (ناخواسته) ارائه می کنند را حذف کنم.
به منظور ایجاد یک فایل CSV، من قصد دارم از ماژول CSV که در پایتون هست استفاده کنم. یکی از مزایای این ماژول ایجاد جدا کننده است. من ترجیح می دهم از زبانه ها(Tabs) بین ستون ها استفاده کنم چرا که هیچ شانسی برای مخلوط کردن زبانه ها با داده های من وجود ندارد.
اما چگونه می توان داده ها را از لاگ فایل به ماژول CSV برد؟ یک راه ساده برای مقابله با این امر شکستن رشته ورودی با استفاده از روش str.split است. خبر خوب این است که تا حدی کار خواهد کرد، اما خبر بد این است که آن همه چیز را به شکلی نا خوشایند جدا می کند و شما در نهایت با انواع چیزهای دیوانه واری مواجه خواهید شد.
خط پایین برای این است که اگر شما می خواهید یک لاگ فایل آپاچی بخوانید، نیاز به فهمیدن فرمت لاگ فایل آپاچی و خواندن آن با استفاده از یک عبارت منظم دارید. یا اگر کمی هوشمندانه عمل کنید، می توانید از کتابخانه ای که شامل regexp است استفاده کنید. من در PyPI (شاخص بسته بندی پایتون) جستجو کردم و clfparser را پیدا کردم. بسته ای که می تواند فایلهای آپاچی را به آنچه به عنوان "فرمت لاگ فایل " شناخته می شود،تجزیه کند. اگر خط متغیر شامل یک خط از لاگ فایل آپاچی باشد، می توانید کد زیر را اجرا کنید:
from clfparser import CLFParser
infilename = 'short-access-log'
for line in open(infilename):
print CLFParser.logDict(line)
در این روش، من هر خط ازلاگ فایل را به یک دیکشنری پایتون تبدیل می کنم که هر جفت key-value در دیکشنری به یک سطر متفاوت از لاگ فایل ارجاع داده می شود.
حالا من به ماژول CSV بر می گردم و کلاس DictWriter که همراه با آن است را بکار می گیرم. DictWriter، همانطور که شما احتمالا حدس می زنید، اجازه می دهد که ازCSV بر اساس یک دیکشنری خروجی بگیرید و به شما امکان چشم پوشی یا حتی تنظیم ترتیب در فایل CSV داده شده را می دهد. سپس شما می توانید در فایل خود تکرار ایجاد کنید وCSV ایجاد کنید.
در اینجا کد را ببینید:
import csv
from clfparser import CLFParser
infilename = 'short-access-log'
outfilename = 'access.csv'
with open(outfilename, 'w') as outfile, open(infilename) as infile:
fieldnames = ['Referer', 'Useragent', 'b', 'h', 'l', 'r', 's',
↪
't', 'time', 'timezone', 'u']
writer = csv.DictWriter(outfile, fieldnames=fieldnames,
↪
delimiter='\t')
writer.writeheader()
for line in infile:
writer.writerow(CLFParser.logDict(line))
اجازه دهید درباره این کد خط به خط صحبت کنیم. این کد پیچیده نیست و بسته ها و قابلیت هایی دارد که در یک فضای کوچک ارائه می شوند:
اول، من ماژول CSV و کلاس CLFParser را از ماژول clfparser وارد کردم. من قصد دارم از هر دوی این ماژول ها در این برنامه استفاده کنم. اولی به من اجازه خواهد داد تا از CSV خروجی بگیرم و دومی به من اجازه خواندن از آپاچی لاگ را می دهد.
من اسامی فایل های ورودی و خروجی را برای پاک کردن و استفاده مجدد آسان تر از این کد اینجا قرار دادم.
سپس از with، که به عنوان یک "context manager" در پایتون شناخته شده است استفاده می کنم. ایده اصلی این است که من دو فایل شی ساختم. یکی برای خواندن (لاگ فایل) و یکی برای نوشتن (فایل CSV). زمانی که بلوک with به پایان می رسد هر دو فایل بسته خواهد شد، تا اینکه داده ای جا نمانده اطمینان حاصل شود.
با توجه به اینکه من قصد دارم از DictWriter استفاده کنم باید ترتیب اینکه کدامیک از فیلد ها خروجی می شوند را بیان کنم. من این کار را در یک لیست انجام دادم.
سپس من شی csv.DictWriter را ایجاد کردم، و به آن گفتم که من می خواهم با استفاده از نام فیلدهایی که تعریف کردم و تب به عنوان یک حائل بین فیلدها داده ها را در OUTFILEها بنویسم.
سپس یک هدر برای فایل نوشتم هر چند این کار خیلی هم مهم نیست ولی من برای اشکال زدایی آسان تر، این کار را توصیه می کنم. علاوه بر این، تمام تجزیه کننده CSV که من می شناسم قادر به اجرای چنین چیزی بدون مشکل هستند.
در نهایت، من در ردیف های access log تکرار کردم. هر خط را به یک دیکشنری تبدیل کردم و سپس نوشتن دیکشنری به فایل CSV. در واقع، شما می توانید استدلال کنید که خط آخر این برنامه قسمت اصلی کد است وهمه چیز تا آن نقطه فقط یک مقدمه است.
پاک کردن داده ها
شما هم اکنون یاد گرفتید که می توانید داده ها را از شکل دیگری به صورت یک فایل CSV وارد کنید. CSV یکی از فرمت های رایج مورد استفاده در علم داده است. با این حال، همانطور که قبلا هم ذکر شد، یکی از چیزهای کلیدی این است که شما نیاز به پاک کردن داده ها دارید. تجزیه و تحلیل داده های بی ربط ، نتایج بی ربط را شامل می شود.
چه نوع داده هایی نیاز به پاک شدن دارند؟
یک نامزد واضح، حذف چیزی است که انسان واقعی نباشد. شاید شما علاقه مند به پیدا کردن crawler ها، مانند گوگل و یاهو هستید. یعنی شما میخواهید بدانید که انسان ها چه کاری انجام داده اند، که به معنی از بین بردن تمام روبات ها است.
البته این پرسش که چگونه می دانید که درخواست از یک ربات بوده است یا خیربوجود می آید. به عنوان انسان، شما می توانید User-agent string را بررسی و یک حدس علمی بزنید. اما با توجه به اینکه شما در حال تلاش برای حذف تمام روبات ها هستید و تعداد آنها به طور مداوم اضافه می شود یک روش خودکار بهتر خواهد بود.
هیچ پاسخ کاملی برای این سوال وجود ندارد اما برای اهداف این مقاله، من تصمیم گرفتم از یک ماژول پایتون قدیمی دیگر از PyPI -که به عنوان تشخیص ربات شناخته شده-استفاده کنم. شما این ماژول را وارد می کنید و سپس از تابع is_robot در فیلد useragent استفاده کنید. اگر یک ربات باشد، is_robot "درست" را بر میگرداند.
در اینجا کد را می بینید:
import csv
from clfparser import CLFParser
from collections import Counter
import robot_detection
infilename = 'medium-access-log.txt'
outfilename = 'access.csv'
robot_count = Counter()
with open(outfilename, 'w') as outfile, open(infilename) as infile:
fieldnames = ['Referer', 'Useragent', 'b', 'h', 'l', 'r', 's',
↪
't', 'time', 'timezone', 'u']
writer = csv.DictWriter(outfile, fieldnames=fieldnames,
↪
delimiter='\t')
writer.writeheader()
for line in infile:
d = CLFParser.logDict(line)
if robot_detection.is_robot(d['Useragent']):
robot_count[d['Useragent']] += 1
else:
writer.writerow(d)
کد بالا از نسخه ی قبلی بدون تغییرتر است. دو تغییری که حاصل شده به شرح زیر می باشد: از robot_detection برای فیلتر کردن روبات ها و از کلاس شمارنده پایتون برای شمارش دفعات ارسال درخواست هر ربات استفاده می کنم. این به تنهایی ممکن است اطلاعات مفیدی باشد -شاید در حال حاضر نیست، اما در آینده باشد. به عنوان مثال، پس از بررسی 100،000 درخواست اخیر وبلاگم متوجه شدم که بیش از 1000 درخواست از " domain re-animator bot" وجود دارد که تا به حال چیزی از آن نشنیده بودم.
با توجه به اینکه در حال حاضر بر روی داده های کاربران تمرکز کرده ام فیلتر کردن درخواست ربات ها داده ها را قابل اطمینان تر کرده است. از 100،000 ثبت، تنها 27،000 انسان بودند.
نتیجه
اولین مرحله از هر پروژه تحلیل داده این است که داده ها را وارد و پاک کنید. در اینجا، من داده ها را به فرمت CSV تبدیل کردم و برخی از خطوطی که کمتر مورد علاقه بود را فیلتر کردم. اما این فقط شروع تجزیه و تحلیل است نه پایان آن. ماه بعد، توضیح می دهم که چگونه می توانید این داده ها را به بسته پاندا پایتون وارد کنید و سپس شروع به تجزیه و تحلیل لاگ فایل با روش های مختلف کنید.
منابع
علم داده یک موضوع داغ است و کتاب های خوب بسیاری در این مورد وجود دارد. من اخیرا کتاب علم داده پایتون Jake VanderPlas را مطالعه کردم و بسیار لذت بردم، که حاوی اطلاعات زیادی درباره علم اطلاعات و همچنین استفاده در پایتون است.
منبع خبر: linuxjournal
ثبت نظر