2017-12-06 5 views
0

Ich crawlen eine Liste von URLs aus einer Textdatei mit Scrapy Spider. Ich bin ziemlich neu in Python und Scrapy, ich muss es einfach nur umdrehen, um diese Aufgabe zu erledigen.Scrapy Spider: Crawl eine Liste von URLs, beginnend mit Zeile n

Meine Liste von URLs ist ziemlich groß, so ist dies, wie ich es umgesetzt haben:

from scrapy.spider import BaseSpider 
from scrapy.http.request import Request 
import time 

class MySpider(BaseSpider): 
    name = "example" 
    allowed_domains = ["example.com"] 


    def __init__(self, filename=None, delay=5, start_line = 0): 
     self.currentline = 0 
     self.download_delay = int(delay) 
     self.filename = filename 
     self.start_line = int(start_line) 



    def start_requests(self): 
     with open(self.filename, 'r') as f: 
      for url in f.readlines(): 
       self.currentline +=1 

       if self.currentline < self.start_line: 
        continue 
       else: 
        print(self.currentline) 
        yield Request(url.strip(), self.parse) 

    def parse(self, response): 
     logfilename = 'log' 
     with open(logfilename, 'a') as f: 
      f.write('Crawled line ' + str(self.currentline) + ' of ' + self.filename + ': ' + response.url + '\n') 

ich gerade nichts Parsen, werde ich darüber später kümmern, nur um es für die Anmeldung jetzt.

ich es mit anrufen, sagen:

scrapy runspider myfolder\kwdSpider.py -a filename=myfolder\urls.txt -a delay=10 -a start_line=124 

Da die URL-Listen ziemlich groß sein kann ich die Option implementiert von der angegebenen start_zeile neu zu starten kriechen (und verwendet yield Request()). Es funktioniert eigentlich alles gut, außer das:

E:\Python27>scrapy runspider mysite\kwdSpider.py -a filename=example\urls.txt -a delay=8 -a start_line=124 
E:\Python27\example\kwdSpider.py:5: ScrapyDeprecationWarning: kwdSpider.MySpider inherits from deprecated class scrapy.spider.BaseSpider, please inherit from scrapy.spider.Spider. (warning only on first subclass, there may be others) 
    class MySpider(BaseSpider): 
2017-12-06 12:27:35+0100 [scrapy] INFO: Scrapy 0.25.1 started (bot: scrapybot) 
2017-12-06 12:27:35+0100 [scrapy] INFO: Optional features available: ssl, http11 
2017-12-06 12:27:35+0100 [scrapy] INFO: Overridden settings: {} 
2017-12-06 12:27:35+0100 [scrapy] INFO: Enabled extensions: LogStats, TelnetConsole, CloseSpider, WebService, CoreStats, SpiderState 
2017-12-06 12:27:35+0100 [scrapy] INFO: Enabled downloader middlewares: HttpAuthMiddleware, DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, DefaultHeadersMiddleware, MetaRefreshMiddleware, HttpCompressionMiddleware, RedirectMiddleware, CookiesMiddleware, ChunkedTransferMiddleware, DownloaderStats 
2017-12-06 12:27:35+0100 [scrapy] INFO: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware 
2017-12-06 12:27:35+0100 [scrapy] INFO: Enabled item pipelines: 
2017-12-06 12:27:35+0100 [example] INFO: Spider opened 
2017-12-06 12:27:35+0100 [example] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 
2017-12-06 12:27:35+0100 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6024 
2017-12-06 12:27:35+0100 [scrapy] DEBUG: Web service listening on 127.0.0.1:6081 
124 
125 
126 
127 
128 
129 
130 
131 
132 
133 
134 
135 
136 
137 
138 
139 
2017-12-06 12:27:38+0100 [example] DEBUG: Crawled (200) <GET https://www.example.com/139th url> (referer: None) 
140 
2017-12-06 12:27:47+0100 [example] DEBUG: Crawled (200) <GET https://www.example.com/140th url> (referer: None) 
141 

Sehen Sie, wie die ersten Dutzend oder so URLs übersprungen werden? Ich verstehe offensichtlich nicht richtig, wie die Spinne funktioniert, ist es nicht initialisiert, bevor die start_requests-Routine das Zählen durch die txt-Datei beendet hat (was übrigens die einzige Art ist, wie ich denken könnte, dies zu implementieren)?

Bonusfrage - Worum handelt es sich bei dieser Notiz?

@kwdSpider.MySpider inherits from deprecated class scrapy.spider.BaseSpider, please inherit from scrapy.spider.Spider. (warning only on first subclass, there may be others) 
    class MySpider(BaseSpider): 

Danke.

+0

Geht es schließlich zu den übersprungenen URLs zurück. Ich glaube, dass es nicht linear funktioniert und die Geschwindigkeit begrenzt, mit der es eine beliebige Domain erreicht. Könnte das dein Problem sein? – Phil

+0

Ich glaube nicht, nein, zumindest ist es nicht in das Protokoll geschrieben, noch zeigt die Konsolenausgabe an, dass dies der Fall ist. Sowohl das Protokoll als auch die Konsole gehen einfach weiter - Zeilen 140, 141, 142, 143 usw. und kommen nie wieder zu den übersprungenen zurück. Ich würde sagen, die Spinne bekommt diese ersten Dutzend Zeilen nicht. – Bodd

+0

Macht es einen Unterschied, ob Ihre Startlinie eine andere Nummer ist, sagen wir 140? Ich versuche nur auszuschließen, dass es ein Problem mit den übersprungenen URLs oder ein Problem mit dem Dateiformat gibt. Vielleicht fügen Sie auch 'url.strip() 'zu Ihrer print-Anweisung hinzu, um zu zeigen, was durch die Realität gehen soll. – Phil

Antwort

0

Ich werde die Bonusfrage beantworten, während die Untersuchungen mit dem Hauptproblem fortfahren.

In Bezug auf die Warnung:

from scrapy.spider import Spider 
from scrapy.http.request import Request 
import time 

class MySpider(Spider): 

, dass dieses Problem zumindest lösen sollte:

@kwdSpider.MySpider inherits from deprecated class scrapy.spider.BaseSpider, please inherit from scrapy.spider.Spider. (warning only on first subclass, there may be others) 
class MySpider(BaseSpider): 

die Nachricht an das Wort Folgen, den Code ändern.