CSFD api – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

CSFD api – PHP – Fórum – Programujte.comCSFD api – PHP – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Vlákno bylo úspěšně vloženo.
Pokud sám přijdeš na řešení, nezapomeň ho sem přidat!
maniakum0
Newbie
26. 12. 2015   #1
-
0
-

Ahoj, 

používáte někdo nějaké funkční API na ČSFD? Poslední dobou se mi stalo, že mi nefunguje žádný možný přístup, ani přes simple dom html parser. Jsem jediný nebo chyba někde jinde?

Díky

Nahlásit jako SPAM
IP: 82.142.100.–
Kit+15
Guru
26. 12. 2015   #2
-
0
-

#1 maniakum
Na ČSFD se svým parserem nechodím (zkusit to můžu, ale zatím jsem to nepotřeboval), ale nevidím v tom problém. V PHP na to používám třídu DomDocument, která parsování HTML zvládá docela dobře. Ty ostatní (včetně SimpleXML apod.) měly vždy nějaké mouchy, kvůli kterým jsem je přestal používat.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
maniakum0
Newbie
27. 12. 2015   #3
-
0
-

#2 Kit
Ok. Tak jsem zkusil napsat tohle pro vytažení názvu filmu. 

<?php
$dom = new domDocument; 
$dom->loadHTMLfile('http://www.csfd.cz/film/32'); 
$dom->preserveWhiteSpace = false;
$tables = $dom->getElementsByTagName('h1');
while($table = $tables->item($i++))
{
    echo $table->nodeValue;
}
?>

Funguje, ale napříklád jednou za 5 opakování se mi nic nenačte, čím to?

EDIT: respektive jsem ještě přišel třeba na to, že pod id 349573 to nic nezobrazí. To jako proč?

Nahlásit jako SPAM
IP: 82.142.100.–
maniakum0
Newbie
27. 12. 2015   #4
-
0
-

#3 maniakum
Jak kdyby se CSFD bránila a posílala tam náhodný bordel a občas se povede načíst stránka v pořádku

