Tutorial: Wie man Instagram mit Swift abkratzt

In diesem Tutorial zeige ich Ihnen, wie unglaublich einfach es ist, Benutzerinformationen mit swift ohne Bibliothek eines Drittanbieters von jedem instagram-Profil zu entfernen

Sehen Sie sich das Video-Tutorial an, um zu erfahren, wie man Instagram kratzt!

Index

1. Definieren Sie die URL für die Anfrage
2. Erstellen Sie eine Aufgabe, um die Anforderung auszulösen
3. Bestimmen Sie die linke und rechte Seite Ihrer Daten
4. Extrahieren Sie die Daten
5. Schlussbemerkungen

1. Definieren Sie die URL für die Anfrage

Wir werden unseren Schaber im Spielplatz implementieren, also mach weiter und erstelle einen neuen Spielplatz playground

Definieren wir zunächst eine Variable, die die URL der Website enthält, die wir durchsuchen möchten, und eine Variable, die den Benutzernamen enthält, um dann eine URL aus beiden zu erstellen:

Foundation importieren
let baseUrl = "http://www.instagram.com/"
let username = "martin_lasek"
let url = URL (string: baseUrl + username)!

Ich werde hier zwangsweise auspacken, weil wir nur dann null bekommen, wenn die URL unzulässige Zeichen enthält und wir klar erkennen können, dass dies nicht der Fall ist

2. Erstellen Sie eine Aufgabe, um die Anforderung auszulösen

Als Nächstes definieren wir eine Datenaufgabe, die eine Anfrage an unsere URL auslöst und den HTML-Code als Zeichenfolge in unsere Konsole druckt:

Foundation importieren
let baseUrl = "http://www.instagram.com/"
let username = "martin_lasek"
let url = URL (string: baseUrl + username)!
Geben Sie task = URLSession.shared.dataTask (mit: url) {(Daten, Antwort, Fehler) in ein
  Wache lass Daten = Daten sonst {
    print ("Daten waren Null")
    Rückkehr
  }
  guard let htmlString = String (Daten: Daten, Kodierung: .utf8) else {
    print ("Daten konnten nicht in String umgewandelt werden")
    Rückkehr
  }
  print (htmlString)
}
task.resume ()

Wenn Sie auf den Abspielknopf unten auf dem Spielplatz drücken, wird der Code ausgeführt!

Sie können Ihren Code auch ausführen, indem Sie in der letzten Zeile shift die Umschalttaste + die Eingabetaste drücken

Wenn wir uns nun die HTML-Datei in unserer Konsole ansehen, ist das eine Ansammlung von HTML-Dateien, aber versuchen Sie herauszufinden, wo der beginnt, und Sie werden sehen, dass tatsächlich ein Javascript-Objekt vorhanden ist, das alle Daten für das Profil enthält! Was für eine Goldmine!

HTML-Antwort eines Instagram-Profils

3. Bestimmen Sie die linke und rechte Seite Ihrer Daten

Eine kryptische Überschrift. Was um alles in der Welt ist mit der linken und rechten Seite Ihrer Daten gemeint? Gut, gut, gut, Watson. Ich bin froh, dass du gefragt hast

Lass mich ein paar Bilder mit Bildunterschriften einwerfen

Die Daten, die wir holen werdenHTML-Antwort eines Instagram-Profils

Daten hier sind also die Informationen, die wir wollen. Aber wie kriegen wir das hin? Jetzt können wir nicht nur die Länge unseres HTML-Strings zählen und versuchen herauszufinden, bei welchem ​​Index die Follower-Zählung beginnt, denn wo endet sie? 5 Indizes später? Was ist, wenn ein Profil nur 157 Follower hat? Jetzt endet die Zählung 3 Indizes später. Sie sehen, dass dieser Ansatz nicht wirklich funktioniert

Wir wissen jedoch, dass sich die der Zählung überlassene Saite nicht ändert und auch ziemlich einzigartig ist. Natürlich nur, wenn wir keinen noch längeren Teil der linken Seite als im obigen Screenshot gezeigt verwenden, weil wir dann anfangen, Zeichen zu berücksichtigen, die keine Schlüssel sind, sondern tatsächliche Werte, die sich ändern können und dann brechen würden unser Code.

