2017-01-04 6 views
0

私はウェブサイトのリンクから特定の情報を得る基本的なスパイダーを使用しています。私のコードは次のようになります:スパイダースパイダーのアイテムをリストに追加するには?

import sys 
from scrapy import Request 
import urllib.parse as urlparse 
from properties import PropertiesItem, ItemLoader 
from scrapy.crawler import CrawlerProcess  

class BasicSpider(scrapy.Spider): 
    name = "basic" 
    allowed_domains = ["web"] 
    start_urls = ['www.example.com'] 
    objectList = [] 
    def parse(self, response): 
     # Get item URLs and yield Requests 
     item_selector = response.xpath('//*[@class="example"]//@href') 
     for url in item_selector.extract(): 
      yield Request(urlparse.urljoin(response.url, url), callback=self.parse_item, dont_filter=True) 

    def parse_item(self, response): 
     L = ItemLoader(item=PropertiesItem(), response=response) 
     L.add_xpath('title', '//*[@class="example"]/text()') 
     L.add_xpath('adress', '//*[@class="example"]/text()') 
     return L.load_item() 

process = CrawlerProcess() 
process.crawl(BasicSpider) 
process.start() 

ここで私が望むのは、すべてのクラスインスタンス "L"をobjectListというリストに追加することです。

def parse_item(self, response): 
     global objectList 
     l = ItemLoader(item=PropertiesItem(), response=response) 
     l.add_xpath('title', '//*[@class="restaurantSummary-name"]/text()') 
     l.add_xpath('adress', '//*[@class="restaurantSummary-address"]/text()') 
     item = l.load_item() 
     objectList.append([item.title, item.adress]) 
     return objectList  

しかし、私はこのコードを実行すると、私は言ってメッセージを取得する:私は次のようにコードを変更することによってそのように行う試した

l = ItemLoader(item=PropertiesItem(), response=response) 
NameError: name 'PropertiesItem' is not defined 

Q:私はすべての項目を追加するにはどうすればよいことスクレイパーはリストobjectListを見つけますか?

EDIT:

私は、このような結果保存することができますので、私は、リストに結果を保存したい:で説明したように、あなたがscrapyのフィード輸出機能を使用する必要があり、結果を保存するには

import pandas as pd 
table = pd.DataFrame(objectList) 
writer = pd.ExcelWriter('DataAll.xlsx') 
table.to_excel(writer, 'sheet 1') 
writer.save() 
+0

あなたは最初にこれをやりたいのですか? – Granitosaurus

+0

うん@Granitosaurus done – titusAdam

答えて

1

をスクレーパーを実装するドキュメント最も頻繁に必要な機能のhere

一つはgeneratを意味し、かなり頻繁に、適切に掻き取ったデータを格納することができることとされスクラップしたデータ(一般に「エクスポートフィード」と呼ばれる)を含む「エクスポートファイル」を他のシステムによって消費されるようにする。

Scrapyは、複数のシリアライズフォーマットとストレージバックエンドを使用して、スクラップしたアイテムを含むフィードを生成できるFeed Exportsを備えたこの機能をそのまま使用できます。

ケースについては、csv sectionを参照してください。

もう1つ、もっとカスタムのアプローチでは、scrapyのItem Pipelinesを使用します。単純なjsonライターhereの例があり、簡単に出力csvやその他の形式に変更できます。

import scrapy 
class MySpider(scrapy.Spider): 
    name = 'feed_exporter_test' 
    # this is equivalent to what you would set in settings.py file 
    custom_settings = { 
     'FEED_FORMAT': 'csv', 
     'FEED_URI': 'test.csv' 
    } 
    start_urls = ['http://stackoverflow.com/questions/tagged/scrapy'] 

    def parse(self, response): 
     titles = response.xpath("//a[@class='question-hyperlink']/text()").extract() 
     for i, title in enumerate(titles): 
      yield {'index': i, 'title': title} 

この例では50行長いCSVファイルを生成する:コードのこの部分は、出力プロジェクトディレクトリにtest.csvファイルにすべてのアイテムだろう。例えば

+0

私はそれを自分自身を把握するようだ!あなたは私を見せてくれますか? – titusAdam

+0

@titusAdam例については私の編集を参照してください。 – Granitosaurus

+0

ありがとう@Granitosaurus、それは動作します!しかし、治療は非常に不便な方法で.csvにデータを保存します。他の人が私のアプリを使用するので、Excelの操作を行う必要がないように、結果を別の列に保存する必要があります。あなたはこれを行う方法を知っていますか? – titusAdam

関連する問題