Pereiti prie turinio

Web scrapping naudojant PHP


Rekomenduojami pranešimai

Dar galima panaudoti grynai tokį griežtą metodą:

	function explode2($start, $end, $source) {
	$part = explode($start, $source);
	for ($i = 0; $i <= count($part); $i++)  {
		$part_1 = explode($end, $part[$i]);
		$output[] = $part_1[0];
	}
	return $output;
}

Ši funkcija gera tuo, kad greičiausiai rašosi skriptas, mažiausiai galvoti reik, manau tiktų naujokam web scrapinime, nereik jokių DOM, Regexp, tiesiog pažiūri source kodą, surandi vietą kurios tau reik, pasižiūri koks kodas yra prieš ją ir po, viskas, sumes į masyvą visus pradžią ir galą atitinkančius rezultatus ;D Na dėl greičio tai žinoma, tavo paminėti metodai galbūt greitesni, bet jei reik ištraukt nedaug informacijos, to skirtumo net nepajusi, bet viską atliksi daug greičiau.

Na ir va pavyzdukas panaudojimo:

<?php
$src = curl('http://uzdarbis.lt/t173550/web-scrapping-naudojant-php/');
$block = explode2('<!-- ACTIVE USERS -->','<!-- Close topic -->',$src); // Izoliuojam source kodo bloką, kad išvengt neteisingų rezultatų
$users = explode2('<li>','</li>',$block[1]);
for ($i = 1; $i <= count($users); $i++)  { 
echo strip_tags($users[$i]).'<br>';
}
?>

Šis skriptukas parašo visus narius, kurie šiuo metu skaito šią temą. Savo paraše šį būdą ir naudoju, ir kaip matote paveiksliuko užkrovimas paraše neužima daug laiko :)

Redagavo Saulius.
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Dar galima panaudoti grynai tokį griežtą metodą:

	function explode2($start, $end, $source) {
	$part = explode($start, $source);
	for ($i = 0; $i <= count($part); $i++)  {
		$part_1 = explode($end, $part[$i]);
		$output[] = $part_1[0];
	}
	return $output;
}

Ši funkcija gera tuo, kad greičiausiai rašosi skriptas, mažiausiai galvoti reik, manau tiktų naujokam web scrapinime, nereik jokių DOM, Regexp, tiesiog pažiūri source kodą, surandi vietą kurios tau reik, pasižiūri koks kodas yra prieš ją ir po, viskas, sumes į masyvą visus pradžią ir galą atitinkančius rezultatus ;D Na dėl greičio tai žinoma, tavo paminėti metodai galbūt greitesni, bet jei reik ištraukt nedaug informacijos, to skirtumo net nepajusi, bet viską atliksi daug greičiau.

Na ir va pavyzdukas panaudojimo:

<?php
$src = curl('http://uzdarbis.lt/t173550/web-scrapping-naudojant-php/');
$block = explode2('<!-- ACTIVE USERS -->','<!-- Close topic -->',$src); // Izoliuojam source kodo bloką, kad išvengt neteisingų rezultatų
$users = explode2('<li>','</li>',$block[1]);
for ($i = 1; $i <= count($users); $i++)  { 
echo strip_tags($users[$i]).'<br>';
}
?>

Šis skriptukas parašo visus narius, kurie šiuo metu skaito šią temą. Savo paraše šį būdą ir naudoju, ir kaip matote paveiksliuko užkrovimas paraše neužima daug laiko :)

 

Jega taip ir parasa pasidariai ? :D

 

Ar imanoma padaryt kažka panašaus į atvira Linkomanijos prieiga naudojant viena akaunta ? Idėja gal...

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Jega taip ir parasa pasidariai ? :D

 

Ar imanoma padaryt kažka panašaus į atvira Linkomanijos prieiga naudojant viena akaunta ? Idėja gal...

Viskas įmanoma :) Prisijungimas prie linkomanijos tikrai problemų nesudarytų, tam puikiai tinka curl. Žodžiu, daug nesąmonių galima prisigalvot :)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

       $urls[] = 'http://www.atpworldtour.com/Rankings/Singles.aspx?d='.$date.'&c=&r=1';
       $urls[] = 'http://www.atpworldtour.com/Rankings/Singles.aspx?d='.$date.'&c=&r=101';
       $urls[] = 'http://www.atpworldtour.com/Rankings/Singles.aspx?d='.$date.'&c=&r=201';
       $urls[] = 'http://www.atpworldtour.com/Rankings/Singles.aspx?d='.$date.'&c=&r=301';
       $urls[] = 'http://www.atpworldtour.com/Rankings/Singles.aspx?d='.$date.'&c=&r=401';
       $urls[] = 'http://www.atpworldtour.com/Rankings/Singles.aspx?d='.$date.'&c=&r=501';
       $urls[] = 'http://www.atpworldtour.com/Rankings/Singles.aspx?d='.$date.'&c=&r=601';
       $urls[] = 'http://www.atpworldtour.com/Rankings/Singles.aspx?d='.$date.'&c=&r=701';
       $urls[] = 'http://www.atpworldtour.com/Rankings/Singles.aspx?d='.$date.'&c=&r=801';
       $urls[] = 'http://www.atpworldtour.com/Rankings/Singles.aspx?d='.$date.'&c=&r=901';

 

