Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  10 1963
Jeg har en visualiseringsoppgave og trenger å skaffe en del data fra VG sine nettsider, nærmere bestemt kommentarer på nyhetsartikkler.

Metoden jeg ønsker å bruke er å lage et script som går inn på alle artikklene til vg og henter ut dataen.

f.eks.

Kode

https://graph.facebook.com/comments/?ids=http://www.vg.no/nyheter/innenriks/artikkel.php?artid=*
hvor “*” = heltall fra 1 til 12000000

Og deretter henter ut alt mellom ""message”:”og " "can_remove”:”

f.eks. fra:

Kode

https://graph.facebook.com/comments/?ids=http://www.vg.no/nyheter/innenriks/artikkel.php?artid=10127343
"\"Martin Kolberg (Ap): - Skaper mistanke om usunne nettverk\"\nStein, m\u00f8t glasshus...\nHvor lenge siden var det ikke Kolberg fors\u00f8kte \u00e5 fikse fordeler for familiemedlemmer ved \u00e5 true med \"Vet du virkelig ikke hvem jeg er?\”",
Vis hele sitatet...

+

alt mellom "created_time”: og "like_count”:"

"2013-10-22T19:17:32+0000”,
Vis hele sitatet...
Finnes det script som kan gjøre en slik oppgave allerede? Alternativt, finnes det nettside rippere som kan laste ned alle dokumenter fra artid=1 til artid=12000000?

På forhånd takk.

[EDIT:] VgG faktisk... jaja... :/
Sist endret av Turbolego; 24. oktober 2013 kl. 00:23.
Er standard JSON, så burde være kjapt å lage noe som går gjennom og parser det.
googlejunkie
Turbolego's Avatar
Trådstarter
Sitat av pinkrabbitz Vis innlegg
Er standard JSON, så burde være kjapt å lage noe som går gjennom og parser det.
Vis hele sitatet...
Scweet!

Da har jeg kommet i gang og laget en PHP kode som parser kommentarene og tidspunktene de er laget...

Kode:

Kode

<?php 

$url = 'http://www.vg.no/nyheter/innenriks/artikkel.php?artid=10127343';
$html = file_get_contents('https://graph.facebook.com/comments/?ids='.$url);
$json_data = json_decode($html);
$object_array = $json_data->{$url}->{'comments'}->{'data'};

foreach ($object_array as $data)
{

echo "Tid: ".$data->created_time."<br />Message: ".$data->message."<hr 

/>";
}


    ?>
Testside: http://turbolego.com/fb.parse.php

Nå må jeg bare finne en måte å parse alle artiklene fra vg... dvs. ?artid=1 til ?artid=12000000

Er det anbefalt å bruke php til det? :P
Du vet jo base-adressa i steksten til det du vil hente ut. Du kan jo bare lage deg en enkel regexp for å hente ut id-fra linkene. Mer eller mindre standard strengbehandling dette.
Sist endret av m0b; 24. oktober 2013 kl. 01:08.
googlejunkie
Turbolego's Avatar
Trådstarter
[EDIT:] Tror det skal være mulig å lage en while loop som går fra ?artid=1 til ?artid=12000000 og lagrer ".$data->created_time." og ".$data->message." i en sql database...

Er det en god idé?

Sitat av |d13m0b Vis innlegg
Du vet jo base-adressa i steksten til det du vil hente ut. Du kan jo bare lage deg en enkel regexp for å hente ut id-fra linkene. Mer eller mindre standard strengbehandling dette.
Vis hele sitatet...
Behøver jeg det da?

kan jeg ikke bare sette en while loop fra 1 til 12000000 og parse hver artikkel?

De artikklene uten kommentarer ignorer den jo uansett?

Tenkte noe sånt (kladd):

Kode

$i = 1;
while ($i <= 12000000):
    $url = 'http://www.vg.no/nyheter/innenriks/artikkel.php?artid='.$i;
$html = file_get_contents('https://graph.facebook.com/comments/?ids='.$url);
$json_data = json_decode($html);
$object_array = $json_data->{$url}->{'comments'}->{'data'};

foreach ($object_array as $data)
{

echo "Tid: ".$data->created_time."<br />Message: ".$data->message."<hr 

/>";
}
    $i++;
endwhile;
[EDIT:]

Lol, ser ut som den kræsja litt da jeg testa koden over her, men denne koden funker!

Kode

$i = 10127343;
while ($i <= 10127350):
    $url = 'http://www.vg.no/nyheter/innenriks/artikkel.php?artid='.$i;
$html = file_get_contents('https://graph.facebook.com/comments/?ids='.$url);
$json_data = json_decode($html);
$object_array = $json_data->{$url}->{'comments'}->{'data'};

foreach ($object_array as $data)
{

echo "Tid: ".$data->created_time."<br />Message: ".$data->message."<hr 

/>";
}
    $i++;
endwhile;
Den går bare fra artikklene 10127343 til 10127350 (7 artikkler) hvorav det bare er artikkelen 10127343 og 10127347 som har kommentarer.

Kommentarene fra begge er samlet her: http://turbolego.com/fb.parse.php

Så... koden min funker... men den ser ut til å slite dersom jeg velger for mange artikkler jeg vil parse...

