2016-06-21 3 views
0

Ich glaube, mit "Callback" -Methode ist asynchron, bitte korrigieren Sie mich, wenn ich falsch liege. Ich bin immer noch neu mit Python, also bitte ertragen Sie mit mir.Wie kann das Response-Objekt einer Anfrage synchron auf Scrapy abgerufen werden?

Wie auch immer, ich versuche, eine Methode, um zu überprüfen, ob eine Datei vorhanden ist und hier ist mein Code:

def file_exists(self, url): 
    res = False; 
    response = Request(url, method='HEAD', dont_filter=True) 
    if response.status == 200: 
     res = True 
    return res 

Ich dachte, die Anfrage() -Methode wird ein Response-Objekt zurück, aber es gibt immer noch eine Anfrage Objekt, um die Antwort zu erfassen, muss ich eine andere Methode für den Rückruf erstellen.

Gibt es eine Möglichkeit, das Response-Objekt innerhalb des Codeblocks zu erhalten, in dem Sie die Methode Response() aufrufen?

+0

Sie können versuchen, https://github.com/rolando/scrapy-inline-requests –

Antwort

0

Request Objekte erzeugen nichts.

Scrapy verwendet asynchrone Downloader-Engine, die diese Request Objekte übernimmt und Response Objekte generiert.

wenn eine Methode in der Spinne ein Request-Objekt zurückgibt sie automatisch in dem Downloader geplant sind und gibt ein Response Objekt spezifizierte callback (d.h. Request(url, callback=self.my_callback)). Sehen Sie sich mehr an scrapy's architecture overview

Jetzt kommt, wann und wo Sie es tun Sie können sagen, den Downloader Anfragen planen, um einige Anfragen zu planen:

self.crawler.engine.schedule(Request(url, callback=self.my_callback), spider) 

Wenn Sie dies von einer Spinne laufen spider hier können die meisten wahrscheinlich ist self hier und self.crawler wird von scrapy.Spider geerbt.

Alternativ können Sie immer asynchrone Stapel blockieren, indem sie so etwas wie requests wie mit:

def parse(self, response): 
    image_url = response.xpath('//img/@href').extract_first() 
    if image_url: 
     image_head = requests.head(image_url) 
     if 'image' in image_head.headers['Content-Type']: 
      item['image'] = image_url 

Es wird langsam Ihre Spinne nach unten, aber es ist wesentlich einfacher zu implementieren und zu verwalten.

+0

Ich möchte nur überprüfen, ob die Dateien vorhanden ist, ich werde nicht wirklich die Dateien herunterladen. Mein Crawler überprüft alle Seiten und überprüft alle Dateien wie Bilder und Download-Dateien (doc, pdf usw.), diese fehlenden Dateien werden zu einem Array-Feld meines Item-Objekts mit dem Namen "missing_files []" hinzugefügt. – eSPiYa

+0

Nun, du hast alles, was du brauchst, in meiner Antwort :) – Granitosaurus

+0

Ja, ich habe gerade requests.head() benutzt.Vielen Dank! – eSPiYa

0

Scrapy verwendet Request- und Response-Objekte zum Crawlen von Websites.

Normalerweise werden Request-Objekte in den Spidern generiert und durchlaufen das System, bis sie den Downloader erreichen, der die Anfrage ausführt und ein Response-Objekt zurückgibt, das zum Spider zurückkehrt, der die Anfrage gesendet hat.

Sofern Sie nicht manuell einen Downloader verwenden, scheint es so, als ob Sie das Framework falsch verwenden. Ich würde ein wenig mehr darüber lesen, wie man richtige Spinnen here erstellen kann.

Wenn eine Datei vorhanden ist, kann Ihr Spider relevante Informationen in einer Datenbank oder einer anderen Datenstruktur speichern, wenn er die geschabten Daten in seiner Parse *() -Methode analysiert und Sie später in Ihrem eigenen Code abfragen können.

Verwandte Themen