mediathekview / MServer

Server zum Steuern des Crawler
https://mediathekview.de
GNU General Public License v3.0
70 stars 19 forks source link

ZDF Crawler auf JSON-API umstellen #39

Closed pidoubleyou closed 7 years ago

pidoubleyou commented 7 years ago

Der ZDF-Crawler verarbeitet für die Liste der Sendungen HTML-Seiten, für die Film-Details JSON-Responses. Das Parsen erfolgt jeweils über String-Zerlegungen.

Ziel des Issues:

  1. Umstellung der Liste der Sendungen auf JSON
  2. Parsen der JSON-Responses mittels Standard JSON-Parser
Nicklas2751 commented 7 years ago

Nutzt du als Standard JSON-Parser Gson von Google? Ich habe mit dem sehr gute erfahrungen gemacht.

pidoubleyou commented 7 years ago

Ich verwende bisher den Jackson. Allerdings überlege ich nach den ersten Implementierungen, ob überhaupt eine Deserialisierung mittels JSON-Parser nötig ist oder ob nicht JSON-Path ausreichend ist.

Nicklas2751 commented 7 years ago

Magst du deinen aktuellen Stand bitte mal pushen? Wie in #32 angekündigt möchte ich den crwaler überholen und noch n paar sachen außenrum und da wäre es praktisch wenn wir nicht beide das gleiche ändern und uns blockieren und so ^^

Nicklas2751 commented 7 years ago

Hinweis ich habe beim genaueren betrachten der API mit Insomnia folgendes gefunden:

curl --request GET \
  --url 'https://api.zdf.de//search/documents?hasVideo=true&q=*&types=page-video&sortOrder=desc&from=2016-12-10T16%3A44%3A58%2B01%3A00&sortBy=date&to=2016-12-17T16%3A44%3A58%2B01%3A00&page=36' \
  --header 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' \
  --header 'access-control-request-headers: api-auth' \
  --header 'access-control-request-method: GET' \
  --header 'api-auth: Bearer f4ba81fa117681c42383194a7103251db2981962' \
  --header 'host: api.zdf.de' \
  --header 'origin: https://www.zdf.de' \
  --header 'user-agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:50.0) Gecko/20100101 Firefox/50.0'

Also einen REST APi aufruf bei dem wir eine Suche ansprechen können. Ursprünglich wurde die vom zdf verwendet um die meist geschauten Videos für die Startseite zu ermitteln. Wie in meinem Beispiel zu sehen kann man aber auch schon nach Date sortieren und wenn man dann noch das Datum für von und bis so anpasst, dass es die letzten 14 Tage abdeckt sollten wir so an die Sendungen der 14 Tage rankommen können.

Das ganze ist in Seiten unterteiult und solange es eine weitere Seite gitb kriegt man als antwort ua.a. "next ..." und dann der Link zur nächsten Seite.

===> Wir können das schön mit einem Rest client anzapfen dann nurnoch von den einzelnen Video Seiten die verfügbaren Video Formate abholen und das sollte es dann schon gewesen sein.

Um das ganze zu beschleunigen würde ich gerne das Fork-Join Framework einsetzen um möglichst viele URLs gleichzeitig verarbeiten zu können.

Nicklas2751 commented 7 years ago

Beispiel für die letzten 14 Tage (Stand 17.12.2016):

curl --request GET \
  --url 'https://api.zdf.de//search/documents?hasVideo=true&q=*&types=page-video&sortOrder=desc&from=2016-12-03T00%3A00%3A00%2B01%3A00&sortBy=date&to=2016-12-18T00%3A00%3A00%2B01%3A00' \
  --header 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' \
  --header 'access-control-request-headers: api-auth' \
  --header 'access-control-request-method: GET' \
  --header 'api-auth: Bearer f4ba81fa117681c42383194a7103251db2981962' \
  --header 'host: api.zdf.de' \
  --header 'origin: https://www.zdf.de' \
  --header 'user-agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:50.0) Gecko/20100101 Firefox/50.0'

Ergebnis sakt aktuell u.a.: totalResultsCount": 1539,

pidoubleyou commented 7 years ago

Sorry, dass ich solange nicht geantwortet hab. War u.a. im Urlaub. Ich habe eine erste Version auf Basis von Jersey im Feature Branch 39 gepushed. Erste Filme werden bereits gefunden, aber es sind noch diverse Anpassungen/Bugfixes notwendig (die mir bekannten sind mit @TODO im Code hinterlegt). Ich habe die Jersey-Implementierung zunächst in den bestehenden Reader integriert, um erstmal sicherzustellen, dass die Filme korrekt gefunden werden.

Ich werde die nächsten Tage daran weiterarbeiten und regelmäßig Zwischenstände pushen.

Nicklas2751 commented 7 years ago

Hmpf da jetzt ja länger nichts mehr von dir kam habe ich einen ersten Anfang mit Jersey gestern Vormittag bereits in den Branch zu #32 gepushed. Der große Unterschied zwischen dem Code von dir und dem von mir ist, dass ich u.a. auf eine neue Art die Crawler Daten zu verarbeiten Setze. Plan von mir war es, die ausgelesenen Daten durch Gson direkt zu Objekten bauen zulassen was solange die Klasse für alles Getter und Setter hat keine weiteren manuellen Anpassungen bedarf und ich als Basis für die "neuen Crawler" auf das mit der JDK ausgelieferte Fork-Join Framework setze um uns einen Geschwindigkeitsboost zu verschaffen. Allgemein denke ich ist es besser das ganze direkt innerhalb einer neuen Struktur zu realisieren und dann die restlichten Crawler nach zu ziehen als das jetzt auch noch in die alte Struktur zu quetschen und dann alles auf eine neue zu heben.

=> Ich würde dich bitten, dir mal den aktuellen Stand von #32 anzuschauen ;)

alex1702 commented 7 years ago

Behandelt dieses Issue jetzt noch etwas, was das Issue #32 nicht abdeckt? Bin nicht ganz auf der Höhe.

pidoubleyou commented 7 years ago

@alex1702 Ja, der Issue ist mit #32 abgeschlossen.

xaverW commented 7 years ago

der Suchlauf wurde nicht mehr beendet, sollte jetzt wieder gehen.

xaverW commented 7 years ago

der Server ist jetzt durchgelaufen, die Liste kann hier geladen werden: http://5.45.104.194/akt/filme-akt.xz

das ist die Liste die beim kompletten Suchlauf gefunden wird (ohne den Import anderer/alter Listen). ZDF: 1567 Filme alter Crawler, ZDF: ~4100 Filme

da wären alte Listen (ohne Import anderer/alter): http://5.45.104.194/archiv/

pidoubleyou commented 7 years ago

@xaverW danke für den Fix mit dem Beenden des Suchlaufs. Hatte ich wohl übersehen.

Habe die Liste angeschaut und dabei ist mir aufgefallen, dass der alte Crawler bis in den April 2016 zurück gesucht hat, der neue nur 15 Tage in der Vergangenheit berücksichtigt. Sollte der neue Crawler auch weiter zurück suchen?

In den durchsuchten Tagen findet der neue Crawler wie erwartet mehr Einträge.

alex1702 commented 7 years ago

Hmm schwer zu sagen für einen ersten durchlauf ist es zu wenig und sollte soweit zurück wie es geht. Bei einer aktualisierung der liste sollte er natürlich nicht so weit zurück gehen. Weiß nicht wie das im moment implementiert ist.

pidoubleyou commented 7 years ago

Ich habe den Suchzeitraum an den alten Crawler angepasst. Bei ersten Durchlauf 300 Tage, sonst 20 Tage.

alex1702 commented 7 years ago

Ok dann werde ich den Crawler morgen damit nochmal laufen lassen.

alex1702 commented 7 years ago

Xaver wie sieht die mserver.xml für einen komplett nackten vollständigen durchlauf aus?

Ich hab die jetzt so:

<?xml version="1.0" encoding="UTF-8"?>
<MServer>
<system>
    <system-user-agent>MServer</system-user-agent>
    <system-filmliste-import-live>live-streams.json</system-filmliste-import-live>
    <system-proxy-url></system-proxy-url>
    <system-proxy-port></system-proxy-port>
    <system-debug>1</system-debug>
</system>

<suchen>
    <suchen-sender-wie>max</suchen-sender-wie>
    <suchen-liste-wie>neu</suchen-liste-wie>
    <suchen-wann>sofort</suchen-wann>
    <suchen-max-warten>400</suchen-max-warten>
    <suchen-org-liste>true</suchen-org-liste>
</suchen>
</MServer>
xaverW commented 7 years ago

es muss nur ein Suchauftrag enthalten sein (wenn alles/max muss auch das noch sein):

<suchen-sender-wie>max</suchen-sender-wie> 
<suchen-liste-wie>alles</suchen-liste-wie>

ansonsten reicht das: <suchen-wann>sofort</suchen-wann>

<?xml version="1.0" encoding="UTF-8"?>
<MServer>
  <suchen>
    <suchen-wann>sofort</suchen-wann>
  </suchen>
</MServer>
alex1702 commented 7 years ago