‹ í}K“Ç•îZúix¤nZ( Ux7‰fMÒ¤$R4›¢l‰ŠŽ*T£PÕM´ÅˆYÎbôÚ˜O„/æÆ]8B^¸É?rÉýNf֏ÐÝäXŽ‘-5*둯“'Ïã;'?¼ñ«;_ŽöøËÛŸ?8`­\þªzP.ßyz‡ýþþÓ‡ŸòäÎ=“é¥J¹|÷Q†a8Ù+—ONNJ'Õ’çÊMôå„Þ(¿ oi¾Õ75½d…VaÿÃâó/ÆŽt–¼¬·ÛmùZÚsLwÐ)ôqå{®T•Þ„»ßœ'¾z=ϵ½!›åøù~7yÞâSîà%?(õÍïzÞ¨ÔóÆÉÔ6nZû~pcÌCãN4þ]dO;…Ï ¹jOg^`=yÕ)„üEX¦Æ^g½¡éاÞÐ COÞ{ûÊOì³ÿvM6eá›ßþ}tö›ž½:åìÖÄs“øœ[f‘BîŸýÌNùøퟸÎùÛWxMpeá sMß;åîÙëq‰=FqzlŠF¨òí_ñè_§ž…öšô3Y×{ÁÆg¯P÷ÈŸÚEš£·çß«AxöÊá(â	Ëc‡¶cZÜ™môbüæÇ ¤fYœœyúxþÿýûÍ݈ÏN$£Þ£>™øƒÇ?ÄX‡vèð}ÑY¶kTôú5ö={óŸ‡÷î”z§7Êò6=èØîˆùÜ邡燽(d6>\`CŸ÷R±ÇƒR/è[x¹l˜Ö ÜÕÍfÙ›”ûæ”Þ*á?‚&:q§üB_£éOk2'‡k¡õ†òöv•‰×ÄëG¢Ö‰;ÝÎu'œ9rÎ}Þž7p¸9±AòTVvìnP>þ.âþ,²Ëz©UÒkå«ìšW÷´ÈÆX`üe?ÉÓu¾ÁªêWåس"´¸|»eù¶ú#k+¯þþ\C6MUÇÄ·ÝPV1æ–mv ¢„ã)—)ü^§PVS_2-¯Ë­p,†®ÖåfϬוšiêV·i6­¶Ñn˜•–Õªv9¯¶[¼Ù·ÊrDZCþ¹ÝÕºõZϨY=½ß5jfC¯õõV¯Ë£i4¬Z·Òh7 K¯—Ž1°7À’¨‚`U‹2}>6§¦,ÅšP\§ ÙŽl¸â›L
Nahlásit jako SPAM
IP: 82.142.100.–
Kit+15
Guru
27. 12. 2015   #5
-
0
-

#3 maniakum
Na serveru je nejspíš nějaká jednoduchá ochrana proti harvestingu.

Také ten PHP klient může padnout na timeout při tom dvojitém přesměrování, které je na začátku.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Kit+15
Guru
27. 12. 2015   #6
-
0
-

#4 maniakum
To není "náhodný bordel", ale data.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Maniakum
~ Anonymní uživatel
16 příspěvků
27. 12. 2015   #7
-
0
-

Ok. V tom případě, co s tím? Nějaké nasměrování na vo se mám zaměřit? Protože opravdu netuším co s tím udělat.

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 37.188.142.–
Kit+15
Guru
27. 12. 2015   #8
-
0
-

#7 Maniakum
Mně to už funguje. Jsou to data komprimovaná gzipem. Stačí je dekomprimovat.

Jinak ten string, který jsi sem poslal, tomu neodpovídá. Někde sis asi vydoloval náhodná data, protože z ČSFD to sice také vypadá jako rozsypaný čaj, ale na rozdíl od toho tvého to má platnou signaturu a dá se to dekódovat.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Maniakum
~ Anonymní uživatel
16 příspěvků
27. 12. 2015   #9
-
0
-

Tak to na to zkusím mrknout.

Při reloadu se mi načítá x verzí toho "bordelu"

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 37.188.142.–
maniakum0
Newbie
27. 12. 2015   #10
-
0
-

#8 Kit
Tak nevím, asi se to pokouším vydolovat nějak blbě. Jak to děláš? Já žádnou signaturu nevidím, jen rozsypaný čaj, který jako gzip nefunguje.

Nahlásit jako SPAM
IP: 82.142.100.–
maniakum0
Newbie
27. 12. 2015   #11
-
0
-

Přesměrováním to není, pokud zadám tuto url adresu http://www.csfd.cz/film/349573-creed/prehled/

tak mi to stejně pokáždý háže prázdný resp. nějakou blbost. Něco dělám špatně a nejsem schopen přijít na to co.

Nahlásit jako SPAM
IP: 82.142.100.–
Kit+15
Guru
27. 12. 2015   #12
-
0
-

#10 maniakum
Prostě tam podmíněně přidám rozbalení toho gzipu.

<?php
$csfd = file_get_contents("http://www.csfd.cz/film/32");
$html = (ord($csfd[0]) == 31) ? gzdecode($csfd) : $csfd;
@$dom->loadHTML($html);
Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
maniakum0
Newbie
27. 12. 2015   #13
-
0
-

#12 Kit
Jako jo, funguje a jak jsi na to přišel? Co přesně děl ord()?

Nahlásit jako SPAM
IP: 82.142.100.–
Kit+15
Guru
27. 12. 2015   #14
-
0
-

#13 maniakum
To víš, nějakou dobu už s PHP dělám, umím už dělat prototypy i testy. To je pak vcelku jednoduché na takové chyby přijít.

Také vím, že existuje dokumentace PHP, ve které je vysvětlena i funkce ord().

Opravdový programátor totiž zná nebo nezná jméno své ženy, ale zcela jistě zná tabulku ASCII a ví, že znak s ordinální hodnotou 31 není tisknutelný a začne pátrat po tom, co to číslo 31 znamená.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
maniakum0
Newbie
27. 12. 2015   #15
-
0
-

Kdyby to někoho zajímalo, tak jsem to nakonec udělal takto. Určitě by to šlo udělat lépe, budu rád za každý komentář. Žádný zázrak to není, ale funguje to.  

$dom = new domDocument;
$csfd = file_get_contents("http://www.csfd.cz/film/$csfd_id");
$html = (ord($csfd[0]) == 31) ? gzdecode($csfd) : $csfd;
@$dom->loadHTML($html);
$dom->preserveWhiteSpace = false;

$names = $dom->getElementsByTagName('title'); //zjištění CZ a druhého názvu filmu
$i=0;
while($names_2 = $names->item($i++))
{
    $name = $names_2->nodeValue;
    if ($name_obsahuje = strpos($name, "/") === false) {
        $names_3 = explode(" | ", $name);
        $names_4 = explode(" ( ", $names_3);
        $names_cs = $names_4[0];
        $names_en = $names_cs;
    } else {
        $names_3 = explode(" / ", $name);
        $names_4 = explode(" (", $names_3[1]);
        $names_cs = $names_3[0];
        $names_en = $names_4[0];
    }
}

$entries = $dom->getElementsByTagName('h2'); //hodnocení

for ($i=0;$i<$entries->length;$i++) {
    $entry = $entries->item($i);
    $average = $entry->attributes->getNamedItem('class')->value;
    if($average=="average") 
        $hodnoceni = str_replace('%', '', $entry->nodeValue);
}

$entries = $dom->getElementsByTagName('p'); //rok, žánr, země, délka filmu

for ($i=0;$i<$entries->length;$i++) {
    $entry = $entries->item($i);
    $p = $entry->attributes->getNamedItem('class')->value;
    if($p == "origin") 
        $podrobnosti = explode(", ",$entry->nodeValue);
    elseif($p == "genre")
        $genre = str_replace(' / ', '@;@', $entry->nodeValue);
}

$entries = $dom->getElementsByTagName('span'); //herci

for ($i=0;$i<$entries->length;$i++) {
    $entry = $entries->item($i);
    $p = $entry->attributes->getNamedItem('data-truncate')->value;
    if($p == 340)
        $hraji = $entry->nodeValue;
}

$entries = $dom->getElementsByTagName('div'); //popis

for ($i=0;$i<$entries->length;$i++) {
    $entry = $entries->item($i);
    $p = $entry->attributes->getNamedItem('data-truncate')->value;
    if($p == 570)
        $popis = $entry->nodeValue;
}

$xpath = new DOMXPath($dom); //obrázek plakátu
$nodes = $xpath->query("//img[@class='film-poster']");
$poster_url = "http:".$nodes->item(0)->getAttribute('src');
Nahlásit jako SPAM
IP: 82.142.100.–
Kit+15
Guru
27. 12. 2015   #16
-
0
-

#15 maniakum
Zrovna to zkouším a hlásí mi to hromadu "PHP Notice". Bylo by dobré se jich zbavit.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
maniakum0
Newbie
27. 12. 2015   #17
-
0
-

#16 Kit
Jo, to souhlasím. Koukám, že errory mám vypnutý. Projedu si to. 

Každopádně děkuji za pomoc! 

Nahlásit jako SPAM
IP: 82.142.100.–
Kit+15
Guru
27. 12. 2015   #18
-
0
-

#17 maniakum
Ještě koukám, že první i druhý název parsuješ z "title". První najdeš v "@header" a druhý v seznamu "@names". Rok a země původu je pak v "@origin", žánr v "@genre". Rodičovské elementy hledat nemusíš, XPath umí hledat i podle samotných class.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
maniakum0
Newbie
27. 12. 2015   #19
-
0
-

#18 Kit
Jo, to koukám, že bude lepší, nějak jsem to parsoval poprvé a tak mi to chvíli trvá 

Nahlásit jako SPAM
IP: 188.175.26.–
Řešení
maniakum0
Newbie
28. 12. 2015   #20
-
+3
-
Zajímavé
Vyřešeno Nejlepší odpověď

#18 Kit
Tak pak takhle: 

$dom = new domDocument;
$csfd = file_get_contents("http://www.csfd.cz/film/$csfd_id");
$html = (ord($csfd[0]) == 31) ? gzdecode($csfd) : $csfd;
@$dom->loadHTML($html);
$dom->preserveWhiteSpace = false;

$xpath = new DOMXPath($dom);
$nazvy = array();
$zeme = array();
$names_other = "";
$nodes = $xpath->query("//h1[@itemprop='name']");
$names_cs = $nodes->item(0)->nodeValue;

foreach($xpath->query("//ul[@class='names']/li/h3") as $li) {
    $nazvy[] = $li->nodeValue;
}
foreach($xpath->query("//ul[@class='names']/li/img") as $li) {
    $zeme[] = $li->getAttribute('alt');
}
for($i=0;$i<count($nazvy);$i++){
    if($i==count($nazvy)-1)
        $names_other .= $zeme[$i]."-".$nazvy[$i];
    else
        $names_other .= $zeme[$i]."-".$nazvy[$i].";";
}

$nodes = $xpath->query("//h2[@class='average']");
$hodnoceni = str_replace('%', '', $nodes->item(0)->nodeValue);

$nodes = $xpath->query("//p[@class='origin']");
$podrobnosti = explode(", ", $nodes->item(0)->nodeValue);

$nodes = $xpath->query("//p[@class='genre']");
$genre = str_replace(' / ', '@;@', $nodes->item(0)->nodeValue);

$nodes = $xpath->query("//span[@data-truncate='340']");
$hraji = $nodes->item(0)->nodeValue;

$nodes = $xpath->query("//div[@data-truncate='570']");
$popis = $nodes->item(0)->nodeValue;

$nodes = $xpath->query("//img[@class='film-poster']");
$poster_url = "http:".$nodes->item(0)->getAttribute('src');

Pak mám ještě ale problém s těmi dalšími názvy, určitě to jde udělat lépe, tedy, aby se to všechno udělalo v jednom kroku.

Nahlásit jako SPAM
IP: 82.142.100.–
Kit+15
Guru
28. 12. 2015   #21
-
0
-

#20 maniakum
Tohle už vypadá mnohem lépe.

Sám jsem si to vytáhl z toho PHP a strčil do výstupní šablony, takže to mám z jedné vody načisto :)

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:b82b:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Maniakum
~ Anonymní uživatel
16 příspěvků
28. 12. 2015   #22
-
0
-

Jj. Jen ještě nějak lépe poresim to pole s nazvy a bude to.

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 188.175.26.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 8 hostů

Podobná vlákna

Csfd api - proc nefunguje — založil Dan

CSFD.cz - Parsování — založil webdorf

API — založil Anonymní uživatel

REST API — založil French Montana

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý