abonnement Unibet Coolblue Bitvavo
  vrijdag 21 oktober 2011 @ 18:27:45 #276
218617 YazooW
bel de wouten!
pi_103382629
Een database kopiëren/opslaan van een andere site gaat natuurlijk niet zomaar, wel kan je op de meeste sites zelf door logisch na te denken erachter komen wat de datastructuur is. Als je kan benoemen op welke positie bepaalde informatie staat en dit opslaat kun je zeer dicht bij een kopie van de daadwerkelijke database komen. Ik heb het hierbij trouwens puur en alleen over content die publiekelijk toegankelijk is.

Ik ben op zoek naar meer informatie hierover, ben zelf wel een aantal dingen tegen gekomen maar ik kom er nog niet uit. Hoop hier eigenlijk ook mensen te vinden die datgene wat ik wil al een keer eerder succesvol heeft gedaan en mij kan vertellen hoe hij/zij dat dan heeft gedaan.

Om een simpel voorbeeld te geven van wat ik wil:
Stel je deze site voor:

- 1 pagina die een lijst met hyperlinks bevat: appels, peren, bananen, kiwi's etc
- En dan meerdere pagina's met daarop informatie over de hyperlink waarop je geklikt hebt.
Als voorbeeld een pagina "Appels".
Pagina appels bevat de volgende inhoud:

1
2
3
4
5
appel
water : 85,56 g    
vezel : 2,4 g    
energie : 218 kJ (52 kcal)
suikers : 10,39 g

Elke "fruitpagina" zit hetzelfde in elkaar, ze bevatten de velden water, vezel, energie en suikers, alleen de waarde verschilt steeds per pagina/fruit. Nu wil ik deze data automatisch opslaan, dus dat ik niet 1 voor 1 die links moet gaan open klikken etc etc. Vervolgens alles opslaan in een tekstbestandje of automatisch naar mijn eigen database schrijven? Ik ken de mogelijkheden simpelweg niet. Ik hoop dat er hier iemand is die mij misschien een beetje op weg kan helpen.

Voorbeeld hierboven is trouwens wel super simpel, site waarvan ik de data wil gaan opslaan bevat duizenden verschillende pagina's, vandaar dat ik het dus geautomatiseerd wil gaan doen. Content op die site is trouwens vrij te gebruiken, is geen materiaal waarop copyright rust o.i.d.
  vrijdag 21 oktober 2011 @ 18:37:46 #277
91039 mstx
2x1/2 = 1/2 x 1/2
pi_103382966
quote:
0s.gif Op vrijdag 21 oktober 2011 18:27 schreef YazooW het volgende:
- 1 pagina die een lijst met hyperlinks bevat: appels, peren, bananen, kiwi's etc
- En dan meerdere pagina's met daarop informatie over de hyperlink waarop je geklikt hebt.
Als voorbeeld een pagina "Appels".
Pagina appels bevat de volgende inhoud:
[ code verwijderd ]

Elke "fruitpagina" zit hetzelfde in elkaar, ze bevatten de velden water, vezel, energie en suikers, alleen de waarde verschilt steeds per pagina/fruit. Nu wil ik deze data automatisch opslaan, dus dat ik niet 1 voor 1 die links moet gaan open klikken etc etc. Vervolgens alles opslaan in een tekstbestandje of automatisch naar mijn eigen database schrijven? Ik ken de mogelijkheden simpelweg niet. Ik hoop dat er hier iemand is die mij misschien een beetje op weg kan helpen.
- Pagina ophalen met file_get_contents() (of CURL oid, of direct met de DOM parser)
- Inhoud parsen met een DOM parser.
- Via het DOM de <a> tags selecteren die je wilt hebben
- Door de <a> tags loopen en elke href ophalen met file_get_contents()
- Alle pagina's weer parsen met de DOM parser
- Via het DOM de tabel uitlezen en de data opslaan

En bij duizenden linkjes zou ik het niet allemaal meteen achter elkaar doen maar er een interval tussen zetten.
Op donderdag 2 juli 2009 22:41 schreef RTB het volgende:
als ik elk rap"liedje" een kans moest geven was ik aan het eind van dit millennium nog bezig met het tempo waarin die kotshoop uitgebraakt wordt.
👾
  vrijdag 21 oktober 2011 @ 18:51:05 #278
