2016-12-07 5 views
1

Also habe ich vor kurzem begonnen, Scrapy für ein Projekt auszuprobieren, und ich war sehr verwirrt mit den verschiedenen älteren Syntaxen (SgmlLinkExtractor etc.), aber irgendwie gelang es mir, den lesbaren Code zusammenzusetzen, der für mich Sinn ergab. Dies geschieht jedoch nicht auf jeder Seite der Website, sondern nur auf der Seite start_urls und erzeugt nicht die Ausgabedatei. Kann mir bitte jemand erklären, was mir fehlt?Scrapy Basic Crawler funktioniert nicht?

import scrapy 
import csv 
from scrapy.spiders import CrawlSpider, Rule 
from scrapy.linkextractors import LinkExtractor 

class RLSpider(CrawlSpider): 
    name = "RL" 
    allowed_domains='ralphlauren.com/product/' 
    start_urls=[ 
     'http://www.ralphlauren.com/' 
    ] 
    rules = (
     Rule(LinkExtractor(),callback="parse_item",follow=True), 
    ) 

    def parse_item(self, response): 
     name = response.xpath('//h1/text()').extract_first() 
     price = response.xpath('//span[@class="reg-price"]/span/text()').extract_first() 
     image=response.xpath('//input[@name="enh_0"]/@value').extract_first() 
     print("Rules=",rules) 
     tup=(name,price,image) 
     csvF=open('data.csv','w') 
     csvWrite = csv.writer(csvF) 
     csvWrite.writerow(tup) 
     return [] 
    def parse(self,response): 
     pass 

Ich versuche, Daten von der Website zu extrahieren und sie in eine CSV-Datei von allen Seiten schreiben unter/Produkt kommende/

Hier sind die Protokolle:

2016-12-07 19:46:49 [scrapy] INFO: Scrapy 1.2.2 started (bot: P35Crawler) 
2016-12-07 19:46:49 [scrapy] INFO: Overridden settings: {'BOT_NAME': 'P35Crawler 
', 'NEWSPIDER_MODULE': 'P35Crawler.spiders', 'SPIDER_MODULES': ['P35Crawler.spid 
ers']} 
2016-12-07 19:46:49 [scrapy] INFO: Enabled extensions: 
['scrapy.extensions.logstats.LogStats', 
'scrapy.extensions.telnet.TelnetConsole', 
'scrapy.extensions.corestats.CoreStats'] 
2016-12-07 19:46:50 [scrapy] 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.chunked.ChunkedTransferMiddleware', 
'scrapy.downloadermiddlewares.stats.DownloaderStats'] 
2016-12-07 19:46:50 [scrapy] INFO: Enabled spider middlewares: 
['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware', 
'scrapy.spidermiddlewares.offsite.OffsiteMiddleware', 
'scrapy.spidermiddlewares.referer.RefererMiddleware', 
'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware', 
'scrapy.spidermiddlewares.depth.DepthMiddleware'] 
2016-12-07 19:46:50 [scrapy] INFO: Enabled item pipelines: 
[] 
2016-12-07 19:46:50 [scrapy] INFO: Spider opened 
2016-12-07 19:46:50 [scrapy] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 i 
tems (at 0 items/min) 
2016-12-07 19:46:50 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6023 
2016-12-07 19:46:51 [scrapy] DEBUG: Redirecting (302) to <GET http://www.ralphla 
uren.com/home/index.jsp?ab=Geo_iIN_rUS_dUS> from <GET http://www.ralphlauren.com 
/> 
2016-12-07 19:46:51 [scrapy] DEBUG: Crawled (200) <GET http://www.ralphlauren.co 
m/home/index.jsp?ab=Geo_iIN_rUS_dUS> (referer: None) 
2016-12-07 19:46:51 [scrapy] INFO: Closing spider (finished) 
2016-12-07 19:46:51 [scrapy] INFO: Dumping Scrapy stats: 
{'downloader/request_bytes': 497, 
'downloader/request_count': 2, 
'downloader/request_method_count/GET': 2, 
'downloader/response_bytes': 20766, 
'downloader/response_count': 2, 
'downloader/response_status_count/200': 1, 
'downloader/response_status_count/302': 1, 
'finish_reason': 'finished', 
'finish_time': datetime.datetime(2016, 12, 7, 14, 16, 51, 973406), 
'log_count/DEBUG': 3, 
'log_count/INFO': 7, 
'response_received_count': 1, 
'scheduler/dequeued': 2, 
'scheduler/dequeued/memory': 2, 
'scheduler/enqueued': 2, 
'scheduler/enqueued/memory': 2, 
'start_time': datetime.datetime(2016, 12, 7, 14, 16, 50, 287464)} 
2016-12-07 19:46:51 [scrapy] INFO: Spider closed (finished) 
+0

Überprüfen Sie Ihre Protokolle, ich nehme an, dass URLs wegen 'allowed_domains' gefiltert werden, entfernen Sie das. – eLRuLL

+0

@eLRuLL Hallo, danke für die Antwort. Hat das Log geschrieben. Ich habe versucht, outwarded_domains auskommentieren, aber immer noch nicht funktioniert. –

Antwort

0

Sie shouldn überschreiben Sie die Methode parse() nicht mit einer leeren Methode. Entfernen Sie einfach die Deklaration dieser Methode. Bitte lassen Sie mich wissen, ob das hilft.

UPDATE

In Bezug auf Ihren Kommentar zu JS mit scrapy Parsen, gibt es verschiedene Möglichkeiten, das zu tun. Sie benötigen einen Browser, um JS zu parsen. Angenommen, Sie möchten Firefox ausprobieren und es mit Selenium steuern.

Der beste Weg IMO ist, einen Download-Handler zu implementieren, wie ich auf this answer erkläre. Sie könnten andernfalls downloader middleware implementieren, wie erläutert here. Die middleware hat einige Nachteile des handler verglichen, wie die download handler erlauben würden Sie den Standard verwenden cache, retry usw.

Nachdem Sie das Basic-Skript mit Firefox arbeiten, können Sie dann auf PhantomJS wechseln, indem nur ein ein paar Zeilen. PhantomJS ist ein kopfloser Browser, was bedeutet, dass nicht alle Browser-Schnittstellen geladen werden müssen. Es ist also viel schneller.

Andere Lösungen umfassen Docker mit Splash, aber ich endete dies eine Overkill Betrachtung, wie Sie ein VM laufen müssen nur den Browser zu steuern.

Zusammenfassend ist die beste Lösung, eine download handler zu implementieren, die Selenium und PhantomJS verwendet.

+0

Hallo, danke, das hat funktioniert, aber jetzt mit allowed_domains auf ralphlauren.com beschränkt, wird alles herausgefiltert und kriecht immer noch nur die erste Webseite. –

+0

Okay, ich habe festgestellt, dass die meisten der Links, die ich brauche, im JavaScript-Teil der Website sind. Wie durchklaube ich diese? –