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.
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".
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!'}]
Dieses Mal habe ich es in der folgenden Umgebung geschafft.
Bis "Empfange die Antwort mit" Anfragen "und analysiere sie mit" BeautifulSoup4 "" ist es so genannte "Common", also werde ich es dieses Mal überspringen.
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
Hier ist es.
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.
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]
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.
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'])
Ich habe es zu diesem Zeitpunkt noch nicht geschafft.
Es gibt einen solchen Ansatz. Diesmal vorerst nicht anwendbar.
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.