2017-12-22 13 views
0

Ich arbeite an einem Django-Projekt und möchte einige Neuigkeiten auf der Homepage veröffentlichen. Ich habe vor kurzem mit scrapy interagiert, wenn ich Code mit "scarpy shell" liefere, kann dieser Code die Daten erfolgreich abrufen. Aber wenn ich diesen Code in ein Skript setzen dieser Code den Newsfeed zu der Vorlage zu automatisieren wird nicht funktionieren und erhöhen „Fehler holen nicht definieren“Wie Daten mit Scrapy abrufen?

import scrapy 
from scrapy import * 

fetch("https://www.google.co.in/search?q=cholera&safe=strict&source=lnms&tbm=nws&sa") 

news_links = response.css(".r").extract()[0].encode('utf-8') 
news_texts = response.css(".st").extract()[0].encode('utf-8') 
news_images = response.css(".th").extract()[0].encode('utf-8') 

Ich habe versucht, dieses:

import scrapy 


class QuotesSpider(scrapy.Spider): 
    name = "quotes" 

    def start_requests(self): 
     urls = [ 
      'https://www.google.co.in/search?q=cholera&safe=strict&source=lnms&tbm=nws&sa'] 

     for url in urls: 
      yield scrapy.Request(url=url, callback=self.parse) 

    def parse(self, response): 
     page = response.css(".r").extract() 
     filename = 'quotes-%s.html' % page 
     with open(filename, 'wb') as f: 
      f.write(response.body) 
     self.log('Saved file %s' % filename) 

mit der Befehl:

scrapy crawl quotes 

Welche funktioniert auch nicht, Wie kann ich diesen Code in ein Skript umwandeln.

Fehlerprotokoll:

scrapy crawl news 
2017-12-22 14:24:33 [scrapy.utils.log] INFO: Scrapy 1.4.0 started (bot: newsfee) 
2017-12-22 14:24:33 [scrapy.utils.log] INFO: Overridden settings: {'NEWSPIDER_M} 
2017-12-22 14:24:33 [scrapy.middleware] INFO: Enabled extensions: 
['scrapy.extensions.memusage.MemoryUsage', 
'scrapy.extensions.logstats.LogStats', 
'scrapy.extensions.telnet.TelnetConsole', 
'scrapy.extensions.corestats.CoreStats'] 
2017-12-22 14:24:33 [scrapy.middleware] INFO: Enabled downloader middlewares: 
['scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware', 
'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-12-22 14:24:33 [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-12-22 14:24:33 [scrapy.middleware] INFO: Enabled item pipelines: 
[] 
2017-12-22 14:24:33 [scrapy.core.engine] INFO: Spider opened 
2017-12-22 14:24:33 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pa) 
2017-12-22 14:24:33 [scrapy.extensions.telnet] DEBUG: Telnet console listening 4 
2017-12-22 14:24:33 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.) 
2017-12-22 14:24:33 [scrapy.downloadermiddlewares.robotstxt] DEBUG: Forbidden b> 
2017-12-22 14:24:33 [scrapy.core.engine] INFO: Closing spider (finished) 
2017-12-22 14:24:33 [scrapy.statscollectors] INFO: Dumping Scrapy stats: 
{'downloader/exception_count': 1, 
'downloader/exception_type_count/scrapy.exceptions.IgnoreRequest': 1, 
'downloader/request_bytes': 224, 
'downloader/request_count': 1, 
'downloader/request_method_count/GET': 1, 
'downloader/response_bytes': 2348, 
'downloader/response_count': 1, 
'downloader/response_status_count/200': 1, 
'finish_reason': 'finished', 
'finish_time': datetime.datetime(2017, 12, 22, 8, 54, 33, 954793), 
'log_count/DEBUG': 3, 
'log_count/INFO': 7, 
'memusage/max': 65478656, 
'memusage/startup': 65478656, 
'response_received_count': 1, 
'scheduler/dequeued': 1, 
'scheduler/dequeued/memory': 1, 
'scheduler/enqueued': 1, 
'scheduler/enqueued/memory': 1, 
'start_time': datetime.datetime(2017, 12, 22, 8, 54, 33, 295945)} 
2017-12-22 14:24:33 [scrapy.core.engine] INFO: Spider closed (finished) 

Antwort

0

Bevor Sie bearbeiten meine Antwort gewesen wäre; Also muss ich fragen, was ist Ihr Fehler-Stack mit dem Projekt, das Sie erstellt haben?

Ich nehme die Informationen, die ich dir gebe von the really great tutorial from the scrapy documentation.

ändern, was geändert werden muss, denke ich, es so gehen würde:

  • Erstellen Sie das Projekt

    scrapy startproject newsfeed

  • Dieses ein Verzeichnis wie folgt erstellen sollten:

    newsfeed/ 
        scrapy.cfg   # deploy configuration file 
    
        newsfeed/    # project's Python module, you'll import your code from here 
         __init__.py 
    
         items.py   # project items definition file 
    
         pipelines.py  # project pipelines file 
    
         settings.py  # project settings file 
    
         spiders/   # a directory where you'll later put your spiders 
          __init__.py 
    
  • Innerhalb der spiders Verzeichnis eine Datei mit diesem Code:

    import scrapy 
    
    
    class NewsSpider(scrapy.Spider): 
        name = "news" 
        start_urls = [ 
          'https://www.google.co.in/search?q=cholera&safe=strict&source=lnms&tbm=nws&sa' 
         ] 
    
        def parse(self, response): 
         news_links = response.css(".r").extract()[0].encode('utf-8') 
         news_texts = response.css(".st").extract()[0].encode('utf-8') 
         news_images = response.css(".th").extract()[0].encode('utf-8') 
         # do something with news_*, save them, etc... 
    
  • Sie würde die Spinne starten, indem Sie auf das erste newsfeed Verzeichnis gehen und scrapy crawl newsfeed in der Bash ausgeführt wird.

+0

Ich habe dort zwei Zeilen hinzugefügt "f = öffnen (" my_file.txt "," wb ")" in Ihrem Code "f.write (news_links)", und nichts ändert sich, ich habe das Protokoll aktualisiert nicht Generieren Sie nichts, keine Ausgabedateien – jax

+0

Sind Sie sicher, dass Sie scrapy crawl news im obersten "newsfeed" -Verzeichnis ausführen? Ansonsten ist alles andere ziemlich Standard und sollte funktionieren. Und der Name in 'scrapy crawl NAME' sollte mit dem Namen-Parameter übereinstimmen, den Sie in Ihrer NewsSpider-Klasse festgelegt haben. – Jacquot

+0

@jacqout Ja, wenn ich den vom scrapy-Dokument bereitgestellten Beispielcode ausführe, erzeugte er tatsächlich zwei HTML-Antwortdateien quote_1.html und quote_2.html aber In meinem Fall gibt es nichts zurück.:( – jax

0
2017-12-22 14:24:33 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.) 
2017-12-22 14:24:33 [scrapy.downloadermiddlewares.robotstxt] DEBUG: Forbidden b> 

aus diesen beiden Zeilen einzuloggen, sollte es von Google verboten haben.

Ich denke, Sie müssen erstens einige flexiblere und effektivere Methoden zu avoid getting banned hinzufügen.

Außerdem können Sie zuerst scrapy shell <url> bis debug or test your scrapying url directly verwenden.

+0

dieser Code erfolgreich auf der Shell arbeiten – jax

+0

was erfolgreich die Arbeit bedeuten? Kann die Informationen, die Sie? wünschen holen – AndyWang

+0

ich durch 'view versucht (Antwort)', aber die Antwort nicht – AndyWang