Python乾貨:用Scrapy爬電商網站

資料星河發表於2018-09-04

電商老闆,經理都可能需要爬自己經營的網站,目的是監控網頁,追蹤網站流量,尋找優化機會等。

對於其中的每一項,均可以通過離散工具,網路抓取工具和服務來幫助監控網站。只需相對較少的開發工作,就可以建立自己的站點爬網程式和站點監視系統。

構建自定義的爬蟲站點和監控程式, 第一步是簡單地獲取網站上所有頁面的列表。本文將介紹如何使用Python程式語言和一個名為Scrapy的整潔的Web爬網框架來輕鬆生成這些頁面的列表。

Python乾貨:用Scrapy爬電商網站

你需要一個伺服器,Python和Scrapy

這是一個開發專案。需要安裝Python和Scrapy的伺服器。還需要通過終端應用程式或SSH客戶端對該伺服器的命令列進行訪問。還可以從Python.org的文件部分獲取有關安裝Python的資訊。Scrapy網站還有很好的安裝文件。請確認您的伺服器已準備好安裝Python和Scrapy。

建立一個Scrapy專案

使用像Putty for Windows這樣的SSH客戶端或Mac,Linux計算機上的終端應用程式,導航到要保留Scrapy專案的目錄。使用內建的Scrapy命令startproject,我們可以快速生成所需的基本檔案。

本文將抓取一個名為Business Idea Daily的網站,因此將該專案命名為“bid”。

生成一個新的Scrapy Web Spider

為方便起見,Scrapy還有另一個命令列工具,可以自動生成新的Web Spider。

scrapy genspider -t crawl getbid businessideadaily.com

第一個術語,scrapy,參考Scrapy框架。接下來,有genspider命令告訴Scrapy我們想要一個新的web spider,或者,如果您願意,還想要一個新的網路爬蟲。

-t告訴Scrapy我們想要選擇一個特定的模板。genspider命令可以生成四個通用Web Spider模板中的任何一個:basic,crawl,csvfeed和xmlfeed。直接在-t之後,我們指定了想要的模板。在這個例子中,我們將建立被Scrapy稱為CrawlSpider的模板。 “getbid”這個詞就是spider的名字。

該命令的最後一部分告訴Scrapy我們想要抓取哪個網站。框架將使用它來填充一些新spider的引數。

定義Items

在Scrapy中,Items是組織我們spider爬行特定網站時收集東西的方式/模型。雖然我們可以很容易地完成我們的目標- 獲取特定網站上所有頁面的列表- 不使用Items,但如果我們想稍後擴充套件我們的爬蟲,則不使用Items可能會限制我們。

要定義一個Item,只需開啟我們生成專案時建立的Scrapy的items.py檔案。在其中,將有一個名為BidItem的類。類名基於我們為專案提供的名稱。

`class BidItem(scrapy.Item):

define the fields for your item here like:

name = scrapy.Field()

pass`

將pass替換為名為url的新欄位的定義。

url = scrapy.Field()

儲存做好的文件

Python乾貨:用Scrapy爬電商網站

構建Web Spider

接下來開啟專案中的蜘蛛目錄,查詢生成的新Spider Scrapy。 在這個例子中,這個蜘蛛叫做getbid,所以檔案是getbid.py

在編輯器中開啟此檔案時,您應該看到如下所示的內容。

# -*- coding: utf-8 -*- import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule from bid.items import BidItem class GetbidSpider(CrawlSpider): name = 'getbid' allowed_domains = ['businessideadaily.com'] start_urls = ['http://www.businessideadaily.com/'] rules = ( Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True), ) def parse_item(self, response): i = BidItem() #i['domain_id'] = response.xpath('//input[@id="sid"]/@value').extract() #i['name'] = response.xpath('//div[@id="name"]').extract() #i['description'] = response.xpath('//div[@id="description"]').extract() return i

我們需要對為我們生成的程式碼Scrapy進行一些小的更改。 首先,我們需要在規則下修改LinkExtractor的引數。刪除括號中的所有內容。

Rule(LinkExtractor(), callback='parse_item', follow=True),

通過此更新,我們的spider將在起始頁面(主頁)上找到每個連結,將單個連結傳遞給parse_item方法,並按照指向網站下一頁的連結來確保我們獲取每個連結頁面。

接下來,我們需要更新parse_item方法。 刪除所有註釋行。這些線條只是Scrapy為我們提供的例子。

def parse_item(self, response): i = BidItem() return i

我喜歡使用有意義的變數名。 所以我要將i更改為href,這是HTML連結中屬性的名稱,如果有的話,它將儲存目標連結的地址。

def parse_item(self, response): href = BidItem() return href

現在奇蹟發生了,我們捕獲頁面URL為Items。

def parse_item(self, response): href = BidItem() href['url'] = response.url return href

這就對了。 新Spider已經準備好爬行了。

抓取網站,獲取資料

從命令列,我們想要導航到我們的專案目錄。 進入該目錄後,我們將執行一個簡單的命令來傳送我們的新蜘蛛並獲取一個頁面列表。

scrapy crawl getbid -o 012916.csv

該命令有幾個部分。 首先,我們參考Scrapy框架。 我們告訴Scrapy我們想爬行。 我們指定要使用getbid蜘蛛。

-o告訴Scrapy輸出結果。 該命令的012916.csv部分告訴Scrapy將結果放在帶有該名稱的逗號分隔值(.csv)檔案中。

在示例中,Scrapy將返回三個頁面地址。 我為這個例子選擇這個網站的原因之一是它只有幾頁。 如果你在一個有數千頁的網站上瞄準一個類似的蜘蛛,它將需要一些時間來執行,但它會返回一個類似的響應。

url

businessideadaily.com/auth/login

businessideadaily.com/

businessideadaily.com/password/em…

只需幾行程式碼,您就可以為自己的站點監控應用程式奠定基礎。

本文由資料星河原創

相關文章