電商老闆,經理均可能須要爬本身經營的網站,目的是監控網頁,追蹤網站流量,尋找優化機會等。web
對於其中的每一項,都可以經過離散工具,網絡抓取工具和服務來幫助監控網站。只需相對較少的開發工做,就能夠建立本身的站點爬網程序和站點監視系統。編程
構建自定義的爬蟲站點和監控程序, 第一步是簡單地獲取網站上全部頁面的列表。本文將介紹如何使用Python編程語言和一個名爲Scrapy的整潔的Web爬網框架來輕鬆生成這些頁面的列表。服務器
你須要一個服務器,Python和Scrapy網絡
這是一個開發項目。須要安裝Python和Scrapy的服務器。還須要經過終端應用程序或SSH客戶端對該服務器的命令行進行訪問。還能夠從Python.org的文檔部分獲取有關安裝Python的信息。Scrapy網站還有很好的安裝文檔。請確認您的服務器已準備好安裝Python和Scrapy。框架
建立一個Scrapy項目dom
使用像Putty for Windows這樣的SSH客戶端或Mac,Linux計算機上的終端應用程序,導航到要保留Scrapy項目的目錄。使用內置的Scrapy命令startproject,咱們能夠快速生成所需的基本文件。scrapy
本文將抓取一個名爲Business Idea Daily的網站,所以將該項目命名爲「bid」。編程語言
生成一個新的Scrapy Web Spider編輯器
爲方便起見,Scrapy還有另外一個命令行工具,能夠自動生成新的Web Spider。ide
`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()
保存作好的文檔
構建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 https://businessideadaily.com/auth/login
https://businessideadaily.com/
https://businessideadaily.com/password/email
只需幾行代碼,您就能夠爲本身的站點監控應用程序奠基基礎。
本文由數據星河原創