Wir sehen uns also die linke Seite von "Die Daten, die wir erfassen möchten" an und entscheiden, wie viel von der linken Seite wir benötigen, um sicherzustellen, dass sie eindeutig ist, aber sie ändert sich auch nicht, wenn wir ein anderes Profil anfordern.

edge_followed_by ": {" count ":

Egal, was Sie tun, stellen Sie sicher, dass Ihre linke Seite wirklich genau vor den Daten endet, die wir erfassen möchten. Das nächste Zeichen unserer linken Seite, das wir nicht berücksichtigen, ist buchstäblich das erste Zeichen der Daten, die wir erfassen möchten.

Gleiches gilt für die rechte Seite, die direkt nach den gewünschten Daten beginnen muss:

}, "follow_by_viewer

With it

Foundation importieren
let baseUrl = "http://www.instagram.com/"
let username = "martin_lasek"
let url = URL (string: baseUrl + username)!
Geben Sie task = URLSession.shared.dataTask (mit: url) {(Daten, Antwort, Fehler) in ein
  Wache lass Daten = Daten sonst {
    print ("Daten waren Null")
    Rückkehr
  }
  guard let htmlString = String (Daten: Daten, Kodierung: .utf8) else {
    print ("Daten konnten nicht in String umgewandelt werden")
    Rückkehr
  }
  // print (htmlString) // kommentiere dies jetzt aus
  let leftSideString = "" "
  edge_followed_by ": {" count ":
  "" "
  let rightSideString = "" "
  }, "follow_by_viewer
  "" "
}
task.resume ()

Wir verwenden "", weil unsere Zeichenfolge einfache Anführungszeichen enthält "und ich es einfacher finde," "zu verwenden, anstatt jedes" "in unserer Zeichenfolge zu maskieren

4. Extrahieren Sie die Daten

Hier kommt die geheime Zutat. Die Frage, die Sie sich von Anfang an gestellt haben. Wie werden wir die Daten extrahieren? Regex? Wie? Sag mir!

Es ist kein regulärer Ausdruck. Es ist Reichweite. 🥳

Strings in swift haben eine leistungsstarke Funktion namens range (of :), mit der wir den Bereich eines Strings in einem anderen String abrufen können, wie zum Beispiel:

let name = "Link"
let message = "Link! Hey, hör zu!"
let rangeOfName = message.range (von: name)
let startIndex = rangeOfName.lowerBound.encodeOffset
let endIndex = rangeOfName.upperBound.encodeOffset
print (startIndex) // 0
print (endIndex) // 4

Ja, der upperBound-Index ist 4. Keine Sorge, das ist vollkommen in Ordnung, und ich werde es in den Schlussnoten etwas detaillierter erläutern. Wir werden keine Indizes verwenden. Dies war nur ein Beispiel für ein besseres Verständnis der Funktionsweise von Bereichen

HINWEIS:
lowerBound = korrekter Index
upperBound = ein Index weiter

Wir werden mit Bereichen arbeiten, weil wir nicht nur den Bereich einer Zeichenfolge in einer anderen Zeichenfolge abrufen können, sondern auch über einen Bereich auf eine Zeichenfolge in einer anderen Zeichenfolge zugreifen können. Ich bin sicher, Sie wissen, wie man mit einem Index auf ein einzelnes Zeichen innerhalb eines Strings zugreift, oder?

let character = name [2] // Dies würde auf das "n" außerhalb des Namens zugreifen

Nun, lassen Sie mich Ihnen etwas Großartiges sagen: Gleiches gilt für Bereiche ranges

let string = message [rangeOfName] // gibt dir "Link" aus der Nachricht

Okay, lass uns zu unserer Mission zurückkehren! Wir haben also die linke Seite der Daten definiert, die wir erfassen möchten, sowie die rechte Seite davon

Wir werden den Bereich beider Seiten nutzen, um dann einen ganz neuen Bereich zu erstellen, der definiert, wo sich unsere Daten innerhalb des HTML-Strings befinden:

