یک آموزش از سامسونگ: Web Scraping در Python

من به تازگی از KinoPoisk (نسخه روسی IMDB) بازدید کرده ام و فهمیدم که طی این سالها توانستم بیش از 1000 فیلم را رتبه بندی کنم. من فکر کردم تحقیق دقیق تر درباره این داده ها جالب خواهد بود: آیا سلیقه فیلم من با گذشت زمان تغییر کرده است؟ در کدام فصول سال فیلم های بیشتری تماشا می کنم؟

اما قبل از تجزیه و تحلیل و ساختن گرافیک های زیبا ، باید داده ها را بدست آوریم. متأسفانه ، بسیاری از سرویس ها API عمومی ندارند ، بنابراین باید آستین های خود را جمع کنید و صفحات html را تجزیه کنید.

این مقاله برای کسانی است که همیشه می خواستند نحوه استفاده از Web Scrapping را یاد بگیرند اما دست خود را به آن نرسانده یا نمی دانند از کجا شروع کنند.

وظیفه

وظیفه ما استخراج داده های مربوط به فیلم هایی است که قبلاً دیده شده است: عنوان فیلم ، تاریخ و زمان تماشای ، رتبه کاربر.

در واقع کار ما در 2 مرحله انجام می شود:

مرحله 1: صفحات HTML را بارگیری و ذخیره کنید

مرحله 2: تجزیه HTML در قالب مناسب برای تجزیه و تحلیل بیشتر (csv ، json ، pandas dataframe و غیره)

سازها

تعداد زیادی کتابخانه پایتون برای ارسال درخواست های http وجود دارد. معروف ترین و بسیار مفید یکی از درخواست ها است.

همچنین لازم است کتابخانه ای برای تجزیه و تحلیل html انتخاب شود.

BeatifulSoup ، lxml

این دو کتابخانه محبوب برای تجزیه و تحلیل html هستند و انتخاب یکی از آنها فقط یک اولویت شخصی است. علاوه بر این ، این کتابخانه ها به یکدیگر نزدیک هستند: BeautifulSoup شروع به استفاده از lxml به عنوان یک تجزیه کننده داخلی برای شتاب کرد ، و در lxml ، یک ماژول supparser اضافه شد. برای مقایسه رویکردها ، داده ها را با BeautifulSoup و استفاده از انتخاب کننده XPath در ماژول lxml.html تجزیه خواهیم کرد.

بارگیری داده ها

بیایید بارگیری داده ها را شروع کنیم. اول از همه ، بیایید فقط سعی کنید صفحه را از طریق url دریافت کنیم و آن را در یک فایل محلی ذخیره کنیم.

پرونده به دست آمده را باز می کنیم و می بینیم که این چندان ساده نیست: سایت ما روبات را در نظر گرفته و داده ها را نشان نمی دهد.

بیایید دریابیم که سایت چگونه کار می کند

مرورگر مشکلی در گرفتن اطلاعات از سایت ندارد. بیایید ببینیم دقیقاً چگونه درخواست را ارسال می کند. برای این کار از پانل "Network" در "Tools Developer" در مرورگر استفاده می کنیم (من برای این کار از Firebug استفاده می کنم) ، معمولاً ، درخواستی که ما نیاز داریم طولانی ترین مورد است.

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

این بار موفق هستیم و اکنون داده های لازم به ما داده می شود. شایان ذکر است که گاهی اوقات سایت اعتبار کوکی را نیز بررسی می کند ، که در این صورت جلسات کتابخانه Requests کمک می کند.

بارگیری همه نرخ ها

اکنون ما قادر به ذخیره یک صفحه با نرخ هستیم. اما معمولاً کاربر نرخ زیادی دارد و لازم است تا در تمام صفحات این کار را تکرار کند. شماره صفحه ای که مورد علاقه ماست ، انتقال مستقیم به آدرس اینترنتی آسان است.

جمع آوری داده ها از Html

حالا بیایید مستقیماً به جمع آوری داده ها از html برسیم. ساده ترین روش برای درک نحوه ساختن صفحه html استفاده از تابع "Inspect element" در مرورگر است. در این حالت ، همه چیز بسیار ساده است: کل جدول با نرخ در برچسب است. این گره را انتخاب کنید:

از واردات bs4 BeautifulSoup

از واردات lxml html

# سوپ زیبا

سوپ = BeautifulSoup (متن)

film_list = soup.find ('div'، ('class': 'profileFilmsList'))

# lxml

درخت = html.fromstring (متن)

film_list_lxml = tree.xpath ('// div [class =' 'profileFilmList' ']') ”) [0]

بیایید یاد بگیریم که چگونه عنوان روسیه را از فیلم بیرون بیاوریم و پیوندی به صفحه فیلم (همچنین نحوه دریافت متن و ارزش ویژگی) را بیاموزیم.

اگر شما نیاز به استخراج عنوان به زبان انگلیسی دارید ، "nameRus" را به "nameEng" تغییر دهید.

نتایج

ما یاد گرفتیم که چگونه وب سایت ها را تجزیه کنیم ، با کتابخانه ها درخواست ها ، BeautifulSoup و lxml آشنا شویم ، و همچنین داده های مناسب را برای تجزیه و تحلیل بیشتر فیلمهای که قبلاً در KinoPoisk دیده شده است ، دریافت کردیم.