[PYTHON] Analysieren Sie die Antwort, damit Sie Wantedlys eigene Geschichte abkratzen können

Vorwort

Nijibox nutzt Wantedly für die Rekrutierung von Karrieren. (Wenn Sie interessiert sind von hier)

Als die Geschichte aktualisiert wurde, fragte ich mich, ob ich Slack in der Firma benachrichtigen könnte, aber ich schaute auf die Quelle. RSS-Feed existiert nicht. [^ 1] Wenn es darum geht, muss der Parser vollständig genutzt werden, um die Datenstruktur gut zu verarbeiten ...

Ich werde in diesem Artikel belassen, was ich dafür getan habe.

Start und Ziel von heute

Das Material ist die "Geschichte" in Wantedly von Nijibox. https://www.wantedly.com/companies/nijibox/feed

Von hier aus werde ich den Code schreiben, um "eine Datenstruktur zu extrahieren, die einer anderen Ausgabe standhalten kann".

Antwort (= fertiges Produkt)

feed-from-wantedly.py


import json
import pprint
import requests
from bs4 import BeautifulSoup

URL = 'https://www.wantedly.com/companies/nijibox/feed'

resp = requests.get(URL)
soup = BeautifulSoup(resp.content, 'html.parser')
# <script data-placeholder-key="wtd-ssr-placeholder">Ich hole den Inhalt
#Der Inhalt dieses Tags ist eine JSON-Zeichenfolge, jedoch am Anfang'// 'Zum Lesen entfernt, weil es gibt
feed_raw = soup.find('script', {'data-placeholder-key': "wtd-ssr-placeholder"}).string[3:]
feeds = json.loads(feed_raw)
#Es gibt verschiedene Dinge im Körper im gesamten JSON, aber der Körper selbst wurde zu einem Schlüssel, der ein Schlüssel für das Diktat eines Unternehmens zu sein scheint
#Es scheint jedoch, dass es nur eine gibt, so dass es sehr grob extrahiert wird
feed_body = feeds['body'][list(feeds['body'].keys())[0]]

#Elemente, die feste Beiträge zu sein scheinen
pprint.pprint(feed_body['latest_pinnable_posts'])

Wenn Sie dies tun, sieht es so aus:

$ python3 feed-from-wantedly.py
[{'id': 188578,
  'image': {'id': 4141479,
            'url': 'https://d2v9k5u4v94ulw.cloudfront.net/assets/images/4141479/original/9064f3ba-9327-4fce-9724-c11bf1ea71e2?1569833471'},
  'post_path': '/companies/nijibox/post_articles/188578',
  'title': 'Fühlen Sie sich frei, mit einem ungezwungenen Interview zu beginnen! Was Nijibox Arbeitssuchenden vermitteln möchte, ihre Gedanken zur Einstellung'},
 {'id': 185158,
  'image': {'id': 4063780,
            'url': 'https://d2v9k5u4v94ulw.cloudfront.net/assets/images/4063780/original/44109f75-6590-43cb-a631-cb8b719564d4?1567582305'},
  'post_path': '/companies/nijibox/post_articles/185158',
  'title': '[Für Anfänger] Design ist nicht "Sinn", sondern "Theorie". Sie können es ab heute tun! So werden Sie UI-Designer'},
 {'id': 185123,
  'image': {'id': 4062946,
            'url': 'https://d2v9k5u4v94ulw.cloudfront.net/assets/images/4062946/original/ff2169c7-568e-4992-b082-56f1e1be2780?1567573415'},
  'post_path': '/companies/nijibox/post_articles/185123',
  'title': 'Wir hatten eine React-Lernsitzung mit Herrn Ikeda von ICS!'}]

Vorbereitung

Dieses Mal habe ich es in der folgenden Umgebung geschafft.

Schau in der richtigen Reihenfolge

Bis "Empfange die Antwort mit" Anfragen "und analysiere sie mit" BeautifulSoup4 "" ist es so genannte "Common", also werde ich es dieses Mal überspringen.

Wo kann man mehr analysieren?

Dieses Mal werde ich die "Featured Posts" finden und analysieren, aber hier gibt es ungefähr zwei Probleme.

