2017-11-21 5 views
3

Der folgende Code wird ausgeführt, erstellen Sie die Datei ohne Fehler. Es wird jedoch nicht in der JSON-Datei gespeichert.Scrapy CrawlerProcess Keine Daten mit CrawlSpider speichern

Ich habe Autothrottle ausgeschaltet, die in der Vergangenheit das Herunterladen von Daten gestört hat, aber das Problem wurde nicht behoben.

Scrapy == 1.4.0

class MySpider(CrawlSpider): 
    name = "spidy" 
    allowed_domains = ["cnn.com"] 
    start_urls = ["http://www.cnn.com"]  

    rules = [Rule(LinkExtractor(allow=['cnn.com/.+']), callback='parse_item', follow=True)]  

    def parse_item(self, response): 

     print('went to: {}'.format(response.url)) 

     yield {'url': response.url}   

FILE_NAME = 'my_data.json' 
SETTINGS = { 
      'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)', 
      'FEED_FORMAT': 'json', 
      'FEED_URI': FILE_NAME,   
      } 

process = CrawlerProcess(SETTINGS) 
process.crawl(MySpider) 
process.start() 

EDIT:

Der Abstreifer der Daten wird immer wie im Protokoll gesehen:

2017-11-21 11:07:55 [scrapy.utils.log] INFO: Scrapy 1.4.0 started (bot: scrapybot) 
2017-11-21 11:07:55 [scrapy.utils.log] INFO: Overridden settings: {'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)', 'FEED_URI': 'my_data.json', 'FEED_FORMAT': 'json'} 
2017-11-21 11:07:55 [scrapy.middleware] INFO: Enabled extensions: 
['scrapy.extensions.memusage.MemoryUsage', 
'scrapy.extensions.telnet.TelnetConsole', 
'scrapy.extensions.corestats.CoreStats', 
'scrapy.extensions.logstats.LogStats', 
'scrapy.extensions.feedexport.FeedExporter'] 
2017-11-21 11:07:55 [scrapy.middleware] INFO: Enabled downloader middlewares: 
['scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware', 
'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware', 
'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware', 
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware', 
'scrapy.downloadermiddlewares.retry.RetryMiddleware', 
'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware', 
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware', 
'scrapy.downloadermiddlewares.redirect.RedirectMiddleware', 
'scrapy.downloadermiddlewares.cookies.CookiesMiddleware', 
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware', 
'scrapy.downloadermiddlewares.stats.DownloaderStats'] 
2017-11-21 11:07:55 [scrapy.middleware] INFO: Enabled spider middlewares: 
['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware', 
'scrapy.spidermiddlewares.offsite.OffsiteMiddleware', 
'scrapy.spidermiddlewares.referer.RefererMiddleware', 
'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware', 
'scrapy.spidermiddlewares.depth.DepthMiddleware'] 
2017-11-21 11:07:55 [scrapy.middleware] INFO: Enabled item pipelines: 
[] 
2017-11-21 11:07:55 [scrapy.core.engine] INFO: Spider opened 
2017-11-21 11:07:55 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 
2017-11-21 11:07:55 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6041 
2017-11-21 11:07:55 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://www.cnn.com> (referer: None) 
2017-11-21 11:07:56 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://www.cnn.com/us> (referer: http://www.cnn.com) 
2017-11-21 11:07:56 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://www.cnn.com/specials/politics/congress-capitol-hill> (referer: http://www.cnn.com) 
2017-11-21 11:07:56 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://www.cnn.com/specials/politics/president-donald-trump-45> (referer: http://www.cnn.com) 
2017-11-21 11:07:56 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://www.cnn.com/specials/politics/us-security> (referer: http://www.cnn.com) 
2017-11-21 11:07:56 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://www.cnn.com/specials/politics/trumpmerica> (referer: http://www.cnn.com) 
2017-11-21 11:07:56 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://www.cnn.com/specials/politics/state-cnn-politics-magazine> (referer: http://www.cnn.com) 
2017-11-21 11:07:56 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://www.cnn.com/specials/opinion/opinion-social-issues> (referer: http://www.cnn.com) 
2017-11-21 11:07:56 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://www.cnn.com/specials/opinions/cnnireport> (referer: http://www.cnn.com) 
2017-11-21 11:07:56 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://www.cnn.com/specials/vr/vr-archives> (referer: http://www.cnn.com) 
2017-11-21 11:07:56 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://www.cnn.com/middle-east> (referer: http://www.cnn.com) 
2017-11-21 11:07:56 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (302) to <GET http://imagesource.cnn.com> from <GET http://www.cnn.com/collection> 
2017-11-21 11:07:56 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://www.cnn.com/specials/politics/supreme-court-nine> (referer: http://www.cnn.com) 
2017-11-21 11:07:56 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (302) to <GET http://transcripts.cnn.com/TRANSCRIPTS/> from <GET http://www.cnn.com/transcripts> 
2017-11-21 11:07:56 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://money.cnn.com/pf/> (referer: http://www.cnn.com) 
2017-11-21 11:07:56 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://money.cnn.com/luxury/> (referer: http://www.cnn.com) 
2017-11-21 11:07:56 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://money.cnn.com/data/markets/> (referer: http://www.cnn.com) 
2017-11-21 11:07:56 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://money.cnn.com/technology/> (referer: http://www.cnn.com) 
went to: http://www.cnn.com/us 
2017-11-21 11:07:56 [scrapy.core.scraper] DEBUG: Scraped from <200 http://www.cnn.com/us> 
{'url': 'http://www.cnn.com/us'} 
2017-11-21 11:07:56 [scrapy.dupefilters] DEBUG: Filtered duplicate request: <GET http://www.cnn.com/us> - no more duplicates will be shown (see DUPEFILTER_DEBUG to show all duplicates) 
2017-11-21 11:07:56 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (302) to <GET http://www.cnn.com/email/subscription> from <GET http://www.cnn.com/newsletters> 
... 

