2017-09-22 4 views
0

Ich habe eine Liste von Datenobjekten, von denen jedes eine URL enthält, die geschabt werden soll. Einige dieser URLs sind nicht gültig, aber ich möchte immer noch, dass das Datenobjekt durchläuft, um Artikel-Pipelines zu erreichen.Kann leere URL durch Scrapy-Pipeline nicht übergeben

Nach @ Tomáš-linhart Antwort habe ich verstanden, dass die Verwendung einer Middleware in diesem Fall nicht funktioniert, da Scrapy mir nicht erlauben wird, Request-Objekt an erster Stelle zu erstellen.

Eine Alternative ist die Rückgabe des Elements anstelle der Anfrage, wenn die URL nicht gültig ist.

Im Anschluss ist mein Code:

def start_requests(self): 
     rurls = json.load(open(self.data_file)) 
     for data in rurls[:100]: 
      url = data['Website'] or '' 
      rid = data['id'] 

      # skip creating requests for invalid urls 
      if not (url and validators.url(url)): 
       yield self.create_item(rid, url) 
       continue 

      # create request object 
      request_object = scrapy.Request(url=url, callback=self.parse, errback=self.errback_httpbin) 

      # populate request object 
      request_object.meta['rid'] = rid 

      self.logger.info('REQUEST QUEUED for RID: %s', rid) 
      yield request_object 

Der obige Code einen Fehler wirft, wie gezeigt. Mehr als der Fehler, ich bin mir nicht sicher, wie ich den Ursprung des Problems verfolgen kann. :(

2017-09-22 12:44:38 [scrapy.utils.signal] ERROR: Error caught on signal handler: <bound method RefererMiddleware.request_scheduled of <scrapy.spidermiddlewares.referer.RefererMiddleware object at 0x10f603ef0>> 
Traceback (most recent call last): 
    File "/myhome/.virtualenvs/myproj/lib/python3.5/site-packages/scrapy/utils/signal.py", line 30, in send_catch_log 
    *arguments, **named) 
    File "/myhome/.virtualenvs/myproj/lib/python3.5/site-packages/pydispatch/robustapply.py", line 55, in robustApply 
    return receiver(*arguments, **named) 
    File "/myhome/.virtualenvs/myproj/lib/python3.5/site-packages/scrapy/spidermiddlewares/referer.py", line 343, in request_scheduled 
    redirected_urls = request.meta.get('redirect_urls', []) 
    File "/myhome/.virtualenvs/myproj/lib/python3.5/site-packages/scrapy/item.py", line 74, in __getattr__ 
    raise AttributeError(name) 
AttributeError: meta 
Unhandled Error 
Traceback (most recent call last): 
    File "/myhome/.virtualenvs/myproj/lib/python3.5/site-packages/scrapy/commands/crawl.py", line 58, in run 
    self.crawler_process.start() 
    File "/myhome/.virtualenvs/myproj/lib/python3.5/site-packages/scrapy/crawler.py", line 285, in start 
    reactor.run(installSignalHandlers=False) # blocking call 
    File "/myhome/.virtualenvs/myproj/lib/python3.5/site-packages/twisted/internet/base.py", line 1243, in run 
    self.mainLoop() 
    File "/myhome/.virtualenvs/myproj/lib/python3.5/site-packages/twisted/internet/base.py", line 1252, in mainLoop 
    self.runUntilCurrent() 
--- <exception caught here> --- 
    File "/myhome/.virtualenvs/myproj/lib/python3.5/site-packages/twisted/internet/base.py", line 878, in runUntilCurrent 
    call.func(*call.args, **call.kw) 
    File "/myhome/.virtualenvs/myproj/lib/python3.5/site-packages/scrapy/utils/reactor.py", line 41, in __call__ 
    return self._func(*self._a, **self._kw) 
    File "/myhome/.virtualenvs/myproj/lib/python3.5/site-packages/scrapy/core/engine.py", line 135, in _next_request 
    self.crawl(request, spider) 
    File "/myhome/.virtualenvs/myproj/lib/python3.5/site-packages/scrapy/core/engine.py", line 210, in crawl 
    self.schedule(request, spider) 
    File "/myhome/.virtualenvs/myproj/lib/python3.5/site-packages/scrapy/core/engine.py", line 216, in schedule 
    if not self.slot.scheduler.enqueue_request(request): 
    File "/myhome/.virtualenvs/myproj/lib/python3.5/site-packages/scrapy/core/scheduler.py", line 54, in enqueue_request 
    if not request.dont_filter and self.df.request_seen(request): 
    File "/myhome/.virtualenvs/myproj/lib/python3.5/site-packages/scrapy/item.py", line 74, in __getattr__ 
    raise AttributeError(name) 
