2017-12-31 152 views
0

Ich versuche, eine Spinne mit dem Paket "Scrapy" zu erstellen, das eine Liste von URLs erhält und sie kriecht. Ich habe stackoverflow für eine Antwort gesucht, konnte aber nichts finden, das das Problem lösen würde.Python - Scrapy - Erstellen eines Crawlers, der eine Liste von URLs erhält und sie crawlt

Mein Skript ist wie folgt:

class Try(scrapy.Spider): 
    name = "Try" 

    def __init__(self, *args, **kwargs): 
     super(Try, self).__init__(*args, **kwargs) 
     self.start_urls = kwargs.get("urls") 
     print(self.start_urls) 

    def start_requests(self): 
     print(self.start_urls) 
     for url in self.start_urls: 
      yield Request(url , self.parse) 

    def parse(self, response): 
     d = response.xpath("//body").extract() 

Wenn ich die Spinne krabbeln:

Spider = Try(urls = [r"https://www.example.com"]) 
process = CrawlerProcess({ 
'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)' 
}) 

process.crawl(Spider) 
process.start() 

ich folgende Info beim Drucken self.start_urls-Motiven bedruckt sind:

  • In der __init__ Funktion auf dem Bildschirm gedruckt ist: [r "https://www.example.com "] (wie an die Spinne weitergegeben).
  • Im start_requests Funktion auf dem Bildschirm gedruckt ist: Keine

Warum ich keine bekommen? Gibt es eine andere Möglichkeit, dieses Problem anzugehen? oder Gibt es Fehler in meiner Spinnenklasse?

Danke für jede Hilfe!

+0

Verwenden Sie einen anderen Namen für die Liste, um URLs beim Start zu behalten - 'self.start_urls' wird von' scrapy' verwendet, um sie zu entfernen. Ich frage mich, ob du URLs in "self.start_urls" in "__init__" steckst, dann benutzt es sie vielleicht und du brauchst 'start_requests' nicht? – furas

+0

'process.crawl' erstellt ein neues Try-Objekt ohne Parameter beim Aufruf von' from_crawler'. Siehe Crawler-Klasse im Scrapy-Quellcode. https://github.com/scrapy/scrapy/blob/master/scrapy/crawler.py#L101-L102 – matiskay

Antwort

0

Wenn ich

laufen
process.crawl(Try, urls=[r"https://www.example.com"]) 

dann schicken Sie es urls-Try wie ich erwarte. Und selbst ich brauche nicht start_requests.

import scrapy 

class Try(scrapy.Spider): 

    name = "Try" 

    def __init__(self, *args, **kwargs): 
     super(Try, self).__init__(*args, **kwargs) 
     self.start_urls = kwargs.get("urls") 

    def parse(self, response): 
     print('>>> url:', response.url) 
     d = response.xpath("//body").extract() 

from scrapy.crawler import CrawlerProcess 

process = CrawlerProcess({ 
'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)' 
}) 
process.crawl(Try, urls=[r"https://www.example.com"]) 
process.start() 

Aber wenn ich

spider = Try(urls = ["https://www.example.com"]) 

process.crawl(spider) 

verwenden dann sieht es aus wie es neu läuft Try ohne urls und dann Liste ist leer.

1

Ich würde vorschlagen, die Spider-Klasse in process.crawl zu verwenden und dort urls Parameter übergeben.

import scrapy 
from scrapy.crawler import CrawlerProcess 
from scrapy import Request 


class Try(scrapy.Spider): 
    name = 'Try' 

    def __init__(self, *args, **kwargs): 
     super(Try, self).__init__(*args, **kwargs) 
     self.start_urls = kwargs.get("urls") 

    def start_requests(self): 
     for url in self.start_urls: 
      yield Request(url , self.parse) 

    def parse(self, response): 
     d = response.xpath("//body").extract() 

process = CrawlerProcess({ 
    'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)' 
}) 

process.crawl(Try, urls=[r'https://www.example.com']) 
process.start() 
0

So jemand weiß, wo self.start_urls ‚s-Wert nach der Abtretung geht?

Wenn Sie process.crawl (Try) verwenden - erstellt Scrapy ein neues Try-Spider-Objekt?

Verwandte Themen