پایتون و گردآوری دادههای وب با استفاده از آن
گاه نیاز به گردآوری دادههای خام وب برای اجرای یک پروژه است. برای مثال، از این دادهها برای تحلیلهای مربوط به تماسهای گرفته شده با یک مرکز آتشنشانی، قیمت طلا یا بورس میتوان استفاده کرد. صفحه وبی مانند زیر نمونه خوبی از دادههای جدولی موجود در یک صفحه وب است.
این صفحه، حاوی دادههای خام قابل استفاده برای کارهای پژوهشی محسوب میشود. اما، مساله این است که دادهها در صفحه وبی هستند که رابط برنامهنویسی کاربردی (API) برای گردآوری آنها وجود ندارد. لذا باید بالغ بر ۳۰ دقیقه زمان برای نوشتن اسکریپت جمعآوری دادهها صرف کرد. نوشتن اسکریپت مناسب برای این کار سخت نیست اما به نوعی اتلاف وقت محسوب میشود، زیرا میتوان این زمان را به کار دیگری اختصاص داد. البته تجربه نشان داده کار نوشتن کدهایی که قرار است طی سی دقیقه کامل شوند، حداقل دو ساعت به طول میانجامد.
خوشبختانه، یک راهکار بسیار سادهتر نیز برای این مساله وجود دارد. کتابخانه Pandas پایتون دارای یک راهکار توکار به نام ()read_html برای گردآوری دادههای جدولی از یک صفحه html است.
1import pandas as pd
2
3tables = pd.read_html("https://apps.sandiego.gov/sdfiredispatch/")
4
5print(tables[0])
بهرهگیری از این راهکار بسیار ساده است. Pandas هر جدول html قابل توجهی که در صفحه وب وجود داشته باشد را بهعنوان یک شی DataFrame جدید شناسایی میکند. به منظور ارتقا کد بالا به یک برنامه قابل استفاده برای مسائل واقعی، اصلاحاتی در آن انجام میشود. ابتدا، سطر صفر جدول به عنوان سطر حاوی header جدولها معرفی و درخواست تبدیل دادههای مبتنی بر متن به time objectها، داده میشود.
1import pandas as pd
2
3calls_df, = pd.read_html("http://apps.sandiego.gov/sdfiredispatch/", header=0, parse_dates=["Call Date"])
4
5print(calls_df)
خروجی کد بالا به صورت زیر است:
شیوه قرارگیری دادهها در DataFrame و در واقع قالب آنها اغلب برای کاربر مهم است. فرمت فایل json برای انجام کارهای گوناگون طرفداران زیادی دارد و لذا احتمال آنکه تمایل به دریافت خروجی به صورت رکوردهای json وجود داشته باشد زیاد است. خبر خوب اینکه تنها با اضافه کردن یک خط کد دیگر میتوان خروجی را به صورت json دریافت کرد.
1import pandas as pd
2
3calls_df, = pd.read_html("http://apps.sandiego.gov/sdfiredispatch/", header=0, parse_dates=["Call Date"])
4
5print(calls_df.to_json(orient="records", date_format="iso"))
با اجرای خط کد بالا میتوان خروجی خیلی خوب زیر را دریافت کرد (که حتی با قالببندی تاریخ ISO 8601 ارائه شده است). با استفاده از Pandas حتی میتوان دادهها را مستقیما بهصورت CSV و XLS نیز ذخیره کرد. کد لازم برای انجام این کار را در ادامه مشاهده میکنید.
1import pandas as pd
2
3calls_df, = pd.read_html("http://apps.sandiego.gov/sdfiredispatch/", header=0, parse_dates=["Call Date"])
4
5calls_df.to_csv("calls.csv", index=False)
پس از اجرای قطعه کد بالا و باز کردن فایل calls.csv، شاهد خروجی به شکل زیر خواهید بود:
Pandas، فرآیند فیلتر کردن و مرتبسازی دادهها را نیز سادهتر میکند.
اگر مطلب بالا برای شما مفید بود، آموزشهای زیر نیز به شما پیشنهاد میشود:
- آموزش برنامهنویسی پایتون
- آموزش تکمیلی برنامهنویسی پایتون
- آموزش جمعآوری و تحلیل مجموعه دادههای بزرگ در زیست شناسی سامانهای
- گنجینه آموزشهای برنامه نویسی پایتون (Python)
- آموزش یادگیری ماشین (Machine Learning) با پایتون (Python)
^^
با سلام
به طور مثال درجایی که به لینک زیر اشاره میکند، آن را باز نمیکند و با آدرسی دیگر صفحه را لود میشود. و زمان اجرای دستور جوابی بر نمیگرداند.
https://apps.sandiego.gov/sdfiredispatch/
با تقدیم احترام
درود
وقت شما به خیر
ظاهرا سایت منبع در حال انجام تغییراتی است و به همین دلیل محتوای صفحه مذکور را به درستی نمایش نمیدهد. این مساله در صفحهای که لینک به آن ارجاع داده میشود، بیان شده است. لینک در زمان درج مطلب صحیح بوده است. پیشنهاد میشود با مراجعه به web archive، از نسخه قدیمیتر و صحیح صفحه استفاده کنید.
از همراهی شما و ارائه بازخورد، بسیار سپاسگزارم
با سلام و خدا قوت
لینکی که در مطلب استفاده شده غیر معتبر میباشد. لطفا اصلاح شود.
با تشکر
درود
وقت به خیر
از شما بابت ارائه بازخورد بسیار سپاسگزارم. لینکهای موجود در متن بررسی شدند و کلیه موارد صحیح هستند. لطفا در صورتی که لینکی در متن برای شما اشکال دارد، بفرمایید دقیقا کدام مورد است تا پیگیری شود.
بسیار سپاسگزارم