2015-09-23 44 views
0

我使用scrapy在csv文件中保存網絡爬行的輸出。爬行本身似乎工作正常,但我不喜歡保存在csv文件中的輸出格式。我抓取了20個網頁,每個網頁包含100個職位和他們各自的網址。所以我期待的輸出看起來像這樣:使用scrapy網絡爬行的CSV輸出

url1, title1 
url2, title2 
... 
... 
url1999, title1999 
url2000, title2000 

然而,在CSV實際輸出看起來是這樣的:

url1 url2 ... url100, title1 title2 ... title100 
url101 url02 ... url200, title101 title102 ... title200 
... 
url1901 url902 ... url2000, title1901 title1902 ... title2000 

我的蜘蛛的代碼是:

import scrapy 

class TextPostItem(scrapy.Item): 
    title = scrapy.Field() 
    link = scrapy.Field() 

class MySpider(scrapy.Spider): 
    name = "craig_spider" 
    allowed_domains = ["craigslist.org"] 
    start_urls = ["http://sfbay.craigslist.org/search/npo"] 

    def parse(self, response): 
     number = 0 
     for page in range(0, 20): 
      yield scrapy.Request("http://sfbay.craigslist.org/search/npo?=%s" % number, callback=self.parse_item, dont_filter=True) 
      number += 100 

    def parse_item(self, response): 
     item = TextPostItem() 
     item['title'] =response.xpath("//span[@class='pl']/a/text()").extract() 
     item['link'] = response.xpath("//span[@class='pl']/a/@href").extract() 
     return item 

我的CSV代碼是:

scrapy crawl craig_spider -o craig.csv -t csv 

任何su ggestion?謝謝。

+1

你的'csv'代碼是什麼? – wpercy

+0

我的csv代碼是:scrapy crawl craig_spider -o craig.csv -t csv – kevin

回答

2

的問題是,你得到多個響應//span[@class='pl']/a/裏回來時,每text()加載到一個列表,將其賦值給item['title'],然後每@href加載到一個列表和分配,爲item['link']

。換句話說第一個響應,你基本上是做了以下內容:

item['title'] = [title1, title2, ..., title100] 
item['link'] = [url1, url2, ..., url100] 

所以,這就是被髮送到CSV爲:

title,link 
[title1, title2, ..., title100],[url1, url2, ..., url100] 

通過每個//span[@class='pl']/a/和解決這個問題,循環每個都有單獨的項目。

def parse_item(self, response): 
    for span in response.xpath("//span[@class='pl']/a"): 
     item = TextPostItem() 
     item['title'] = span.xpath(".//text()").extract() 
     item['link'] = span.xpath(".//@href").extract() 
     yield item 
+0

謝謝你的建議!不勝感激! – kevin