2017-09-20 13 views
0

私はpython scrapyでスクリプトを書いて、craigslistから別のカテゴリを解析しました。スクリプトを実行している奇妙なことに気づいた。それは完璧に実行され、苦情に何も残さない。しかし、問題は次のようにitems.pyを空白のままにしておくと、クロールプロセスに影響がないことです。私の質問は私の治療プロジェクトで何をやっているのですか?前もって感謝します。奇妙な行動をするクローラ

"Items.py" ファイルが含まれています:

import scrapy 

class CraigItem(scrapy.Item): 
    pass 

クモが含まれています

import scrapy 
from scrapy import Request 

class JobsSpider(scrapy.Spider): 

    name = "category" 
    allowed_domains = ["craigslist.org"] 
    start_urls = ["https://newyork.craigslist.org/search/egr"] 

    def parse(self, response): 
     jobs = response.xpath('//p[@class="result-info"]') 

     for job in jobs: 
      relative_url = job.xpath('a/@href').extract_first() 
      absolute_url = response.urljoin(relative_url) 
      title = job.xpath('a/text()').extract_first() 
      address = job.xpath('span[@class="result-meta"]/span[@class="result-hood"]/text()').extract_first("")[2:-1] 
      yield Request(absolute_url, callback=self.parse_page, meta={'URL': absolute_url, 'Title': title, 'Address':address}) 

     relative_next_url = response.xpath('//a[@class="button next"]/@href').extract_first() 
     absolute_next_url = "https://newyork.craigslist.org" + relative_next_url  
     yield Request(absolute_next_url, callback=self.parse) 

    def parse_page(self, response): 
     url = response.meta.get('URL') 
     title = response.meta.get('Title') 
     address = response.meta.get('Address') 
     compensation = response.xpath('//p[@class="attrgroup"]/span[1]/b/text()').extract_first() 
     employment_type = response.xpath('//p[@class="attrgroup"]/span[2]/b/text()').extract_first() 
     yield{'URL': url, 'Title': title, 'Address':address, 'Compensation':compensation, 'Employment_Type':employment_type} 

を再び私の質問は次のとおりです。items.pyファイルはクロール・プロセス内の任意の監督を持っていませんか?そうなら、どうですか?

答えて

1

まず、Scrapy Itemsについてお読みください。要するに、Scrapy Itemsは、スパイダーが生成するアイテムを定義するdict-likeクラスです。スパイダーからアイテムを得るときは、Scrapy Itemまたはdict(またはRequestオブジェクト)のいずれかでなければなりません。あなたのスパイダーでは、2番目のアプローチ、すなわちyield plain dictを使用することを選択しました。

ファイルitems.pyは、あなたが好きな場合は、それを強化するための空のItemクラスを定義するコマンドscrapy startprojectによって生成されたテンプレートです。しかし、あなたのスパイダーでそのクラスを使用しないので、Scrapyでは使用されません。

+0

ありがとう、TomášLinhart、あなたの答えです。実際、私は 'items.py'を治療プロジェクトから蹴り出して、再び走った。私はそれがまだ動作していることが分かったつまり、Scrapyでは使用されていません。 – SIM

+0

@Toptoもちろん、それはちょうど(ほとんど)空白のモジュールで、どこにもインポートされていません。 –

+0

ここに私が確信しておきたかったことがあります。膨大な数のTomášLinhartに感謝します。あなたは私の一日を作った。 – SIM