2015-07-10 16 views
7

Aşağıda gösterilen çok basit bir kod var. Kazıma tamam, doğru verileri üreten tüm print ifadelerini görebiliyorum. Pipeline'da başlatma işlemi düzgün çalışıyor. Ancak, process_item işlevi çağrılmıyor, işlevin başında print bildirimi hiçbir zaman yürütülmez.Python, Scrapy, Pipeline: işlev "process_item" çağrılmıyor

Örümcek: comosham.py

import scrapy 
from scrapy.spider import Spider 
from scrapy.selector import Selector 
from scrapy.http import Request 
from activityadvisor.items import ComoShamLocation 
from activityadvisor.items import ComoShamActivity 
from activityadvisor.items import ComoShamRates 
import re 


class ComoSham(Spider): 
    name = "comosham" 
    allowed_domains = ["www.comoshambhala.com"] 
    start_urls = [ 
     "http://www.comoshambhala.com/singapore/classes/schedules", 
     "http://www.comoshambhala.com/singapore/about/location-contact", 
     "http://www.comoshambhala.com/singapore/rates-and-offers/rates-classes", 
     "http://www.comoshambhala.com/singapore/rates-and-offers/rates-classes/rates-private-classes" 
    ] 

    def parse(self, response): 
     category = (response.url)[39:44] 
     print 'in parse' 
     if category == 'class': 
      pass 
      """self.gen_req_class(response)""" 
     elif category == 'about': 
      print 'about to call parse_location' 
      self.parse_location(response) 
     elif category == 'rates': 
      pass 
      """self.parse_rates(response)""" 
     else: 
      print 'Cant find appropriate category! check check check!! Am raising Level 5 ALARM - You are a MORON :D' 


    def parse_location(self, response): 
     print 'in parse_location'  
     item = ComoShamLocation() 
     item['category'] = 'location' 
     loc = Selector(response).xpath('((//div[@id = "node-2266"]/div/div/div)[1]/div/div/p//text())').extract() 
     item['address'] = loc[2]+loc[3]+loc[4]+(loc[5])[1:11] 
     item['pin'] = (loc[5])[11:18] 
     item['phone'] = (loc[9])[6:20] 
     item['fax'] = (loc[10])[6:20] 
     item['email'] = loc[12] 
     print item['address'],item['pin'],item['phone'],item['fax'],item['email'] 
     return item 

Öğeler dosyası:

import scrapy 
from scrapy.item import Item, Field 

class ComoShamLocation(Item): 
    address = Field() 
    pin = Field() 
    phone = Field() 
    fax = Field() 
    email = Field() 
    category = Field() 

Boru Hattı dosyası:

class ComoShamPipeline(object): 
    def __init__(self): 
     self.locationdump = csv.writer(open('./scraped data/ComoSham/ComoshamLocation.csv','wb')) 
     self.locationdump.writerow(['Address','Pin','Phone','Fax','Email']) 


    def process_item(self,item,spider): 
     print 'processing item now' 
     if item['category'] == 'location': 
      print item['address'],item['pin'],item['phone'],item['fax'],item['email'] 
      self.locationdump.writerow([item['address'],item['pin'],item['phone'],item['fax'],item['email']]) 
     else: 
      pass 
+0

Parse_location işlevinin sonunda oluşturulan bir öğe var mı ve değerleri var mı? – GHajba

+0

Evet, parse_location'ın sonunda yazdırıyorum ve çıktı beklendiği gibi. –

+0

Sanırım sizde var ama sormam gerekiyor: ItemPipeline'ı "settings.py" dosyasında yapılandırdınız mı? – GHajba

cevap

9

Senin sorunun, asla öğe gerçekten verimli olmasıdır. parse_location, ayrıştırmak için bir öğe döndürür, ancak ayrıştırma bu öğeyi hiçbir zaman vermez.

çözüm değiştirmek şeklinde olur:

self.parse_location(response) 

yield self.parse_location(response) 

ile Daha spesifik olarak, hiçbir öğe vermiştir eğer process_item çağrılan olmadı. settings.py içinde

1

Kullanım ITEM_PIPELINES:

ITEM_PIPELINES = ['project_name.pipelines.pipeline_class'] 
0

yukarıdaki cevaplara ekleme,
1. settings.py aşağıdaki satırı eklemeyi unutmayın! ITEM_PIPELINES = {'[YOUR_PROJECT_NAME].pipelines.[YOUR_PIPELINE_CLASS]': 300} 2. Örümünüzü çalıştırdığınızda öğeyi verin! Benim Boru Hattı denilen olsun önce tüm öğeleri Damlama edildi yüzden process_item() denilen almıyorum ama open_spider ve close_spider denilen ediliyordu: yield my_item

+0

, ['YOUR_PROJECT_NAME] hesabını' [YOUR_PROJECT_NAME] olarak düzeltin –

0

Bu benim sorun çözüldü. Bu yüzden, bu çözüm, yalnızca Pipoların öğeleri bıraktığı diğer Boru Hattı'ndan önce kullanılacak olan siparişi değiştirdi. Scrapy Pipeline.process_item (çağırır

Scrapy Pipeline Documentation.

Sadece işlemek madde yoktur, sadece) unutmayın!