218617 YazooW
bel de wouten!
pi_103383423
quote:
0s.gif Op vrijdag 21 oktober 2011 18:37 schreef mstx het volgende:

[..]

- Pagina ophalen met file_get_contents() (of CURL oid, of direct met de DOM parser)
- Inhoud parsen met een DOM parser.
- Via het DOM de <a> tags selecteren die je wilt hebben
- Door de <a> tags loopen en elke href ophalen met file_get_contents()
- Alle pagina's weer parsen met de DOM parser
- Via het DOM de tabel uitlezen en de data opslaan

En bij duizenden linkjes zou ik het niet allemaal meteen achter elkaar doen maar er een interval tussen zetten.
Dus om het even te vertalen naar mijn voorbeeld.
file_get_contents laat ik los op de hyperlinks pagina waarna ik vervolgens door middel van DOM de data uit die pagina trek die ik nodig heb. En dan vervolgens kan ik met de data die ik heb verkregen uit mijn hyperlinkspagina het proces weer herhalen maar dan in een loop omdat het meerdere pagina's zijn.

Thanks voor je hulp! Dat DOM ziet er wel super relaxt uit. Kwam zelf niet verder dan macro tooltjes :') Oplossing in PHP is natuurlijk veel makkelijker want de data die ik nu zo ophaal kan ik natuurlijk ook weer makkelijk rechtsstreeks schrijven naar mijn eigen database in plaats van te kutten met tekst bestandjes.
  zondag 23 oktober 2011 @ 15:32:15 #279
218617 YazooW
bel de wouten!
pi_103455336
Zit een beetje te testen met die simplehtmldom, PHP is niet helemaal mijn ding maar begin het toch aardig te snappen. Nu wil ik de inhoud van alle dd tags extracten, de site bevat 11 dd's, en het script hieronder returnt ook 11 dd's, alleen returnt hij ze alle 11 als "Array". Wat doe ik hier fout?

1
2
3
4
5
6
$html = file_get_html($url);
 
$ret = $html->find('dd');
 
foreach($ret as $all)
    echo $all->find('dd') . "<br>";
pi_103456838
quote:
0s.gif Op zondag 23 oktober 2011 15:32 schreef YazooW het volgende:
Zit een beetje te testen met die simplehtmldom, PHP is niet helemaal mijn ding maar begin het toch aardig te snappen. Nu wil ik de inhoud van alle dd tags extracten, de site bevat 11 dd's, en het script hieronder returnt ook 11 dd's, alleen returnt hij ze alle 11 als "Array". Wat doe ik hier fout?
[ code verwijderd ]

Wat staat er in de array's? Je kunt ze printen dmv print_r.

1
2
foreach($ret as $all)
    print_r($all->find('dd'));
  zondag 23 oktober 2011 @ 16:11:43 #281
218617 YazooW
bel de wouten!
pi_103457008
quote:
0s.gif Op zondag 23 oktober 2011 16:07 schreef The_Terminator het volgende:

[..]

Wat staat er in de array's? Je kunt ze printen dmv print_r.
[ code verwijderd ]

Snap eerlijk gezegd niet waarom het script opeens 11x Array tevoorschijn tovert.
Met jou stukje code is dit nu mijn output:
quote:
Array ( ) Array ( ) Array ( ) Array ( ) Array ( ) Array ( ) Array ( ) Array ( ) Array ( ) Array ( ) Array ( )
Terwijl de inhoud van de DD's bestaat uit: Naam, Leeftijd, Lengte, etc etc.
pi_103457128
quote:
0s.gif Op zondag 23 oktober 2011 16:11 schreef YazooW het volgende:

[..]

Snap eerlijk gezegd niet waarom het script opeens 11x Array tevoorschijn tovert.
Met jou stukje code is dit nu mijn output:

[..]

Terwijl de inhoud van de DD's bestaat uit: Naam, Leeftijd, Lengte, etc etc.
De array's zijn leeg...

