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.
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
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
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