2012-07-05 62 views
2

我對scrapy工作,被刮取的網站,並獲取所有如何動態創建一個CSV文件與scrapy蟒蛇蜘蛛名

其實我有3個蜘蛛不同的數據信息,我創造了這3個蜘蛛同一文件夾 結構如下

scrapy.cfg 
myproject/ 
    __init__.py 
    items.py 
    pipelines.py 
    settings.py 
    spiders/ 
     __init__.py 
      spider1.py 
      spider2.py 
      spider3.py 

現在,當我們運行特定的蜘蛛,我需要創建通過與蜘蛛的名字管道csv文件,例如

spider1.csv,spider2.csv,spider3.csv and so on(S根據蜘蛛和蜘蛛名稱的數量我想創建csv文件

在這裏,我們是否可以在pipeline.py中創建多個管道?也如何動態創建蜘蛛名稱的csv文件如果不止一個蜘蛛存在

在這裏我有3個蜘蛛,我想一次運行所有3個蜘蛛(通過使用scrapyd),當我運行所有3個蜘蛛應該創建3個帶有蜘蛛名字的csv文件。 我想安排這個蜘蛛每6小時運行一次。 如果我的解釋中有什麼錯誤,請糾正我,讓我知道如何做到這一點。

在此先感謝

編輯代碼: 比如我貼我的代碼只spider1.py

代碼spider1.py

class firstspider(BaseSpider): 
    name = "spider1" 
    domain_name = "www.example.com" 
    start_urls = [ 
        "www.example.com/headers/page-value" 
       ] 
def parse(self, response): 
    hxs = HtmlXPathSelector(response) 
      ........ 
      ....... 
      item = Spider1Item() 
      item['field1'] = some_result 
      item['field2'] = some_result 
      ..... 
      ..... 
      return item 

管道.py代碼:

import csv 
from csv import DictWriter 

class firstspider_pipeline(object): 

def __init__(self): 
    self.brandCategoryCsv = csv.writer(open('../%s.csv' % (spider.name), 'wb'), 
    delimiter=',', quoting=csv.QUOTE_MINIMAL) 
    self.brandCategoryCsv.writerow(['field1', 'field2','field3','field4']) 



def process_item(self, item, spider): 
    self.brandCategoryCsv.writerow([item['field1'], 
           item['field2'], 
           item['field3'], 
           item['field4']) 
    return item 

至於我,當我運行與蜘蛛名以上蜘蛛如前所述,與蜘蛛名CSV文件將被動態地創建..... 但現在當我辦剩下的蜘蛛像spider2,spider3,spider3下,CSV文件及其相應的蜘蛛名稱應該生成。

  1. 上述代碼是否足以滿足上述功能?

  2. 我們是否需要創建另一個管道類來創建另一個csv文件?(是否有可能在一個單一的pipeline.py文件創建多個管道類?)

  3. 如果我們創建多個管道類在一個pipeline.py文件,如何在特定的蜘蛛匹配其相關管道類

我想保存到數據庫時,實現相同的功能,我的意思是,當我運行spider1 spider1的所有數據應保存到數據庫到具有相關蜘蛛名稱的表格中。 這裏每個蜘蛛我有不同的SQL查詢(所以需要編寫不同的管道類)

  1. 這裏的內涵是,當我們同時運行多個蜘蛛所有(使用scrapyd),多個CSV文件應與蜘蛛產生名稱和多個表應與蜘蛛名稱創建(當保存到數據庫)

對不起,如果我錯了任何地方,我希望它很好的解釋,如果沒有請讓我知道。

+0

向我們展示一些代碼,你已經嘗試過了什麼?或者向我們展示至少您對於您所想到的界面/ API的想法。 – 2012-07-05 13:00:24

+0

@Don問題:我已經更新了我的代碼,請解釋我該怎麼做 – 2012-07-06 06:00:04

回答

3

你一般是在正確的軌道上。

但有幾點我可以立刻指出:

  1. 你可能並不需要(=不宜用)的一類! Python不是Java。如果你的課程只包含2個方法,第一個方法是__init__-方法,你幾乎肯定不需要一個類,但一個函數可以做得很好。少混亂=更好的代碼!

  2. SO不適合進行一般的代碼審查。改爲嘗試codereview。 SO-useres是一個友好的(主要)和有幫助的一羣,但他們不喜歡寫你的代碼。他們喜歡解釋,建議和正確。 因此,儘量實施你的申請,如果你遇到麻煩,你不能解決自己,再回來,並尋求建議。如上所述,您在概念上處於正確的軌道上,只是嘗試實施它。

  3. 您似乎對班級概念有誤解。至少只要它是蟒蛇類:

    1. 就我所見,您不需要BaseSpider類。基類和子類之間有什麼區別?派生類不會讓你的程序OO,或者更好,或者其他什麼。搜索Liskovs principle以獲得有關子類在python中何時適用的一般理解。 (這是一種反向邏輯,但它是查看是否應該繼承或改變方法的最快方法之一。)

    2. python類變量在類聲明後立即聲明,在__init__方法中初始化的實例變量。類變量是一個類的所有實例之間的SHARED,其中實例變量對於各個實例是私有的。你幾乎從不想使用類變量,它是一個Singleton-Pattern,這在大多數情況下是你想避免的,因爲它在調試時會引起頭痛和委屈。

因此我會修改你的Spider -class這樣的:

class Spider(object): 
    def __init__(self, name, url=None): 
     self.name = name 
     self.domain_name = url 
     self.start_urls = [url] 
     ... 

crawlers = [Spider('spider %s' %i) for i in xrange(4)] #creates a list of 4 spiders 

但是,也許你正在使用一個聲明元類的方法,但我不能看到您發佈的代碼。

如果您想並行運行抓取工具,則應考慮threading模塊。它意味着連續的I/O操作,與multiprocessing模塊相反,它是用於並行計算的。

您在正確的軌道上是概念性的。每當你遇到錯誤時,將你的項目分成小塊並返回。

只是不期望得到一個完整的答案就像這樣的問題:「我不想重新創建谷歌,我怎麼能以最好的方式和最短的時間做到這一點!」 ;-)