Taip niekas nedaro...

 

$count = 10;
for ($i = 0; $i < $count; ++$i) {
$urls[] = 'http://www.atpworldtour.com/Rankings/Singles.aspx?d='.$date.'&c=&r='.(($i==0)?('1'):($i.'01'));
}

Nuoroda į pranešimą
Dalintis kituose puslapiuose
  • Administratoriai

...

Štai dar vienas pavyzdys, kuriame gauname filmo reitingą iš imdb.com:

<?php
//simple html dom biblioteka
include('simple_html_dom.php')

//filmo url
$url = 'http://www.imdb.com/title/tt0485947/';

//gauname svetainės html
$html = file_get_html($url);

//gauname filmo reitingą
$ratio = $html->find('span.rating-rating', 0)->plaintext;

echo $ratio;
?>

...

 

jei jau kabinėtis, tai kabletaškį pamiršai, kur includini.

Aš asmeniškai labiau linkęs naudoti regexp variantą... :unsure:

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Jei prasta captcha, galima nu'OCR'int, jei gera - neįveiksi :)

OCR nėra 100% tikslus metodas, be to ir sudėtingas :) Na tarkim noriu kad mano skripte būtų atvaizduota captcha iš to saito prie kurio noriu prisijungti ir ją įvesčiau į input laukelį. Kaip tai padaryti? Žinau, kad įmanoma, esu matęs, tik neteko pačiam susidurt :) Problema ta, kad reikia daryti dvi užklausas, pirma - išgaut captchą, antra- submitint, ir žinoma todėl nebeveikia, nepadeda net taspats curl cookių failas kur saugoma pirmo užkrovimo sesija.

Redagavo Saulius.
Nuoroda į pranešimą
Dalintis kituose puslapiuose

OCR nėra 100% tikslus metodas, be to ir sudėtingas :) Na tarkim noriu kad mano skripte būtų atvaizduota captcha iš to saito prie kurio noriu prisijungti ir ją įvesčiau į input laukelį. Kaip tai padaryti? Žinau, kad įmanoma :)

Kaip sakiau, jei labai (pa)prasta - tik tada įmanoma normaliai OCR padaryt :)

 

Dėl tavo klausimo: gauni prisijungimo tinklalapį, naršyklei išvedi tą paveikslėlį (išsitraukęs jo URL straipsnyje nurodytais metodais) + <input> įvedimui, spaudi „submit", tada skripto „antroji dalis" prisijungia prie tinklalapio. :)

 

EDIT: Na, iš to, ką pasakei, tikrai nežinau, kodėl neveikia. Parodyk tą tinklalapį, jei gali? :)

Redagavo Silke
Nuoroda į pranešimą
Dalintis kituose puslapiuose

O jeigu, kad išgauti informacija iš norimo puslapio reikia prisijungti prie tinklapio įvedant captcha. Ką tada daryt?

Jei CAPTCHA visąlaik to paties šrifto (ženklai nusulieti vienas su kitu) ir ženklų spalva visada ta pati, tai tikrai nesunku (stebėtina, kiek daug tokių CAPTCHA yra).

 

Buvau įdėjęs savo darbo screenshot čia: http://uzdarbis.lt/t...dpost/p/1535671 - turbūt galima pagauti idėją.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Jei CAPTCHA visąlaik to paties šrifto (ženklai nusulieti vienas su kitu) ir ženklų spalva visada ta pati, tai tikrai nesunku (stebėtina, kiek daug tokių CAPTCHA yra).

 

Buvau įdėjęs savo darbo screenshot čia: http://uzdarbis.lt/t...dpost/p/1535671 - turbūt galima pagauti idėją.

captcha

Na tokią nemanau kad įmanoma įveikti :)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

       $urls[] = 'http://www.atpworldtour.com/Rankings/Singles.aspx?d='.$date.'&c=&r=1';
       $urls[] = 'http://www.atpworldtour.com/Rankings/Singles.aspx?d='.$date.'&c=&r=101';
       $urls[] = 'http://www.atpworldtour.com/Rankings/Singles.aspx?d='.$date.'&c=&r=201';
       $urls[] = 'http://www.atpworldtour.com/Rankings/Singles.aspx?d='.$date.'&c=&r=301';
       $urls[] = 'http://www.atpworldtour.com/Rankings/Singles.aspx?d='.$date.'&c=&r=401';
       $urls[] = 'http://www.atpworldtour.com/Rankings/Singles.aspx?d='.$date.'&c=&r=501';
       $urls[] = 'http://www.atpworldtour.com/Rankings/Singles.aspx?d='.$date.'&c=&r=601';
       $urls[] = 'http://www.atpworldtour.com/Rankings/Singles.aspx?d='.$date.'&c=&r=701';
       $urls[] = 'http://www.atpworldtour.com/Rankings/Singles.aspx?d='.$date.'&c=&r=801';
       $urls[] = 'http://www.atpworldtour.com/Rankings/Singles.aspx?d='.$date.'&c=&r=901';

 

