Scrapy, Schaben Daten in ein Javascript
Ich bin mit scrapy
- Bildschirm kratzen von Daten von einer website. Jedoch die Daten, die ich wollte war nicht im html-Code selbst, sondern von einem javascript. So, meine Frage ist:
Wie man die Werte (text-Werte) von solchen Fällen aus?
Dies ist die Seite, die ich versuche zu screen scrape:
https://www.mcdonalds.com.sg/locate-us/
Attribute, die ich versuche zu bekommen:
Adresse, Kontakt, öffnungszeiten.
Wenn Sie einen "Rechtsklick", "view source" in einem chrome-browser, werden Sie sehen, dass diese Werte nicht verfügbar sind, selbst in den HTML-Code.
Bearbeiten
Sry paul, ich Tat, was Sie mir erzählte, fand die admin-ajax.php
und sah den Körper, aber ich bin wirklich nun fest.
Wie Kriege ich die Werte aus dem json-Objekt und speichern es in eine variable ein Feld meines eigenen? Es wäre gut, wenn Sie könnten, wie genau ein Attribut für die öffentlichkeit und für diejenigen, die gerade begonnen scrapy als gut.
Hier ist mein code bisher
Items.py
class McDonaldsItem(Item):
name = Field()
address = Field()
postal = Field()
hours = Field()
McDonalds.py
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
import re
from fastfood.items import McDonaldsItem
class McDonaldSpider(BaseSpider):
name = "mcdonalds"
allowed_domains = ["mcdonalds.com.sg"]
start_urls = ["https://www.mcdonalds.com.sg/locate-us/"]
def parse_json(self, response):
js = json.loads(response.body)
pprint.pprint(js)
Sry für die lange Bearbeiten, so kurz, wie Speichere ich die json-Wert in my-Attribut? für zB
*** * item['Adresse'] = * abrufen ****
P. S, nicht sicher, ob das hilft, aber ich führen Sie diese Skripts auf der cmd-line mit
scrapy crawl mcdonalds -o-McDonalds.json -t json ( zum speichern aller meiner Daten in eine json-Datei )
Ich kann nicht genug betonen, wie dankbar ich mich fühle. Ich weiß, es ist ziemlich unvernünftig zu Fragen, das u wird völlig okay sein, auch wenn Sie nicht die Zeit haben, für diese.
Du musst angemeldet sein, um einen Kommentar abzugeben.
(Ich habe dies geschrieben, um
scrapy-users
mailing-Liste, allerdings von Paul ' s Vorschlag bin ich Entsendung es hier, wie es ergänzt die Antwort mit dershell
Befehl Interaktion.)In der Regel, Webseiten mit einem Drittanbieter-Dienst zu machen einige Daten-Visualisierung (Karte, Tabelle, etc) haben Daten zu senden, irgendwie, und in den meisten Fällen diese Daten sind zugänglich über den browser.
Für diesen Fall eine Inspektion (d.h. die Erkundung der Anforderungen vom browser) zeigt, dass die für das laden der Daten aus einer POST-Anforderung an https://www.mcdonalds.com.sg/wp-admin/admin-ajax.php
Also, grundsätzlich haben Sie dort alle Daten, die Sie wollen in einem netten json-format, bereit für den Verzehr.
Scrapy bietet die
shell
Befehl ist sehr praktisch, um Denker, die mit der Webseite vor dem schreiben der Spinne:Kurz: in Ihrem spider haben Sie die Rückkehr der
FormRequest(...)
oben, dann in der callback-laden der json-Objekt ausresponse.body
und schließlich für jede Filiale die Daten in der Listedata['stores']['listing']
erstellen Sie ein Element mit den gewünschten Werte ein.Etwas wie dieses:
Beim öffnen https://www.mcdonalds.com.sg/locate-us/ in Ihrem browser der Wahl, öffnen Sie die "überprüfen" - tool (ich hoffe, es hat ein, z.B. Chrome oder Firefox), und suchen Sie die "Netzwerk" - Reiter.
Können Sie einen weiteren filter für "XHR" (XMLHttpRequest) Ereignisse, und Sie werden sehen, eine
POST
Anfragehttps://www.mcdonalds.com.sg/wp-admin/admin-ajax.php
mit diesem KörperDie Antwort auf die POST-Anfrage ist ein JSON-Objekt mit allen Informationen, die Sie wollen
Diesem würde die Ausgabe etwas wie:
Lasse ich Sie zum extrahieren der Felder, die Sie wollen.
In der FormRequest() schicken Sie mit Scrapy Sie wahrscheinlich benötigen, um eine "X-Requested-With: XMLHttpRequest" - header (die Ihr browser sendet, wenn man sich die request-Header in den inspect-tool)