Also mein erster Suchlauf leute mit der oben geposteten Konfiguration und leerem filmliste Ordner ergab ca 60k Filme und lauf dem Crawler Log hat er 0 Filme beim ZDF gefunden. Im moment läuft noch ein durchlauf mit xaver's Konfiguration, aber was ich da bis jetzt sehe sieht das auch nicht unbedingt besser aus. Aktueller Stand 94% und ca 61k Filme. Von eigentlich ca 160k was der aktuelle Crawler findet. Stimmt da vllt noch etwas nicht bei der eingliederung in die Filmlistendatei oder so?

xaverW commented 7 years ago

der Crawler findet nur ~60k Filme, der Rest kommt aus dem Import der "alten" Liste.

xaverW commented 7 years ago

0 Filme beim ZDF gefunden.

liegt daran, dass das neue ZDF nichts mehr ins Log schreibt.

xaverW commented 7 years ago

log von heute bei mir:

. Sender | Seiten | Filme | Fehler | FVers | ZeitFV[s] | Proxy | NoBuffer | . ------------------------------------------------------- . ZDF | 0 | 1564 | 0 | 0 | 0 | 0 | 0 | . SRF.Pod | 12 | 44 | 0 | 0 | 0 | 0 | 0 | . HR | 83 | 257 | 0 | 0 | 0 | 0 | 0 | . MDR | 2308 | 1147 | 1 | 6 | 3 | 0 | 0 | . DW | 2282 | 1428 | 0 | 0 | 0 | 0 | 0 | . KiKA | 10402 | 1095 | 10 | 10 | 2 | 0 | 0 | . SWR | 635 | 455 | 1331 | 1331 | 5324 | 0 | 0 | . ARTE.FR | 2579 | 613 | 2 | 2 | 1 | 0 | 0 | . ARTE.DE | 2553 | 602 | 3 | 3 | 1 | 0 | 0 | . ZDF-tivi | 1775 | 1608 | 0 | 0 | 0 | 0 | 0 | . ARD | 66202 | 30873 | 40 | 40 | 10 | 0 | 0 | . BR | 11984 | 5491 | 22 | 22 | 22 | 0 | 0 | . ORF | 1107 | 2955 | 2 | 2 | 1 | 0 | 0 | . SRF | 7780 | 3969 | 7 | 7 | 2 | 0 | 0 | . SR | 1309 | 1190 | 0 | 0 | 0 | 0 | 0 | . RBB | 5239 | 2195 | 0 | 0 | 0 | 0 | 0 | . WDR | 4008 | 1182 | 17 | 17 | 8 | 0 | 0 | . NDR | 8318 | 3598 | 20 | 21 | 5 | 0 | 0 | . 3Sat | 1111 | 896 | 0 | 0 | 0 | 0 | 0 | . PHOENIX | 401 | 183 | 55 | 55 | 13 | 0 | 0 | .
.
. Filme geladen: 61345 . Seiten geladen: 130088 . Summe geladen[MB]: 6513 . Traffic [MB]: 1171 . -> Rate[kB/s]: 122,0 . -> Dauer[Min]: 160 . -> Start: 24.01.2017 06:00:16 . -> Ende: 24.01.2017 08:40:18

alex1702 commented 7 years ago

es gibt 100k Filme die nicht innerhalb der letzten 300 Tage gefunden werden? respekt.

liegt daran, dass das neue ZDF nichts mehr ins Log schreibt.

Dann sollte das noch nachgepflegt werden.

Nicklas2751 commented 7 years ago

Ja @Pidoubleyou und ich wollten das erstmal abkürzen da in einiger Zeit ja einige Anwender Anfragen und co wegen ZDF kamen. Log kommt also noch aber eher im Zuge der allgemeinen Überarbeitung und dann mit Log4j und co. ;)

alex1702 commented 7 years ago

hmm ok. dann werde ich die alte liste importieren und damit mal durchlaufen lassen. da müsste dann ja mehr als 160k rauskommen. Wenn das soweit klappt werde ich dann den release vorbereiten und schnellstmöglich auf die crawler bringen.

alex1702 commented 7 years ago

Liegt vermutlich nur daran, dass die konfig kein system-filmliste-import-url-1 macht? Die importierte 1.xz ist von gestern dem 24.01. Wobei der Master crawler auch kein system-filmliste-import-url-1 bei mir hat. Bedeutet vermutlich, dass ich 2 durchläufe machen muss?! Oder ist die Zeit doch knapp gewählt mittlerweile?