Taip niekas nedaro...

 

$count = 10;
for ($i = 0; $i < $count; ++$i) {
$urls[] = 'http://www.atpworldtour.com/Rankings/Singles.aspx?d='.$date.'&c=&r='.(($i==0)?('1'):($i.'01'));
}

 

Och, geras pastebėjimas, bet darant tavo būdu, aš daryčiau taip :rolleyes: (taip, patikrinau ir viskas veikia):

 

$count = 9;
for ($i = 0; $i <= $count; ++$i) {
$urls[] = 'http://www.atpworldtour.com/Rankings/Singles.aspx?d='.$date.'&c=&r='.$i.'01';
}

 

jei jau kabinėtis, tai kabletaškį pamiršai, kur includini.

Aš asmeniškai labiau linkęs naudoti regexp variantą... :unsure:

Oi, netyčia pamečiau jį kažkur įklijuodamas kodą į forumą, nes pas mane script'e tai jis yra... :) O dėl to, kad labiau mėgsti regexp variantą, tai čia jau nuo kiekvieno skonio priklauso... ;)

 

Šiaip jau kiek žinau, ten yra CSS selektoriai, tiek, kad jQuery tokius pačius naudoja :)

Taip, tu teisus, bet kažkodėl rašant straipsnį man pirmiausia į galvą šovė, kad tai select'oriai "kaip pas jQuery" :)

 

o kaip dėl šitos captchos? :D

Ou, sadistiška registracija :D

Redagavo Lapinskis
Nuoroda į pranešimą
Dalintis kituose puslapiuose
  • po 2 savaičių...
  • po 4 mėnesių...

Puikus dalykas.. rašiau kodą pagal šį pavizdį :

<?php
       //simple html dom biblioteka
       include('simple_html_dom.php');

       //filmo url
       $url = 'http://www.imdb.com/title/tt0485947/';

       //gauname svetainės html
       $html = file_get_html($url);

       //gauname filmo reitingą
       $ratio = $html->find('span.rating-rating', 0)->plaintext;

       echo $ratio;
?>

Bet taip nutiko jog nežinojau ką daryti kuomet viename div'e buvo daug eilučių ir iš to div'o tereikėjo man paiimti tik keleta eilučių.

 

HTML:

1.<div id="divas">
2.<b>Reikia šios eilutės</b>
3.<a href="#">Nereikia šios eilutės</b>
4.<b>Nereikia šios eilutės</b>
5.<a href="#">Reikia šios eilutės</b>
6.</div>

 

Jai galit pateikit kodo pavizdį naudojant php.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Puikus dalykas.. rašiau kodą pagal šį pavizdį :

<?php
       //simple html dom biblioteka
       include('simple_html_dom.php');

       //filmo url
       $url = 'http://www.imdb.com/title/tt0485947/';

       //gauname svetainės html
       $html = file_get_html($url);

       //gauname filmo reitingą
       $ratio = $html->find('span.rating-rating', 0)->plaintext;

       echo $ratio;
?>

Bet taip nutiko jog nežinojau ką daryti kuomet viename div'e buvo daug eilučių ir iš to div'o tereikėjo man paiimti tik keleta eilučių.

 

HTML:

1.<div id="divas">
2.<b>Reikia šios eilutės</b>
3.<a href="#">Nereikia šios eilutės</b>
4.<b>Nereikia šios eilutės</b>
5.<a href="#">Reikia šios eilutės</b>
6.</div>

 

Jai galit pateikit kodo pavizdį naudojant php.

 

Kodo pavyzdžio šį kartą nepateiksiu, pasiskaitinėk čia http://simplehtmldom.sourceforge.net/manual.htm skiltyje "Traverse the DOM tree" ;)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Nu bandau bandau juk man reikia tad ir bandau...

Tik tikėjausi čia tinkamos pagalbos..

 

Manau supranti, kad žmonės užimti yra ir savo rūpesčių, bei vargų turi. Jeigu galėsiu ir bus noro - atsiųsiu tau kodo pavyzdį parašęs į PM. ;)

 

p.s. tau reikia paskutinės nuorodos (anchor) esančiame div'e su id "divas"?

Redagavo Lapinskis
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

×
×
  • Pasirinkite naujai kuriamo turinio tipą...