Doe eens:

1
2
3
4
5
$html = file_get_html($url);
 
$ret = $html->find('dd');

var_dump($ret);

En post de output.
  zondag 23 oktober 2011 @ 16:21:57 #283
218617 YazooW
bel de wouten!
pi_103457461
In Chrome laadt hij een tijdje waarna Chrome vervolgens een fout geeft, geen output dus.
In Firefox:
quote:
array(11) { [0]=> object(simple_html_dom_node)#1644 (9) { ["nodetype"]=> int(1) ["tag"]=> string(2) "dd" ["attr"]=> array(0) { } ["children"]=> array(0) { } ["nodes"]=> array(1) { [0]=> object(simple_html_dom_node)#1645 (9) { ["nodetype"]=> int(3) ["tag"]=> string(4) "text" ["attr"]=> array(0) { } ["children"]=> array(0) { } ["nodes"]=> array(0) { } ["parent"]=> *RECURSION* ["_"]=> array(1) { [4]=> string(4) "John" } ["tag_start"]=> int(0) ["dom":"simple_html_dom_node":private]=>
Dit is slechts een klein gedeelte van de gehele output, hij blijft maar doorgaan met dit soort code op het scherm te toveren totdat er zoveel op staat dat mijn Firefox crasht.
pi_103458099
quote:
0s.gif Op zondag 23 oktober 2011 16:21 schreef YazooW het volgende:
In Chrome laadt hij een tijdje waarna Chrome vervolgens een fout geeft, geen output dus.
In Firefox:

[..]

Dit is slechts een klein gedeelte van de gehele output, hij blijft maar doorgaan met dit soort code op het scherm te toveren totdat er zoveel op staat dat mijn Firefox crasht.
Heb je de code die ik heb gepost onder de foreach geplaatst? Dat is namelijk niet de bedoeling :P

Maargoed, probeer dit eens (als vervanging voor jouw code, niet eronder plaatsen...):
1
2
3
4
$html = file_get_html($url);
 
foreach($html->find('dd') as $all)
    echo $all->innertext . '<br>';
  zondag 23 oktober 2011 @ 16:43:03 #285
218617 YazooW
bel de wouten!
pi_103458288
quote:
0s.gif Op zondag 23 oktober 2011 16:37 schreef The_Terminator het volgende:

[..]

Heb je de code die ik heb gepost onder de foreach geplaatst? Dat is namelijk niet de bedoeling :P

Maargoed, probeer dit eens (als vervanging voor jouw code, niet eronder plaatsen...):
[ code verwijderd ]

Nee had die foreach vervangen door jou stukje code, niet eronder geplaatst.
Maar nu met die "innertext" werkt die wel! Hartelijk bedankt!

Nu ga ik kijken hoe ik het script zo kan krijgen dat hij dit proces 100x ofzo achter elkaar herhaalt op 100 verschillende pagina's, pagina's hebben allemaal dezelfde indeling.
  zondag 23 oktober 2011 @ 17:43:48 #286
218617 YazooW
bel de wouten!
pi_103460650
Ik zit alweer vast :{

Ik heb nu de volgende 2 stukjes code:

getPlayerUrl.php , trekt het pad van de url uit een tabel en returnt vervolgens een lijst met urlpaths onder elkaar.
1
2
3
4
5
$html = file_get_html($url);
 
foreach($html->find('table#page_player_1_block_player_squad_1-table td[class="name large-link"] a[href]') as $all)

    echo $all->getAttribute('href') . '<br>';

getPlayerInfo.php , extract alle info van een speler en zet dit netjes onder elkaar.
1
2
3
4
$html = file_get_html($url);
 
foreach($html->find('dd') as $all)
    echo $all->innertext . '<br>';

Dmv het eerste stukje code haal ik dus de url op, het tweede stukje code moet dan weer verder gaan werken op de url die geextract is uit code 1. Dus stel dat mijn output bij de eerste code 20 urls bevat dan moet het tweede stukje code dus 20x uitgevoerd worden op die 20 verschillende url's. Hoe ga ik dit aanpakken?
pi_103461451
Kun je niet gewoon je eerste resultaten in een array zetten? Daar kun je dan met gemak doorheen lopen.
  zondag 23 oktober 2011 @ 20:08:26 #288
37634 wobbel
Da WoBBeL King
pi_103466980
Ik zit ook vast :P ik ben echt een held met reguliere expressies :')

Ik wil [faq=3362] vervangen door <a href="#3362">FAQ #3362</a> :P
  zondag 23 oktober 2011 @ 20:14:44 #289
75592 GlowMouse
l'état, c'est moi
pi_103467361
quote:
0s.gif Op zondag 23 oktober 2011 20:08 schreef wobbel het volgende:
Ik zit ook vast :P ik ben echt een held met reguliere expressies :')

Ik wil [faq=3362] vervangen door <a href="#3362">FAQ #3362</a> :P
zoiets? preg_replace("/\\[faq=(\\d)+\\]/", '<a href="#\\1">FAQ #\\1</a>', $str);
eee7a201261dfdad9fdfe74277d27e68890cf0a220f41425870f2ca26e0521b0
pi_103467940
quote:
0s.gif Op zondag 23 oktober 2011 20:08 schreef wobbel het volgende:
Ik zit ook vast :P ik ben echt een held met reguliere expressies :')

Ik wil [faq=3362] vervangen door <a href="#3362">FAQ #3362</a> :P
Er bestaat zoiets in regex als looking forward waarmee je in één patroon het volgende kan doen.

[faq=123] => <a href="#123">FAQ# 123</a>
[faq=123]Titel van een bepaalde FAQ[/faq] => <a href="#123">Titel van een bepaalde FAQ</a>

Ik zat even te zoeken naar een mooi voorbeeld, maar het is zeker de moeite waard om eens naar te kijken.
  zondag 23 oktober 2011 @ 22:54:26 #291
37634 wobbel
Da WoBBeL King
pi_103479065
@GloeiMuis...ty :)

@Pakspul
Zou ik waarderen, iets meer info erbij zou ook niet verkeerd zijn :P
pi_103484494
1
2
3
4
5
6
7
SELECT properties.data 
FROM belongs
LEFT JOIN properties
    ON (belongs.userid = properties.userid) 
        AND (properties.title = `name`)
WHERE
    (belongs.groupid = `1`)

Kan dit? de AND?
De bedoeling is dat ik alle namen krijg van users uit groep 1

belongs:
1
2
3
4
5
userid | groupid
1      | 1
2      | 1
3      | 1
2      | 2
properties:
1
2
3
4
5
userid | title | data
1      | name  | piet
2      | name  | jan
1      | adres | hoofdstraat 21
3      | name  | henk
  maandag 24 oktober 2011 @ 01:38:33 #293
75592 GlowMouse
l'état, c'est moi
pi_103484896
Dat kan, maar waarom een LEFT JOIN?
eee7a201261dfdad9fdfe74277d27e68890cf0a220f41425870f2ca26e0521b0
pi_103485339
Honestly? Omdat ik totaal niet nagedacht heb over watvoor join het handigst is.

-edit- kan hier natuurlijk een inner join gebruiken, ik hoef geen leeg record terug als een naam ontbreekt (wat theoretisch zelfs onmogelijk is maar je weet maar nooit).
Maar aan de query verandert dat verder niets toch?

[ Bericht 31% gewijzigd door KomtTijd... op 24-10-2011 02:21:25 ]
  maandag 24 oktober 2011 @ 08:12:16 #295
137776 boem-dikkie
Jedi Mind Baby!
pi_103486548
Waarom gebruik je eigenlijk twee tabellen hiervoor?
Ik weet niks van Hindoes. Wel van Samoerai en andere dingen.
pi_103486739
quote:
11s.gif Op maandag 24 oktober 2011 08:12 schreef boem-dikkie het volgende:
Waarom gebruik je eigenlijk twee tabellen hiervoor?
Waarschijnlijk omdat zijn properties variabel zijn. Hoe wil je dit formuleren in 1 tabel?
Het ruikt hier overigens naar NoSQL, maar ik neem gemakshalve maar even aan dat dat geen optie is.
pi_103486920
quote:
0s.gif Op zondag 23 oktober 2011 22:54 schreef wobbel het volgende:
@GloeiMuis...ty :)