===== Liste einsortieren: ABBRUCH =====                                                                                                                  │··········
.  COUNT_MAX erreicht [s]: 600                                                                                                                              │··········
.                                                                                                                                                           │··········
.  ===== Liste einsortieren: Noch online =====                                                                                                              │··········
.  Liste einsortieren, Anzahl: 111198                                                                                                                       │··········
.  Liste einsortieren, entfernt: 24013                                                                                                                      │··········
.                                                                                                                                                           │··········
.  In Liste einsortiert: 87185                                                                                                                              │··········
.                                                                                                                                                           │··········
.      gefunden: 87185                                                                                                                                      │··········
.  --> nach Anz. Filme: 149342  
<?xml version="1.0" encoding="UTF-8"?>                                                                                                                      │··········
<MServer>                                                                                                                                                   │··········
<system>                                                                                                                                                    │··········
    <system-filmliste-import-old>1.xz</system-filmliste-import-old>                                                                                         │··········
    <system-export-datei-filmliste>/var/www/default/filme.xz</system-export-datei-filmliste>                                                                │··········
    <system-export-datei-filmliste-org>/var/www/default/filme-org.xz</system-export-datei-filmliste-org>                                                    │··········
    <system-export-datei-filmliste-diff>/var/www/default/filme-diff.xz</system-export-datei-filmliste-diff>                                                 │··········
                                                                                                                                                            │··········
    <system-user-agent>MServer</system-user-agent>                                                                                                          │··········
    <system-filmliste-import-live>live-streams.json</system-filmliste-import-live>                                                                          │··········
    <system-debug>1</system-debug>                                                                                                                          │··········
</system>                                                                                                                                                   │··········
<suchen>                                                                                                                                                    │··········
    <suchen-sender-wie>max</suchen-sender-wie>                                                                                                              │··········
    <suchen-liste-wie>neu</suchen-liste-wie>                                                                                                                │··········
    <suchen-wann>sofort</suchen-wann>                                                                                                                       │··········
    <suchen-max-warten>999</suchen-max-warten>                                                                                                              │··········
</suchen>                                                                                                                                                   │··········
</MServer> 
Nicklas2751 commented 7 years ago

Ich habe mit Alex gefunden, dass er scheinbar nicht die komplette alte liste schafft ein zu sortieren. Ich probiere an der stelle mal etwas im branch aus. ;)

pidoubleyou commented 7 years ago

Bei mir tritt hin und wieder noch ein Problem beim ZDF auf: es werden viele Requests mit 403 abgelehnt. @alex1702 kannst du die Log-Datei für einen Lauf mal zur Verfügung stellen, ob die Probleme auch be dir auftreten? Wäre eine Erklärung, warum bei dir für ZDF 0 Filme in der Zusammenfassung stehen.i

alex1702 commented 7 years ago

@pidoubleyou hier: https://p.elaon.de/PuYLu52sebdo3XqQ8fe1/

alex1702 commented 7 years ago

2ter durchlauf verlief besser. hab jetzt ca 169k Filme und damit ca 8k mehr als wie mit dem alten Crawler. +/- ein paar wegen zeitlich versetzten Start. Ich denke mal wenn man diese Begrenzung beim einsortieren (wenn es nicht zu viel Aufwand ist) noch ein wenig anpasst, dann könnte man den so verwenden.

Neue: http://80.77.26.245/filme.xz Alte: http://80.77.26.245/filme2.xz

alex1702 commented 7 years ago

Der Film Doktorspiele aus #48 ist leider nicht mit in der Liste.

xaverW commented 7 years ago
===== Liste einsortieren: ABBRUCH ===

.  COUNT_MAX erreicht [s]: 600                                        

das wird nur beim Import einer alten Liste gemacht, das sind Filme die nicht mehr in der Mediathek sind und da wird dann mit einem http-request getestet, ob noch abrufbar, das wird max 10 Minuten lang versucht und bei der Anzahl inzwischen kann das vielleicht zu kanpp sein.

@pidoubleyou ZDF 0 das kommt davon, dass das neue ZDF GetUrl nicht mehr nutzt, damit wird die Statistik geführt

xaverW commented 7 years ago

das Einsortieren einer alten Liste wird parallel von 20 Threads gemacht: AddToFilmlist -> final int COUNTER_MAX = 20; könnte man vielleicht auch noch erhöhen um es weiter zu parallelisieren, ist ja nicht rechenintensiv sondern sind die Wartezeiten der HTTP-Requests

pidoubleyou commented 7 years ago

@xaverW zumindest die Anzahl der Filme setzt der neue Crawler bereits, da dies durch addFilm erfolgt.

@alex1702 Danke für das Log. Es scheint tatsächlich einen Fehler im ZDF-Crawler, wenn beim Laden einer URL eine Exception auftritt. Deshalb waren 0 Filme für ZDF aufgeführt. Es könnte sein, dass die Anpassung von @Nicklas2751 das Problem schon behebt, muss ich noch testen.

pidoubleyou commented 7 years ago

Ich habe den Crawler robuster gemacht, so dass alle Einträge, für die die URLs erfolgreich gelesen werden konnte, auch verarbeitet werden. Außerdem wird die Statistik geführt.