Tips?
Jeg misforsto og trodde du skulle videre og hente med data basert på informasjon som ble hentet. Men joda, en loop ev noe slag vil absolutt hjelpe på.
googlejunkie
Turbolego's Avatar
Trådstarter
Sitat av |d13m0b Vis innlegg
Jeg misforsto og trodde du skulle videre og hente med data basert på informasjon som ble hentet. Men joda, en loop ev noe slag vil absolutt hjelpe på.
Vis hele sitatet...
already done, men om jeg velger intervall fra 1 til 12000000 får jeg bare en blank skjerm (kanskje for mye å tenke på? )

intervall fra 10127343 til 10127350 (7 artikkler) funker fett, så kanskje legge inn en pause mellom hver 10'de parsing elns. for å ikke spamme vg?

skal sjekke hvor mange artikkler jeg får lov til å parse om gangen... brb

[EDIT:] Da har jeg testa litt, den klarer å parse artikklene fra 10127320 til 10127350 (30 artikkler), noe mer enn det på én gang gjør bare at skjerm går i hvitt.

Den brukte ca. 30 sekunder på dette (1 sekund per artikkel).

Det tar litt for lang tid...

Tror jeg trenger en liste med artikkel-id'er som er gyldige (som ikke går til http://www.vg.no/404 ) som jeg kan parse fra... eventuelt en liste med artikkel-id'er som har kommentarfelt aktivert...

hm... kanskje jeg burde finne ut når vg begynte med kommentarfelter på nettsidene sine... bruke den id'en som utgangspunkt.
Sitat av Turbolego Vis innlegg
already done, men om jeg velger intervall fra 1 til 12000000 får jeg bare en blank skjerm (kanskje for mye å tenke på? )

intervall fra 10127343 til 10127350 (7 artikkler) funker fett, så kanskje legge inn en pause mellom hver 10'de parsing elns. for å ikke spamme vg?

skal sjekke hvor mange artikkler jeg får lov til å parse om gangen... brb

[EDIT:] Da har jeg testa litt, den klarer å parse artikklene fra 10127320 til 10127350 (30 artikkler), noe mer enn det på én gang gjør bare at skjerm går i hvitt.

Den brukte ca. 30 sekunder på dette (1 sekund per artikkel).

Det tar litt for lang tid...

Tror jeg trenger en liste med artikkel-id'er som er gyldige (som ikke går til http://www.vg.no/404 ) som jeg kan parse fra... eventuelt en liste med artikkel-id'er som har kommentarfelt aktivert...

hm... kanskje jeg burde finne ut når vg begynte med kommentarfelter på nettsidene sine... bruke den id'en som utgangspunkt.
Vis hele sitatet...
Problemet ditt er vel at du får en timeout i PHP vil jeg tro. For du trigger vel scriptet ditt ved å gå til fila i nettleseren?

Hadde du kunne kjørt scriptet via terminal kunne det tatt alle 12 millionene++
already done, men om jeg velger intervall fra 1 til 12000000 får jeg bare en blank skjerm (kanskje for mye å tenke på? )
Vis hele sitatet...
Ja en while loop fra 1 til 12000000 er noe som nesten garantert vil feile.
intervall fra 10127343 til 10127350 (7 artikkler) funker fett, så kanskje legge inn en pause mellom hver 10'de parsing elns. for å ikke spamme vg?
Vis hele sitatet...
Ja man bør tenke seg om når man skal parse så mye,og heller skrive kode som tar det gradvis.
Den brukte ca. 30 sekunder på dette (1 sekund per artikkel).

Det tar litt for lang tid...
Vis hele sitatet...
Tenk på at dette er parsing fra en nettside du driver med og ikke kjøre tall i en loop.
Tiden er helt grei.

En Python test av det samme(7 artikkler).
Får "created_time" på 2 av dem som stemmer.

Kode

import requests

for i in range(43,51):
    try:
        r = requests.get('https://graph.facebook.com/comments/?ids=http://www.vg.no/nyheter/innenriks/artikkel.php?artid=101273{}'.format(i))
        for i,content in enumerate(r.json()[r.url.split('s=')[-1]]['comments']['data']):
            print content['created_time'],i
    except TypeError:
        pass
finnes det nettside rippere som kan laste ned alle dokumenter fra artid=1 til artid=12000000?
Vis hele sitatet...
Jeg hadde nok ikke skrevet det som over her,selv om json ouput er greit og jobbe med.
Hadde nok bruk Scrapy til dette og output til json av kun data man vil ha.
For PHP som jeg ikke bruker så mye,kan du jo søke etter "Web crawler" eller "Web spider".
Sist endret av snippsat; 26. oktober 2013 kl. 02:25.
VG.no: Facebook erfarer for tiden tekniske problemer med sitt kommentarsystem. Det er derfor ikke mulig å legge inn en kommentar for øyeblikket.
Vis hele sitatet...
Holdt på for lenge nå, eller?
Sist endret av Maol33t; 26. oktober 2013 kl. 10:19.
Turbolego, kan du filtrere ut "jensemann", "nazi", og "kommunist", og nevne hvor mange ganger dette blir nevnt?

Om du får det til, vel og merke. Hadde vært morsomt, hehe.