Wir den Schaber sehen kann, ist der Besuch URLs, Crawlen zusätzlicher URLs auf der Seite, Abrufen der Antwort-URL (wie unter "Gehen zu:") und anschließendes Zurückgeben der Daten mit "{'url':}, z. B. {'url': 'http://www.cnn.com/us'}

+0

@eLRuLL Bitte beachten Sie die bearbeiten. Ich habe das Protokoll hinzugefügt. – ethanenglish

+0

@ethanenglish versuchen, 'FEED_URI' einen absoluten Pfad'/Verzeichnis/Unterverzeichnis/file.json' oder eine tatsächliche URI 'file: /// Verzeichnis/Unterverzeichnis/file.json'? –

+0

@ JonClements Danke für den Vorschlag. Ich habe es hinzugefügt, aber es macht keinen Unterschied. – ethanenglish

Antwort

0

Ihr Code als solcher funktioniert gut, aber ich nehme an, Sie stoppen es zweimal oder töten es, was den JSON leer macht. Ich würde zwei Dinge ändern.

Eine Verwendung jsonlines anstelle von json. Dies würde sicherstellen, dass selbst wenn ich die Spinne töte, ich nicht zu viele Gegenstände verlieren werde. Dann ist jede Zeile selbst ein gültiger JSON, also kann ich an dieselbe Datei anhängen. Auch wenn Sie das Programm in brechen zwischen Ihnen eine ungültige JSON

Zweitens bekommen, würde ich die gleichzeitig Elemente auf einen niedrigeren Wert gesetzt, so Elemente exportiert werden häufiger (Standardwert ist 100)

from scrapy.crawler import CrawlerProcess 
from scrapy.spiders import CrawlSpider, Rule 

from scrapy.linkextractor import LinkExtractor 

class MySpider(CrawlSpider): 
    name = "spidy" 
    allowed_domains = ["cnn.com"] 
    start_urls = ["http://www.cnn.com"] 

    rules = [Rule(LinkExtractor(allow=['cnn.com/.+']), callback='parse_item', follow=True)] 

    def parse_item(self, response): 

     print('went to: {}'.format(response.url)) 

     yield {'url': response.url} 

FILE_NAME = 'my_data.jsonl' 
SETTINGS = { 
      'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)', 
      'FEED_FORMAT': 'jsonlines', 
      'FEED_URI': FILE_NAME, 
      'CONCURRENT_ITEMS': 1 
      } 

process = CrawlerProcess(SETTINGS) 
process.crawl(MySpider) 
process.start() 

Nach dass Sie finden sich die Daten in Ordnung bekommen exportiert

items exported

+0

Das ist wirklich merkwürdig. Ihr Code sollte funktionieren, aber Scrapy erstellt die Datei, ruft die Daten ab, speichert sie jedoch nicht in der Datei. Ich bin hier völlig verloren. Ich habe das Modul deinstalliert und installiert, verschiedene Importmethoden probiert, immer noch nichts. – ethanenglish

+0

Welches Betriebssystem verwenden Sie? –

+0

Neueste Version von Mac Sierra – ethanenglish

Verwandte Themen