Foundation importieren
let baseUrl = "http://www.instagram.com/"
let username = "martin_lasek"
let url = URL (string: baseUrl + username)!
Geben Sie task = URLSession.shared.dataTask (mit: url) {(Daten, Antwort, Fehler) in ein
  Wache lass Daten = Daten sonst {
    print ("Daten waren Null")
    Rückkehr
  }
  guard let htmlString = String (Daten: Daten, Kodierung: .utf8) else {
    print ("Daten konnten nicht in String umgewandelt werden")
    Rückkehr
  }
  print (htmlString)
  let leftSideString = "" "
  edge_followed_by ": {" count ":
  "" "
  let rightSideString = "" "
  }, "follow_by_viewer
  "" "
  bewachen
    let leftSideRange = htmlString.range (von: leftSideString)
  sonst {
    print ("Linken Bereich nicht gefunden")
    Rückkehr
  }
  bewachen
    let rightSideRange = htmlString.range (von: rightSideString)
  sonst {
    print ("Der richtige Bereich wurde nicht gefunden")
    Rückkehr
  }
  let rangeOfTheData = leftSideRange.upperBound .. 
  let valueWeWantToGrab = htmlString [rangeOfTheData]
  print (valueWeWantToGrab) // gibt die Anzahl der Follower aus: 19093
}
task.resume ()

Wenn Sie die linke und die rechte Seite der Daten verwenden, spielt es keine Rolle, wie viele Indizes die tatsächlichen Daten enthalten. Es spielt keine Rolle, ob jemand nur 157 Follower (3 Indizes lang) oder 19093 Follower (5 Indizes lang) hat, da sich die linke und die rechte Seite nicht ändern. Sie können nur ihre Position innerhalb des HTML-Strings ändern. Ebenso könnte sich der Startindex der rechten Seite ändern. Aber das macht uns nichts aus, weil wir sagen: "Gib mir den Bereich der rechten Seite innerhalb von htmlString, egal wo es ist" und damit bekommen wir den richtigen Bereich (Start- / Endindex). Und Sie können unseren neuen Bereich erstellen, der definiert, wo sich die Daten in htmlString befinden

5. Schlussbemerkungen

Hier ist eine kleine Visualisierung der Bereiche unserer linken und rechten Seite für den Fall, dass es für Sie nicht vollständig geklickt hat

  // `leftSideString`
  //
  // edge_followed_by ": {" count ":
  // <-------------------------->
  // ↑ ↑
  // lowerBound upperBound
  // `rightSideString`
  //
  //}, "follow_by_viewer
  // <-------------------->
  // ↑ ↑
  // lowerBound upperBound

Denken Sie an das Beispiel mit dem Namen und der Nachricht und daran, dass wir einen Bereich mit einem Index von 0 und 4 hatten, obwohl name nur Indizes von 0 bis 3 hat:

"Link" // String
 0123 // Seine Indizes

Die untere Grenze hatte den richtigen Startindex (0), aber die obere Grenze hatte einen um eins weiter liegenden Index (4 statt 3).

Als wir nun unser neues Sortiment erstellt haben, haben wir die obere Grenze (einen Index weiter) der linken Seite verwendet. Und wir haben die untere Schranke (korrekter Startindex) der rechten Seite verwendet.

Denken Sie daran, dass die Zeichenfolge auf der linken Seite genau endet, bevor unsere Daten beginnen. Das heißt, seine Obergrenze ist ein Index weiter und daher der korrekte Startindex unserer Daten, so wie wir ihn brauchen!

Denken Sie auch daran, dass die rechte Seite genau nach unseren Daten beginnt. Das heißt, es startet einen Index nach unseren Daten. Nun, die obere Grenze der Daten muss ein Index weiter sein als die tatsächliche Endung der Daten. Denn so funktionieren die oberen Schranken. Und da eine Untergrenze den genauen Index beschreibt, an dem eine Zeichenfolge beginnt. Wir können die untere Grenze der rechten Seite verwenden, die uns den genauen Index gibt, an dem diese rechte Seite beginnt. Und wo fängt die rechte Seite an? Genau! Ein Index nach unseren Daten. Deshalb können wir die untere Grenze der rechten Seite als obere Grenze unserer Daten verwenden, so wie wir es brauchen!

Gehe in die letzte Zeile direkt nach task.resume () und drücke Shift + Enter und du hast es geschafft! Sie haben Ihren ersten kleinen Instagram-Scraper erfolgreich implementiert !

Sehen Sie sich das Video-Tutorial an, um zu erfahren, wie man Instagram kratzt!

Ich freue mich sehr, dass Sie meinen Artikel gelesen haben! Wenn Sie irgendwelche Vorschläge oder Verbesserungen haben, lassen Sie es mich wissen! Ich würde gerne von Ihnen hören!

Twitter / Youtube / Instagram