@Pakspul
Zou ik waarderen, iets meer info erbij zou ook niet verkeerd zijn :P
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php 

    $input 
"tekst [faq=123] en dan nog een tekst met een andere tag [faq=123]test[/faq] tekst achteraf";

    
// tags [faq=123] omzetten naar [faq=123]123[/faq], met [faq=123]test[/faq] wordt niet gedaan.    
    
$temp preg_replace('/\[faq=([^\]]+)](?![^\[]+\[\/faq\])/is''[faq=\1]\1[/faq]'$input);
    
    
// alle [faq=123]tekst[/faq] omzetten naar HTML code
    
$output preg_replace("#\[faq=(.*?)\](.*?)\[/faq\]#si"'<a href="#\\1">FAQ #\\2</a>'$temp);
    
    echo 
$input// laat input zien
    
echo "<hr>";
    echo 
$temp// laat tussen stap zien
    
echo "<hr>";
    echo 
htmlentities($output); // laat output zien
    
?>

Niet in één preg_replace, maar ik denk dat je de oplossing niet verkeerd zal vinden.
pi_103486945
quote:
0s.gif Op maandag 24 oktober 2011 08:36 schreef Intrepidity het volgende:

[..]

Waarschijnlijk omdat zijn properties variabel zijn. Hoe wil je dit formuleren in 1 tabel?
Het ruikt hier overigens naar NoSQL, maar ik neem gemakshalve maar even aan dat dat geen optie is.
Per groep een tabel aanmaken en deze dynamisch met code gaan beinvloeden. Ik moest een keer zo'n oplossing maken aangezien meneer heilig overtuigd was van dat dat de beste mogelijkheid was. Wat is hij later op zijn bek gegaan :')
  maandag 24 oktober 2011 @ 10:50:08 #299
