در آموزش های قبلی ما ، بحث کردیم که چقدر ضایعات مهم در دنیای محور اطلاعات فعلی مهم است. این یکی از ساده ترین و بهترین راه ها برای جمع آوری داده های انبوه از یک وب سایت است. ما همچنین در مورد چگونگی خوب Scrapy در بین سایر چارچوب های خراش بحث کرده ایم. این عملکرد scraping را تا حد زیادی بهبود می بخشد. در این آموزش یاد خواهید گرفت که در مورد قراضه کردن با چالش های جدیدی روبرو شوید.
امروز ما در مورد چگونگی خراش دادن flippa.com بحث می کنیم. flippa.com وب سایتی است که می توانید وب سایت ها و برنامه های اندرویدی را بخرید و بفروشید. در واقع ، آنها به حراج گذاشته می شوند تا علاقه مندان بتوانند در آن داوطلب شوند. در این آموزش ، ما برنامه های اندرویدی را به فروش می رسانیم.
دلایل زیادی وجود دارد که بخواهید سایتی مانند flippa.com را سرقت کنید. اگر بتوانید تمام داده ها را در یک مکان قرار دهید ، تجزیه و تحلیل آسان تر است. همچنین ، با خراش دادن ، می توانید داده ها را در قالب هایی مانند JSON ، CSV ذخیره کنید ، بنابراین انجام محاسبات بر روی آنها ساده تر است. به عنوان مثال ، فرض کنید می خواهید برنامه را با قیمت پایین تر و تعداد بیشتری نصب نصب کنید ، می توانید به راحتی با داده های خراشیده آن را پیدا کنید.
طبق معمول ، بیایید با نصب Scrapy شروع کنیم. دو روش محبوب برای نصب Scrapy وجود دارد. برای نصب Scrapy می توانید از پیپ یا آناکوندا استفاده کنید. نصب Scrapy از طریق پیپ بسیار ساده تر است. اما گاهی اوقات می توانید نسخه قدیمی Scrapy را نصب کنید. بنابراین توصیه می کنیم برای نصب Scrapy از آناکوندا استفاده کنید.
به هر حال ، ما هر دو روش انجام این کار را آموزش خواهیم داد.
نصب از طریق پیپ
ابتدا ، اطمینان حاصل کنید که آخرین نسخه پایتون را روی دستگاه خود نصب کرده اید.
python -V
اگر هنوز پیپی را بر روی رایانه خود نصب نکرده اید ، آن را از اینجا دریافت کنید. اگر پیپ دارید ، آن را با دستور زیر به روز کنید.
python -m pip install - pip upgrade
Scrapy را با یک فرمان نصب کنید.
pip نصب Scrapy
نصب از طریق آناکوندا
بعضی اوقات افراد فرض می کنند که آناکوندا و پیپ همان کار را انجام می دهند. این درست نیست. در واقع ، آنها اهداف مختلفی دارند. pip ابزاری برای نصب بسته ها از فهرست بسته بندی پیتون ، پیپی است. آناکوندا بسیار بیشتر از این است. این یک بسته کراس پلت فرم و یک مدیر محیط زیست است. آناکوندا مدیر بسته خود را به نام کاندا دارد که شبیه پیپ است. هنگام استفاده از کاندا ، بسته هایی را از مخزن آناکوندا نصب می کند. BTW اکنون آناکوندا همچنین شامل پیپ است.
ابتدا ، از در اینجا آناکوندا بگیرید. شما می توانید با استفاده از دستور زیر ، Scrapy را با کادا نصب کنید.
نصب کاندرا - c scrap-forge scrap
بعدی ، ما باید یک برنامه برای برنامه خود ایجاد کنیم. کنسول cmd خود را باز کنید و به محلی که می خواهید پروژه را بسازید بروید.
cd
Scrapy دستور خود را برای ایجاد یک پروژه Scrapy دارد. این پرونده های اولیه مورد نیاز برای پروژه Scrapy را ایجاد می کند. شکل زیر می گیرد.
scrapy startproject project_name
من پروژه خود را نامگذاری می کنم scraping_flippa. بنابراین برای ایجاد فهرست باید دستور زیر را تایپ کنم.
پروژه اولیه scrapy scraping_flippa
این پوشه ای را با نام پروژه ایجاد می کند. شما می توانید پرونده های زیر را در آن پوشه مشاهده کنید.
بیایید ببینیم که هر پرونده در مورد
├── scrapy.cfg # پرونده پیکربندی └── scraping_reddit # این ماژول پایتون این پروژه است ، شما باید وارد کنید کد شما از این ├── __init__.py # مورد نیاز برای مدیریت عنکبوت در پروژه ├── things.py # تعریف ماژول های موارد ضبط شده ├── middlewares.py # تعریف ماژول های میانبر عنکبوتی ├── piplines.py # پرونده خط لوله پروژه ├── settings.py # تنظیمات را در اینجا اضافه کنید └── فهرست عنکبوت ها برای یافتن عنکبوتها ├ __init__.py
اکنون زمان آن رسیده است که عنکبوت خود را بسازیم. کد واقعی لازم برای انجام scraping در این پرونده قرار دارد. بعداً درباره کد بیشتر بحث خواهیم کرد. در حال حاضر ، ما فایل عنکبوتی را ایجاد خواهیم کرد.
برو به پوشه پروژه خود
cd scraping_flippa
genspider فرمان برای ایجاد عنکبوت ها استفاده می شود. دو آرگومان طول می کشد.
scrapy genspider spider_name start_url
من عنکبوت خود را flippa_spider نامگذاری می کنم و آدرس اینترنتی https://www.flippa.com/search؟filter [property_type] = android_app است. بنابراین فرمان من باید تایپ شود
scrsp genspider flippaSpider https://www.flippa.com/search؟filterociation19459031 دوست=android_app
بیایید عنکبوتی را که ما ایجاد کردیم بررسی کنیم. اگر پرونده را باز کنید ، می توانید کد زیر را در آن مشاهده کنید.
# - * - کد نویسی: utf-8 - * - اسکراب واردات کلاس FlippaspiderSpider (scrapy.Spider): name = 'flippaSpider' مجاز_domains = ['https://wwwflippacom/search؟filterociation19459031معروف=android_app'] start_urls = ['http://https://wwwflippacom/search؟filter[property_type] = android_app /'] دف تجزیه (خود ، پاسخ): pass
Scrappy قبلاً از اطلاعات مندرج در فرمان ، كد خرد را براي ما ايجاد كرده است. این نام کلاس ، نام عنکبوت ، دامنه های مجاز و start_urls را مطابق با نامگذاری نام خود تکمیل کرده است.
احتمالاً شما باید دامنه مجاز را به www.flippa.com تغییر دهید. همچنین ، لطفا آخرین بریده را در start_urls حذف کنید.
مجاز_دومین = ['www.flippa.com'] start_urls = ['https://wwwflippacom/search؟filterociation19459031معروف=android_app'الاتpoz19659056بانامScrapingCodeparse () جایی است که منطق خود را برای ضبط مطالب می نویسیم. شما می توانید به هدف پاسخ از اینجا دسترسی پیدا کنید. قبل از نوشتن منطق scraping ، ما باید وب سایت flippa.com را از نزدیک بررسی کنیم زیرا کد scraping بستگی به ساختار و محتوای صفحه وب دارد.
ما می خواهیم جزئیات زیر را درباره هر برنامه از flippa استخراج کنیم.
![]()
جدای از آن ، من نسخه جدیدی را خراب می کنم ، هم اکنون قیمت ، قیمت فعلی و پیوند به صفحه فروش برنامه را خریداری می کنم.
flippa.com یک وب سایت لیست است. این بدان معناست که اگر از مرورگر خود به start_url برویم ، می توانید لیستی از برنامه های اندرویدی را برای فروش به دست آورید.
![]()
ما باید به هر پیوند برویم تا اطلاعات مورد نظر خود را بدست آوریم. بعد ، صفحه start_url ما فقط 50 برنامه اندرویدی دارد. برای به دست آوردن تمام برنامه هایی که باید در صفحه زیر صفحه بندی را انجام دهیم. بنابراین ، خواهیم دید که چگونه می خواهیم این کار را انجام دهیم.
![]()
ما می توانیم مجموعه پیوندها را با استفاده از نام کلاس Basic__linkWrapper استخراج کنیم.
urls = پاسخ.xpath ('// a [@class="Basic___linkWrapper"] / @ href'). عصاره ()همچنین ، ما می توانیم هم اکنون از صفحه لیست قیمت خرید را استخراج کنیم.
buynw_prices = answer.xpath ('// div [@class="Basic___buyItNowCol grid__col-3 grid__col-md-2"] / text ()'). عصاره ()] بعد ، ما برای هر لینک درخواستی ایجاد می کنیم. با استفاده از Scrapy ، می توانید این کار را به صورت زیر انجام دهید.
برای (url ، buynw) به صورت فشرده (آدرس اینترنتی ، buynw_prices): url = پاسخ.urljoin (url) عملکرد scrapy.Request (url = url، callback = self.parse_items، dont_filter = True، meta = {'url': url، 'buynw': buynw})وقتی درخواست انجام شد ، تابع پاسخ به تماس خوانده می شود. . اگر بخواهیم پارامتری را به عملکرد پاسخ دادن ارسال کنیم ، این کار را با یک پارامتر متا انجام می دهیم.
کار بعدی ما نوشتن تابع parse_items است.
def parse_items (خود ، پاسخ): app_names = answer.xpath ('// a [@class="ListingHero-propertyIdentifierLink"] / متن ()'). عصاره () current_prices = پاسخ.xpath ("// h2 [contains(@class, 'ListingStatus-price')] / متن ()"). عصاره () buynw_price = پاسخ.meta ['buynw'] url = پاسخ.meta ['url'] installs = result.xpath ('// div [@id="number_of_installs"] / text ()'). عصاره () app_ages = answer.xpath ('// div [@id="app_age"] / text ()'). عصاره () بررسی = پاسخ.xpath ('// تقسیم [@class="Snapshot-subvalue"] / متن ()'). عصاره () قیمت = پاسخ.xpath ('// تقسیم [@id="app_store_price"] / متن ()'). عصاره () سود = پاسخ.xpath ('// تقسیم [@id="net_profit"] / متن ()'). عصاره () reskins = përgjig.xpath ('// div [@id="reskin"] / text ()'). عصاره () برای (app_name ، نصب ، app_age ، بررسی ، قیمت ، سود ، رزین ، فعلی_پریس) در zip (app_names ، نصب ، app_ages ، بررسی ، قیمت ، سود ، reskins ، جریان فعلی): عملکرد {'نام برنامه': app_name.encode ('utf-8'). نوار () ، 'تعداد نصب': install.encode ('utf-8') نوار () ، 'Age Age': app_age.encode ('utf-8'). نوار () ، 'رتبه بندی': review.encode ('utf-8'). نوار () ، 'قیمت فروشگاه App': price.encode ('utf-8') نوار () ، "سود خالص": profit.encode ("utf-8") نوار () ، "Reskin": reskin.encode ("utf-8"). نوار () ، "قیمت فعلی": current_price.encode ("utf-8"). نوار () ، 'URL': url ، 'Buy Now Price': buynw_price.encode ('utf-8'). نوار ()}اگرچه کد به نظر طولانی می رسد ، اما در اصل دو نوع کار را انجام می دهد. ابتدا جزئیات مربوط به هر برنامه را استخراج می کند و سپس آنرا بازده می کند. من دیدم که بسیاری از شخصیت های بی اهمیت با عملکرد فقط عصاره () استخراج می شوند. با استفاده از روش های رمزگذاری ( ‘utf-8» ) و نوار () می توانید شخصیت های ناخواسته و فضاهای دنباله دار را حذف کنید.
ما باید یک کار دیگر انجام دهیم. ما باید هر صفحه صفحه بندی را طی کنیم. بیایید منبع صفحه بندی را بررسی کنیم.
![]()
شما می توانید به صفحه فعال با pagination__item pagination__item-activ نام کلاس دسترسی پیدا کنید. شما می خواهید از Scrapy بخواهید خواهر و برادر بعدی این برچسب را دنبال کند. من آن را با کد زیر انجام دادم.
next_page = answer.xpath ('// // [@class="pagination__item pagination__item--active"] / دنبال-خواهر و برادر :: a [1] / @ href'). عصاره () اگر next_page هیچ یک نیست: next_page = 'https://www.flippa.com' + next_page [0] چاپ (next_page) بازده پاسخ دهید. دنبال (next_page، self.parse)اکنون کد ما کامل شد. بیایید ببینیم کد کامل چگونه به نظر می رسد.
# - * - کد نویسی: utf-8 - * - اسکراب واردات کلاس FlippaspiderSpider (scrapy.Spider): name = 'flippaSpider' مجاز_دومین = ['www.flippa.com'] start_urls = ['https://wwwflippacom/search؟filterociation19459031معروف=android_app'] دف تجزیه (خود ، پاسخ): urls = پاسخ.xpath ('// a [@class="Basic___linkWrapper"] / @ href'). عصاره () buynw_prices = پاسخ.xpath ('// تقسیم [@class="Basic___buyItNowCol grid__col-3 grid__col-md-2"] / متن ()'). عصاره () برای (url ، buynw) در zip (آدرس اینترنتی ، buynw_prices): url = پاسخ.urljoin (url) عملکرد scrapy.Request (url = url ، پاسخ به تماس = self.parse_items ، dont_filter = درست ، متا = {'url': url ، 'buynw': buynw}) next_page = پاسخ.xpath ('// a [@class="pagination__item pagination__item--active"] / دنبال-خواهر و برادر :: a [1] / @ href'). عصاره () اگر next_page هیچ یک نیست: next_page = 'https://www.flippa.com' + next_page [0] چاپ (next_page) پاسخ عملکرد. دنبال کردن (next_page ، self.parse) def parse_items (خود ، پاسخ): app_names = answer.xpath ('// a [@class="ListingHero-propertyIdentifierLink"] / متن ()'). عصاره () current_prices = پاسخ.xpath ("// h2 [contains(@class, 'ListingStatus-price')] / متن ()"). عصاره () buynw_price = پاسخ.meta ['buynw'] url = پاسخ.meta ['url'] installs = result.xpath ('// div [@id="number_of_installs"] / text ()'). عصاره () app_ages = answer.xpath ('// div [@id="app_age"] / text ()'). عصاره () بررسی = پاسخ.xpath ('// تقسیم [@class="Snapshot-subvalue"] / متن ()'). عصاره () قیمت = پاسخ.xpath ('// تقسیم [@id="app_store_price"] / متن ()'). عصاره () سود = پاسخ.xpath ('// تقسیم [@id="net_profit"] / متن ()'). عصاره () reskins = përgjig.xpath ('// div [@id="reskin"] / text ()'). عصاره () برای (app_name ، نصب ، app_age ، بررسی ، قیمت ، سود ، رزین ، فعلی_پریس) در zip (app_names ، نصب ، app_ages ، بررسی ، قیمت ، سود ، reskins ، جریان فعلی): عملکرد {'نام برنامه': app_name.encode ('utf-8'). نوار () ، 'تعداد نصب': install.encode ('utf-8') نوار () ، 'Age Age': app_age.encode ('utf-8'). نوار () ، 'رتبه بندی': review.encode ('utf-8'). نوار () ، 'قیمت فروشگاه App': price.encode ('utf-8') نوار () ، "سود خالص": profit.encode ("utf-8") نوار () ، "Reskin": reskin.encode ("utf-8"). نوار () ، "قیمت فعلی": current_price.encode ("utf-8"). نوار () ، 'URL': url ، 'Buy Now Price': buynw_price.encode ('utf-8'). نوار ()}خوراک صادرات:
گزینه های زیادی برای ذخیره اطلاعات با Scrapy دارید. این قالب ها شامل JSON ، CSV ، XML هستند. داده هایم را با فرمت CSV ذخیره می کنم. برای این کار ، شما باید صفحه تنظیمات.py را با اضافه کردن خطوط زیر پیکربندی کنید.
# فرم #FEED FEED_FORMAT = "csv" FEED_URI = "flippa.csv" FEED_EXPORT_EN CodeING = 'utf-8'سرانجام عنکبوت خود را با دستور runspider اجرا کنید.
spiders runspider spanj / flippaSpider.pyFile Output:
یک فایل خروجی به طور مستقیم در پوشه scraping_flippa
![]()
خلاصه:
بگذارید نکات مهم را در این آموزش خلاصه کنیم. خراش دادن داده ها به یک مکان ، تجزیه و تحلیل داده های شما را آسان می کند. تراشیدن احتمالاً بهترین ابزار برای خراش دادن است. کراپ کردن کد بسیار بستگی به ساختار و محتوای صفحه دارد. شما به جراحی نیاز دارید. اگر می خواهید یک وب سایت فهرست بندی را ضبط کنید ، از عملکرد درخواست کنید. دانش واضح از XPath برای خراش دادن ضروری است. سرانجام ، می توانید داده های خود را با فرمت های زیادی مانند CSV ، JSON و XML ذخیره کنید.
