[PYTHON] Wenn ich das Webapi crawle, das beim Rendern angezeigt wird, wurde es mit CORS abgespielt

Der Anfang der Dinge

Wenn Sie ein Programm ausgeführt haben, das eine mit python3 geschriebene Seite crawlt Eines Tages bekam ich so einen Fehler.

Access to XMLHttpRequest at 'https://target' from origin 'https://xxxxxxxxx' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Die Implementierung zu diesem Zeitpunkt ist wie folgt.

import requests
res = requests.get("https://target") #Webapi-URL

Die Seite, die das Ziel des Crawls war, ist eine Seite, die Daten mit Bootstrap usw. liest und anzeigt. Ich habe während des Renderns auf einem Webapi gecrawlt, das vom Bootstrap aufgerufen wurde.

Lösung

Mit Selendraht kriechen. Der Webtreiber von selenium kann nur gerenderte Webseiten verarbeiten, wodurch auch beim Rendern auf die Ergebnisse von Abfragen zugegriffen werden kann. https://pypi.org/project/selenium-wire/

from seleniumwire import webdriver

driver = webdriver.Chrome()
driver.get("https://target") #URL der TOP-Seite

for request in driver.requests:
    if "xxxxx" in request.url: #Bedingungen für die Eingrenzung der URLs, für die Sie Ergebnisse erzielen möchten (Webapi-URL)
        response_text = request.response.body.decode()

Kleine Geschichte

Was ist CROS überhaupt?

Ich habe in diesem Artikel studiert. https://qiita.com/att55/items/2154a8aad8bf1409db2b Ich verstehe, es ist definitiv notwendig. Weil es Menschen gibt, die Dinge wie sich selbst tun.

Ist es möglich, CROS mit Python zu verarbeiten? → Es scheint, dass dies nicht einfach möglich ist

Ich habe nicht viel recherchiert, aber es scheint, dass es nicht einfach geht. Also habe ich aufgegeben. In CORS scheint die Preflight-Anforderung zuerst übersprungen zu werden und dann tatsächlich GET oder POST. https://developer.mozilla.org/ja/docs/Glossary/Preflight_request

Für diesen Artikel werden Preflight-Anforderungen nach Bedarf automatisch vom Browser ausgegeben. Front-End-Entwickler müssen solche Anfragen normalerweise nicht selbst stellen. Es heißt ` Der Browser macht das für mich = Ich habe es aufgegeben zu denken, dass der Weg zum Fliegen verborgen ist. Selbst wenn Sie etwas tun, werden Artikel mit der Fetch-API oder XMLHttpRequest veröffentlicht, sodass Sie sie anscheinend nur mit Javascript ausführen können.

Kann mit NodeJS gemacht werden → Vielleicht kann es gemacht werden (nicht verifiziert)

Weil es Javascript ist. Es scheint, dass die Fetch-API mit NodeJS verwendet werden kann. https://www.npmjs.com/package/node-fetch

Recommended Posts

Wenn ich das Webapi crawle, das beim Rendern angezeigt wird, wurde es mit CORS abgespielt
Was ich getan habe, als ich wütend war, es mit der Option enable-shared einzufügen
Als ich versuchte, Python auszuführen, wurde ich zum Microsoft Store übersprungen
Die Geschichte, mit der ich mich befasst habe, weil Apache bei AH00144 war
[Scikit-learn] Ich habe mit der ROC-Kurve gespielt
Als ich in IPython versuchte, den Wert zu sehen, war es ein Generator, also kam ich auf ihn, als ich frustriert war.
Die mit vim bearbeitete Datei war schreibgeschützt, aber ich möchte sie speichern
Als ich untersuchte, ob die COTOHA-API Mansai verstehen konnte, war dies vernünftig.
Als ich versuchte, das Root-Passwort mit ansible zu ändern, konnte ich nicht darauf zugreifen.
Eine Geschichte, der ich nach der SFTP-Kommunikation mit Python verfallen war
Ich habe vorerst mit Floydhub gespielt
Es wurde TLE, als ich den Vorgang mit der Druckfunktion im Competition Pro bestätigte
Eine Geschichte, die praktisch war, als ich versuchte, das Python-IP-Adressmodul zu verwenden
Ich habe versucht, das Telefon klingeln zu lassen, als es auf dem IoT-Post veröffentlicht wurde
Als ich versuchte, eine Socket-Kommunikation mit Raspberry Pi durchzuführen, war das Protokoll anders
Als ich die von Django generierte Abfrage überprüfte, wurde sie in großer Anzahl ausgegeben
Hier ist eine, ich werde die mit "künstlicher Intelligenz" ausgestatteten Anwendungen zusammenfassen, an denen ich interessiert war
Code-Memo, das in Schwierigkeiten war, weil es nicht auf der Website discord.py aufgeführt war
Das Problem, dass das Bild beim Laden mit PandasTools.LoadSDF nicht in ROMol angezeigt wurde, wurde behoben.
Ein Memo, dass ich den Datenspeicher mit Python berührt habe
Die Geschichte, die Japan ausgab, wurde mit Django verwechselt
Als ich den AtCoder Beginner Contest ausprobierte, war es ein schreckliches Ergebnis, also schaue ich zurück
Als ich die ähnlichen Wörter vorsichtig + mutig mit word2vec berechnete, fühlte es sich unerwartet vernünftig an
[VLC] Wie man mit dem Problem umgeht, dass es während der Wiedergabe nicht im Vordergrund steht