Letzteres ist besonders problematisch, und die Methode zum Verfolgen von Tags mit "oup.find "funktioniert nicht. [^ 2]

Dann, wo zu analysieren スクリーンショット 2019-11-26 19.40.05.png

Hier ist es.

Erwünschte SSR-Überlegung (nur Quelle)

スクリーンショット 2019-11-26 19.42.30.png

Dies ist das Ergebnis einer Google-Suche nach "Nijibox" und "Wantedly", wie oben beschrieben, aber die Umrisse usw., die nicht im "body" -Tag der Antwort enthalten sind, werden ordnungsgemäß aufgelistet. Die Website von Wantedly scheint eine Spezifikation zu haben, die den Inhalt selbst zum Zeitpunkt der Ausführung von JS als Material-JSON enthält und rendert.

Extrahieren Sie den entsprechenden Artikel mit Beautiful Soup

Dies ist die einzige Linie, in der Beautiful Soup seinen Job macht.

feed_raw = soup.find('script', {'data-placeholder-key': "wtd-ssr-placeholder"}).string[3:]

Find_all von Beautiful Soup ist nicht nur für Tags, sondern auch für die Attributebene wirksam, sodass Sie den gewünschten Inhalt auf einmal erhalten können. Es ist bequem. Der Grund für die Verwendung von "string [3:]" ist, dass am Anfang dieses Inhalts ein obstruktives Zeichen steht, das "//" als JSON zu analysieren ist. [^ 3]

Danach denke ich, dass die JSON-Zeichenfolge zu einem Objekt gemacht und nur analysiert wird ...

Grob gesagt sieht der Inhalt des analysierten Objekts so aus.

{
  "router":{"Abkürzung"},
  "page":"companies#feed",
  "auth":{"Abkürzung"},
  "body":{
    "c29bc423-7f81-41c2-8786-313d0998988c":{
      "company":{"Abkürzung"}
    }
  }
}

Die mysteriöse UUID. Möglicherweise etwas, das separat von der Firmen-ID verwendet werden kann.

Wir müssen uns also mit diesem Inhalt befassen.

feed_body = feeds['body'][list(feeds['body'].keys())[0]]

Glücklicherweise scheint es, dass nur eine Firma den Schlüssel hat, der für den Inhalt von "body" verwendet wird, also werde ich ihn auf eine super schlampige Weise in den Rücken teilen.

Zum Schluss Elemente extrahieren

Im Moment gibt es zwei Punkte, die nützlich erscheinen.

posts: Alle Geschichten bisher? latest_pinnable_posts: Der Teil, der" Featured Posts "entspricht

Dieses Mal habe ich beschlossen, dass ich nur das Minimum brauche, also gebe ich "latest_pinnable_posts" aus und beende. Danke für deine harte Arbeit.

pprint.pprint(feed_body['latest_pinnable_posts'])

Was ist mit Slack-Benachrichtigungen?

Ich habe es zu diesem Zeitpunkt noch nicht geschafft.

Es gibt einen solchen Ansatz. Diesmal vorerst nicht anwendbar.

Zurückblicken

Es ist schon eine Weile her, dass ich Beautiful Soup4 berührt habe, aber es hat schließlich alle Funktionen und ist einfach zu bedienen.

[^ 1]: Gewollt existiert es, wenn Sie oben oder in der Quelle der Unternehmensseite nach "application / rss + xml" suchen, aber es scheint, dass sich darin nichts Besonderes befindet [^ 2]: Natürlich können Sie JS mit einem kopflosen Browser usw. ausführen und das DOM für die Situation erstellen lassen, die der Browser betrachtet, aber diesmal wird es nicht übernommen [^ 3]: Ich kenne den Grund nicht [^ 4]: Da die Daten, die erfasst werden können, kein Datum und keine Uhrzeit für die Veröffentlichung enthalten, besteht der Engpass darin, dass Sie so etwas wie "Beim Bearbeiten erneut benachrichtigen" nicht ausführen können.

Recommended Posts

Analysieren Sie die Antwort, damit Sie Wantedlys eigene Geschichte abkratzen können
Können Sie diese Datei löschen?
Vielleicht können Sie mit Twitter Scraper kratzen
Bis Sie das Fehlerprotokoll lesen können