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
Ich habe versucht, das Element in der start_requests-Methode zurückzugeben, aber ich bekomme ein "AttributeError: Meta" und builtins.AttributeError: dont_filter – comiventor
Ich meinte, das Element zu liefern. Lassen Sie mich meinen ursprünglichen Post aktualisieren – comiventor
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