75592 GlowMouse
l'état, c'est moi
pi_103489290
quote:
10s.gif Op maandag 24 oktober 2011 02:14 schreef KomtTijd... het volgende:
-edit- kan hier natuurlijk een inner join gebruiken, ik hoef geen leeg record terug als een naam ontbreekt (wat theoretisch zelfs onmogelijk is maar je weet maar nooit).
Maar aan de query verandert dat verder niets toch?
Bij een inner join maakt het niet uit of je iets in de ON of in de WHERE-clause zet.
eee7a201261dfdad9fdfe74277d27e68890cf0a220f41425870f2ca26e0521b0
pi_103490831
quote:
11s.gif Op maandag 24 oktober 2011 08:12 schreef boem-dikkie het volgende:
Waarom gebruik je eigenlijk twee tabellen hiervoor?
Hoe zie je dat voor je :? Niet dat het uberhaupt mogelijk is aangezien ik dan een module die ik zelf niet onderhoud moet gaan hacken met alle nadelen van dien, maar ik zou niet zo snel zien hoe je dit in één tabel zou kunnen combineren. Tenzij je alle informatie van de gebruikers in de users-tabel gaat frotten met bitfields enzo.

quote:
0s.gif Op maandag 24 oktober 2011 08:36 schreef Intrepidity het volgende:

[..]

Waarschijnlijk omdat zijn properties variabel zijn. Hoe wil je dit formuleren in 1 tabel?
Het ruikt hier overigens naar NoSQL, maar ik neem gemakshalve maar even aan dat dat geen optie is.
Ik heb keuze uit MySQL of MySQL dus nee idd, maar NoSQL is toch juist voor als je heul geen moeilijke joins enzo nodig hebt?
En ja de properties kunnen vanalles zijn, van namen en adressen tot de avatar en signature.
quote:
0s.gif Op maandag 24 oktober 2011 10:50 schreef GlowMouse het volgende:

[..]

Bij een inner join maakt het niet uit of je iets in de ON of in de WHERE-clause zet.
Kijk da's dan wel weer handig.
abonnement Unibet Coolblue Bitvavo
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')