با داده‌ها چه می‌توان کرد؟ 7 - استخراج داده ها با پایتون



در این قسمت با استفاده از زبان برنامه نویسی پایتون، به استخراج داده ها که در انگلیسی به آن scraping گفته می شود، می پردازیم. نوت بوک ژوپیتر jupyter Notbook را باز کنید. به دایرکتوری مورد نظر بروید. (شاید در دسکتاپ و پوشه پانداز که از قبل درست کرده بودید.) سپس بر روی نوتبوک در سمت راست بالا، بر روی New کلیک کنید و از کشویی که به پایین باز می شود، گزینه پایتون3 Python 3 را انتخاب کنید. یک صفحه جدید با یک سلول باز می شود که می توانید در آن کد بنویسید.



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

این ابزار requests نام دارد. اما ابتدا باید آنرا به اینجا آورده تا بتوانیم از قابلیتهایش استفاده کنیم. این عمل را با کد انجام import requests انجام می دهیم.

سپس با توسل به متد get که در این ابزار وجود دارد، آدرس وبسایتی که می خواهیم را در ادامه requests قرار می دهیم تا تمامی مطالب آن تارنما را وارد نوتبوک خود کنیم و آنرا به متغیر reg ارجاع می دهیم. اکنون تمامی مطالب سایت مورد نظر در reg ذخیر شده است. به همین سادگی.
req = requests.get("https://en.wikipedia.org/wiki/Harvard_University")
توضیح یک نکته در این مرحله ضروری است. انجام این عمل، شاید بدون اطلاع مالک آن تارنما صورت گرفته باشد. برخی از سایتها، با استخراج مطالبشان توسط دیگران موافق نیستند و این مطلب را در سایتشان اعلام می کنند. لطفا قبل از استخراج مطالب یک سایت، چک کنید که آیا این کار قانونی است یا نه. استخراج مطالب دیگران به هر دلیلی، بدون رضایت مالک آنها به لحاظ اخلاقی نیز شایسته نیست.
در عکس زیر مراحل تا کنونی دیده می شود:

اگر reg را در سلول بعد وارد کنیم و آنرا اجرا کنیم Shift+Enter این جواب را می گیریم: <Response [200]>

پاسخ 200 به معنی ارتباط ایجاد شده بدون هیچ مشکلی است. در ارتباط شبکه Networking هر عدد داری معنی خاصی است. برخی از مهمترین آنها به این معنی است:
200 - Ok
301- بصورت دائمی منتقل شده
302- بطور موقت منتقل شده
403 - ممنوع
404- پیدا نشد
500 - اشکال داخلی سِرور
503- سرویس در درست رس نیست

برای نشان دادن متن سایت مزبور از این کد استفاده می کنیم
page = req.text
با این کد ما متن سایت را در کلمه page ذخیره کردیم. اکنون برای نشان داد متن ذخیره شده، کافیست که کلمه page را بنویسیم و اجرا کنیم تا متن را ببینیم.


همانگونه که ملاحظه می کنید کلیت متنی که استخراج کردیم را می بینیم. متن دیده شده در نوتبوک با آنچه که در سایت دیده ویکی پیدیا دیده می شود، بدون شک متفاوت است. در اینجا همه چیز به هم چسبیده و خوانا نیست. برای زیبا سازی و خوانا شدن متن، یک ابزار دیگر بنام BeautifulSoup را از بسته bs4 به پایتون وارد می کنیم.
from bs4 import BeautifulSoup

سپس با این ابزار page را دوباره، اما با شکل و شمایل بهتر وارد می کنیم و آنرا در کلمه soup ذخیره می کنیم.
حالا اگر کلمه soup را در سلول بنویسیم و اجرا کنیم به این صورت در می آید:


با این کد می توانیم از همینجا تیتر سایت را استخراج کنیم.
soup.title
با این کد می توانیم تعداد کل پاراگرافهای سایت را معین کنیم:
len(soup.find_all("p"))

توجه داشته باشیم که در اچ تی ام ال html پی p معرف پاراگراف است و len کوتاه شده length به معنی درازا (اندازه یا تعداد) است. اگر کلمه all را ننویسیم، شماره اولین پاراگراف را نشان می دهد که 1 است. اگر در داخل len یک کلمه قرار دهیم، تعداد حروف آن را نشان می دهد والی آخر.

هدف ما از استخراج مطالب این سایت، دانلود و جداسازی این جدول است:

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

در این آموزشها فرض بر این است که شما حداقلی از html را می دانید و از کاربرد class در آن آگاهید. با این کد ما تمامی class ها را در سایت مزبور مشخص می کنیم:
[t["class"] for t in soup.find_all("table") if t.get("class")]

برای مشاهده بهتر روی عکس کلیک کنید.

کد بالا (loop) شکل خلاصه شده این کد است. در قسمت آینده آموزش سریع بخشهای دیگری از زبان پایتون را مرور خواهیم کرد.
my_list = []
for t in soup.find_all("table"):
    if t.get("class"):
        my_list.append(t["class"])
my_list

عکس بالا لیست همه class هاست. اگر دقت کنید، جدول مورد نظر سومین  wikitable است. برای جدا کردن آن از کد زیر استفاده می کنیم و آنرا در table_html ذخیره می کنیم :
table_html = str(soup.find_all("table", "wikitable")[2])

توجه داشته باشید که برای انتخاب سومین استرینگ wikitable از [2] به معنای جایگاه سوم استفاده می کنیم. حال با import کردن یک ابزار دیگر پایتون، کار را به سرانجام می رسانیم.


اکنون ما توانستیم جدول را از بقیه سایت جدا کنیم. اما عددهایی که می بینیم، string است و پایتون آنها را عدد نمی بیند. برای تبدیل آنها به عددها که قابلیت اعمال ریاضیات بر روی آنها داشته باشیم باید از کدهای دیگری استفاده کنیم که این بحث را در قسمت آینده ادامه خواهیم داد.




*- بیشتر ملاتها در مورد بررسی آماری در این سلسله مطالب، برگرفته از دو کتاب An Introduction to Statistical Learning و The Elements of Statistical Learning Data Mining, Inference, and Prediction از انتشارات سپرینگر springer.com/us و کلاسهای ارائه شده آنلاین توسط دانشگاه هاروارد است.

**- استفاده از این سلسله مطالب با ذکر منبع آزاد است.
 

Comments

Popular posts from this blog

با داده‌ها چه می‌توان کرد؟ 12 - کار با پانداز - 3 چگونه داده‌ها را وارد کنیم؟