builtins.AttributeError: dont_filter 

2017-09-22 12:44:38 [twisted] CRITICAL: Unhandled Error 
Traceback (most recent call last): 
    File "/myhome/.virtualenvs/myproj/lib/python3.5/site-packages/scrapy/commands/crawl.py", line 58, in run 
    self.crawler_process.start() 
    File "/myhome/.virtualenvs/myproj/lib/python3.5/site-packages/scrapy/crawler.py", line 285, in start 
    reactor.run(installSignalHandlers=False) # blocking call 
    File "/myhome/.virtualenvs/myproj/lib/python3.5/site-packages/twisted/internet/base.py", line 1243, in run 
    self.mainLoop() 
    File "/myhome/.virtualenvs/myproj/lib/python3.5/site-packages/twisted/internet/base.py", line 1252, in mainLoop 
    self.runUntilCurrent() 
--- <exception caught here> --- 
    File "/myhome/.virtualenvs/myproj/lib/python3.5/site-packages/twisted/internet/base.py", line 878, in runUntilCurrent 
    call.func(*call.args, **call.kw) 
    File "/myhome/.virtualenvs/myproj/lib/python3.5/site-packages/scrapy/utils/reactor.py", line 41, in __call__ 
    return self._func(*self._a, **self._kw) 
    File "/myhome/.virtualenvs/myproj/lib/python3.5/site-packages/scrapy/core/engine.py", line 135, in _next_request 
    self.crawl(request, spider) 
    File "/myhome/.virtualenvs/myproj/lib/python3.5/site-packages/scrapy/core/engine.py", line 210, in crawl 
    self.schedule(request, spider) 
    File "/myhome/.virtualenvs/myproj/lib/python3.5/site-packages/scrapy/core/engine.py", line 216, in schedule 
    if not self.slot.scheduler.enqueue_request(request): 
    File "/myhome/.virtualenvs/myproj/lib/python3.5/site-packages/scrapy/core/scheduler.py", line 54, in enqueue_request 
    if not request.dont_filter and self.df.request_seen(request): 
    File "/myhome/.virtualenvs/myproj/lib/python3.5/site-packages/scrapy/item.py", line 74, in __getattr__ 
    raise AttributeError(name) 
builtins.AttributeError: dont_filter 

Antwort

0

Sie können nicht das Ziel mit Ihrem aktuellen Ansatz als Fehler erreichen, Sie werden immer im Konstruktor einer Request angehoben, siehe die code.

Wie auch immer, ich verstehe nicht, warum Sie wollen auch sie auf diese Weise zu tun, auf der Grundlage Ihrer Anforderung.

I have a list of data objects each of them containing a url to be scraped. Some of these urls are not valid but I still want the data object to fall through to reach item pipelines.

Wenn ich es richtig verstehe, haben Sie bereits ein komplettes Einzelteil haben (Daten in Ihrem ter Objekt Minologie) und Sie möchten nur, dass es durch Artikelpipelines geht. Dann machen Sie die URL-Validierung in der Spinne und wenn es nicht gültig ist, geben Sie einfach das Element anstelle der Anforderung für die URL, die es enthält. Keine Notwendigkeit für Spider Middleware.

+0

Ich habe versucht, das Element in der start_requests-Methode zurückzugeben, aber ich bekomme ein "AttributeError: Meta" und builtins.AttributeError: dont_filter – comiventor

+0

Ich meinte, das Element zu liefern. Lassen Sie mich meinen ursprünglichen Post aktualisieren – comiventor

+0

Dann machen Sie die URL-Validierung in der Spinne und wenn es nicht gültig ist, nur das Element anstelle der Forderung nach URL, die es enthält. Ich bin mir nicht sicher, wo ich einen Artikel statt einer Anfrage liefern kann. Können Sie auf Beispielcode zeigen? Der einzige Ort, von dem ich weiß, dass ich beides bekommen kann, ist die Parse-Funktion, was bedeutet, dass ich mindestens 1 Anfrage fälschen muss. – comiventor

0

Sie können Item-Objekt nicht über die Methode start_requests ausgeben. Nur Objekt anfordern.

+0

Ich kannte diesen Teil, konnte aber nicht folgen, worauf Tomas hinweist. Er sagt "Mach die URL-Validierung im Spider und wenn es nicht gültig ist, gib einfach das Item zurück, anstatt eine Anfrage für die URL zu liefern, die es enthält". Nicht sicher, wie man das erreichen kann? – comiventor

Verwandte Themen