دانشجوی مادام العمر??، دلباختهی هوش مصنوعی ?
استخراج داده های فروش فیلم ها با زبان R
"در جایی که دودی از داده باشد، در آنجا آتش کسب و کار وجود دارد." توماس ردمن
در این مقاله قصد داریم داده های فروش هفتگی یا همون Box Office رو از سایت سینما تیکت استخراج کنیم یا به طور دقیق تر Scrape کنیم. برای این کار از زبان برنامه نویسی R کمک می گیریم.
زبان برنامه نویسی R و پکیج rvest
همان طور که می دونید، R یک زبان برنامه نویسی است که در بسیاری از کار های آماری و داده کاوی استفاده میشه. در عین قدرتمند بودن، زبان خیلی ساده ای هستش و منطق ساده ای داره. به خاطر تابع های بسیار زیاد و کاربردی و کتاب خانه های کامل که برای زمینه هایی مثل آمار، داده کاوی و آنالیز داده ها داره، خیلی مورد استفاده متخصصان این حوزه های قرار گرفته.
دراین جا هم قراره از پکیج rvest استفاده کنیم.البته پکیج های دیگه ای هم مثل RSelenium و rcrawler هم وجود دارند اما این جا کار ساده ای در پیش داریم و همین rvest همه ی نیاز های ما رو برآورده می کنه.
نگاهی به داده ها
سایت سینماتیکت هر هفته میزان فروش فیلم های سینمای داخل ایران رو در قالب یه جدول منتشر میکنه. اگه بخواییم این داده ها رو داشته باشیم باید چی کار کرد؟
یک روش اینه بریم داده ها رو بخونیم و به شکل دستی توی برنامه ای مثل اکسل وارد کنیم که روش مناسبی نیست. میشه با چند خط کد در زبان R به راحتی این جدول رو بدست آورد و هرهفته با یک کلیک، جدول رو داشت.
نوشتن تابع در R
یک تابع می نویسیم تا صفحه ی فروش (که فایل HTML هستش) رو از سینماتیکت دریافت کنه و تابع دیگری برای استخراج جدول از اون صفحه.
تابع اول به اسم GetBoxOffice است:
GetBoxOffice <- function() {
url <- "https://cinematicket.org/?p=boxoffice"
response <- GET(url = url)
html <- read_html(response)
return(GetTable(html))
}
این تابع ورودی نداره، آدرس صفحه رو در داخل url ذخیره می کنیم. با تابع GET اون صفحه رو دانلود می کنیم و با تابع read_html فایل HTML رو در html ذخیره میکنیم. به جای چاپ متغیر html، با دستور زیر میشه اون رو توی یه فایل نوشت و برسیش کرد:
write_xml(html , file="boxoffice_page.html")
در نهایت html رو به تابع دوم میدیم که قراره جدول فروش رو برگردونه.
برسی ساختار صفحه وب سایت مورد نظر
قبل از برسی تابع دوم، اجازه بدید یه مسئله مهم در Web scraping رو برسی کنیم. برای اینکه قسمت های مختلفی از یه سایت رو بخوایم داشته باشیم، مثلا عنوان ها، عدد ها و یا جدول ها، باید ساختار HTML اون ها رو توی سایت مقصد بدنیم. برای این کار در سایت سینماتیکت روی جدول فروش کلیک راست کنید و گزینه Inspect رو انتخاب کنید.
در کل هر وقت نیاز داشتیم ساختار HTML قسمتی از سایت رو بدونیم از این روش استفاده می کنیم. با این کار پنجره Developer tools در زیر مرورگر (بعضی وقت ها کنارش) باز میشه که کد های HTML سایت رو نشون میده.
ما نیاز داریم ساختار جدول رو بدونیم، همون طور که در شکل زیر معلومه، در این سایت برای جدول از تگ table استفاده شده:
حالا می دونیم که در جدول مورد نظر ما، از تگ table استفاده شده. گاهی نیاز هست که class مورد استفاده در قسمتی از سایت رو بدونیم یا مثل اینجا، تگ مورد استفاده. دقت کنید که همه ی این موارد در سایت های مختلف متغیره.
نوشتن تابع دوم و نهایی
تابع دوم GetTable هستش که به html صفحه نیاز داره تا از اون جدول رو بیرون بکشه:
GetTable <- function(html) {
weekly.boxoffice <- html %>%
html_nodes("table") %>%
extract2(1) %>%
html_table()
}
متغیر جدیدی می سازیم به نام weekly.boxoffice که جدول نهایی در اون ذخیره میشه و در نهایت برگشت داده میشه. تابع html_nodes تمام قسمت هایی از فایل html که تگ table دارند رو جدا میکنه و مقدارش رو به extract2 میده.
اگر فقط کد زیر رو اجرا کنید، می بینید که فقط یک جدول پیدا شده و ما به اون نیاز داریم. با تابع extract2 اون رو جدا می کنیم و به تابع html_table میدیم تا نتیجه رو در قالب جدول ذخیره کنه.
weekly.boxoffice <- html %>%
html_nodes("table")
درنهایت با اجرای تابع GetBoxOffice، جدول فروش رو بدست می آریم.
حرف آخر
کاری که اینجا کردیم نمونه ی ساده ای از Web Scraping بود. امیدوارم مفید بوده باشه، در این صورت می تونید روی قلب ? زیر این مطلب کلیک کنید :))) خوش حال میشم تجربه های خودتون رو این جا به اشتراک بذارید.
در مطلب بعدی آماده سازی این داده ها برای آنالیز همچنین کشیدن نمودار در R رو بررسی می کنیم. کد های کامل این مطلب رو می تونید به صورت کامل از گیت هاب دانلود کنید.
مطلبی دیگر از این انتشارات
خلاصه متنی رایگان کتاب تخت خوابت را مرتب کن
مطلبی دیگر از این انتشارات
برنامه عملیاتی چیست؟
مطلبی دیگر از این انتشارات
درباره فیلم کبوتری که برای تامل درباره هستی روی شاخه نشست