kapeika Posted August 29, 2014 Report Share Posted August 29, 2014 Sveicināti, PHP.LV forumieši! Esmu atpakaļ ar jaunu iesācēja problēmu. Esmu lasījies, meklējies, kačājis tūļus, izmantojis developer options un tā tālāk. Iespējams, ka man jāpalasa elementāri CSS pamati, bet šaubos, ka šim ir jābūt tik sarežģītam, lai sāktu lasīt no sākuma. Intro: Ir mājaslapas skripts, kurš skreipo automātiski ziņas no divām kino lapām. Viena no tām ir firstshowing.net, tai arī ir skripts klāt. Personīgi es vēlos skreipot ziņas no krievu resursa, teiksim - http://www.kinopoisk.ru/news/ Bet lai kā es nemēģinātu izmainīt kodu, man neko jēdzīgu nesanāca izdabūt. Re kur piemērs, kā viņi skreipo (vai crawlo) ziņas no firstshowing (koda daļa) - /** * Scrapes and compiles news for saving from * FirstShowing website. * * @return self */ private function getFromFirstShowing() { $compiledNews = array(); $news = $this->curl('http://www.firstshowing.net/category/movie-news/'); $crawler = new Crawler($news); //first we'll grab every news item on the page foreach ($crawler->filter('#content > .article') as $k => $node) { $cr = new Crawler($node); //then we will compile array out of every new items $compiledNews[$k] = array( 'title' => head($cr->filter('h2 > a')->extract(array('_text'))), 'image' => head($cr->filter('div.image > a > img')->extract(array('src'))), 'body' => head($cr->filter('p')->extract(array('_text'))), 'full_url' => head($cr->filter('.continue > a')->extract(array('href'))), 'source' => 'FirstShowing', 'fully_scraped' => 0, ); } $this->news = $compiledNews; return $this; } Hromē izmantoju SelectorGadget, lai uzzinātu kinopoisk selectorus, bet jau nesanāk ar pašu elementārāko. Es nevēlos, lai Jūs man pasakat kodu priekšā (kaut gan tas arī nebūtu slikti, tā man vieglāk būtu "iebraukt", bet vismaz pabīdītu ilgākā sarakstē uz pareizo variantu. Saprotu, ka vajag ielikt jaunumu linku curlā, pēc tam vajag satura selektoru, bet pēc tam tālāk no satura selektora viņš velk nepieciešamās daļas - title, image, body, un pilnā url saiti. Jautājums - kā pareizi tikt galā ar tiem h2 > a, div.image > a > img? Varbūt ir kāds ieteikums vai arī varētu man parādīt vismaz ar vienu (title) piemēru, un es mēģināšu izcīnīties ar atlikušajiem galā? Iepriekš pateicos. Quote Link to comment Share on other sites More sharing options...
jurchiks Posted August 29, 2014 Report Share Posted August 29, 2014 (edited) 1. tas crawleris neparsē tālāk par pirmo lapu, ko es uzskatu par trūkumu. 2. http://pastebin.com/3ZbsbPKM ārkārtīgi elementāri, nesaprotu, kur problēma. Reāli aizņēma 2 minūtes, ne vairāk. Tur nevajag nekādus SelectorGadget, vienkārši skaties lapas HTML struktūru un domā loģiski. P.S. visus CSS selektorus hroma konsolē var notestēt šādi: 1) $('.newsList .item') 2) $('.newsList .item:first-child .title > a') etc. Te ir pārējie Developer Tools konsoles variabļi: https://developer.chrome.com/devtools/docs/commandline-api debug(functionName) liekas īpaši noderīgs. Edited August 29, 2014 by jurchiks Quote Link to comment Share on other sites More sharing options...
kapeika Posted October 11, 2014 Author Report Share Posted October 11, 2014 Laikam esmu kļūdījies, dodot tikai koda daļu, nevis pilnu failu, jo pamanīju, ka pēc "ziņu nolasīšana" ir vēl skripts, kurš, visdrīzāk, izpilda jaunumu pievienošanu datubāzē, tāpēc tikai ar pirmo kodu nekas nesanāca - Re kur ir oriģināls fails - http://pastebin.com/CXA3GCtK Vai varētu palīdzēt šeit? Tik tiešām esmu laikam alnis šajā ziņā, jo nevaru nekādīgi tikt galā. Quote Link to comment Share on other sites More sharing options...
jurchiks Posted October 11, 2014 Report Share Posted October 11, 2014 Ar ko konkrēti palīdzēt? Quote Link to comment Share on other sites More sharing options...
kapeika Posted October 11, 2014 Author Report Share Posted October 11, 2014 Nu kā, neesmu nekāds koda zintnieks, zinu to tikai tādā veidā, kā "pielabot/samainīt, aļa - tā, lai der". Koda saturā, ko iemetu pēdējā postā ir skripts, kurš skreipo ziņas no viena no izvēlētajiem resursiem - šajā gadījumā tie ir FirstShowing un ScreenRant. Pirmajā postā iemetu tikai to koda daļu, kurā ziņas tiek "nolasītas" no resursa, bet pēc tā visdrīzāk ir arī kaut kāds izpildošais kods, jo izmantojot Jūsu piedāvāto risinājumu nebija nekādas kļūdas kodā, vienkārši netika noskreipoti jaunumi. Tā kā par pamatu ņēmu ScreenRant, tad pieļauju, ka šī koda daļa man nav pareiza un tai ir nepieciešamas izmaiņas - http://pastebin.com/FmUYt8aa Pats ziņu saglabāšanas kods datubāzē neizskatās, ka būtu maināms. Pieļauju, ka problēma ir preg_match'os un preg_replace'os. Vai tā ir? Varbūt kādas norādes? :) Ja nepieciešams, varu nosūtīt administratora pieeju un saiti, lai redzētu, kā tam būtu jānotiek (tagad notiek) darbībā. Quote Link to comment Share on other sites More sharing options...
jurchiks Posted October 11, 2014 Report Share Posted October 11, 2014 Skaties funkcijas public function all() un public function getSingle($url). Tev jāpielabo tie IFi, kuri čeko provaiderus, lai izmantotos arī tā trešā funkcija, kuru iepriekš uzrakstīju. Quote Link to comment Share on other sites More sharing options...
kapeika Posted October 12, 2014 Author Report Share Posted October 12, 2014 Droši vien tas ir ne tas labākais variants, bet es tavam iepriekš ievietotajam kodam uzliku oriģinālo funkcijas nosaukumu. Nevēlējos saputroties. Jā, ziņas importē labi, bet ar to SingleNewsItem ir problēmas, vismaz izmet kļūdu. Visdrīzāk, ka šajā koda daļā neesmu salicis pareizi - http://pastebin.com/3UX7b6tH , jo saņemu sekojošu kļūdu, uzspiežot uz kāda konkrēta jaunuma - http://goo.gl/PJCpol Cik pameklēju, Boolean ir true/false vērtības, tāpēc bija aizdomas, ka kļūdu izraisa single news koda daļa, kurā tiek izvākts "unneeded HTML", bet tā tas nav, kļūda paliek tā pati. Ar ko tas vēl varētu būt saistīts?Paldies iepriekš. Quote Link to comment Share on other sites More sharing options...
jurchiks Posted October 12, 2014 Report Share Posted October 12, 2014 (edited) Kreisajā pusē taču var klikšķināt pa tiem itemiem un skatīties, kurā solī tas exception tiek izmests. 3. no augšas redzams, ka erors notiek, konstruējot new Crawler($item); 2. no augšas - $this->add($node); 1., acīmredzot, ir tās add() metodes kods, un exception tiek mests pašā apakšā, kur arī pasaka, ka add() padots boolean. Sekojot ķēdītei uz augšu, boolean rodas, getSingleFromFirstShowing() metodē $this->curl($url); izsaukumā, kas atgriež false, kas tiek padotsCrawler#__construct() metodei kā $item. Edited October 12, 2014 by jurchiks Quote Link to comment Share on other sites More sharing options...
kapeika Posted October 12, 2014 Author Report Share Posted October 12, 2014 (edited) Nemaz nebiju iedomājies, ka tik ērti var izsekot kļūdai. Bet, cik ES sapratu (ja nekļūdos), tad nekur nevajadzētu būt baigajai problēmai. Jā, mēģinot aptvert visu, man rodas iespaids (vai to varbūt var nosaukt saprašanu), ka false viņš iedod tāpēc, ka settingos (attiecīgi - adminpanelī) man nav kā news provider uzlikts firstshowing? Kļūdā rakstīts, ka vajadzēja iegūt stringu, null vai ko citu, bet saņēma true/false vērtību (kam nevajadzēja notikt). Un vēl trešais variants manā galvas bardakā - kods - public function getSingleFromFirstShowing($url) { $item = $this->curl($url); $crawler = new Crawler($item); $html = $crawler->filter('.review p')->each(function (Crawler $node, $i) šeit iegūst jaunuma linku, un no linka atkal ar selektoru palīdzību "izrok" pilnu raksta saturu. Attiecīgi tā kā man stāv firstshowing nevis kinopoisk selektors, kods neko neiegūstu un izmet erroru. Vai tā?Lūgums nesmieties par mani, jo man tiešām šajā ziņā ir diezgan liels bardaks, bet nu man nesanāk iemācīties "izlasot grāmatu". Man no sākuma vajag praktisku piemēru, lai es pamokos tā kārtīgi, pēc tam rodas aptuvens priekšstats par visu šo lietu, un tad jau var pāriet pie konkrētās lietas padziļinātas izzināšanas. Kaut gan protams, ka visam pamatā ir struktūra un bāze, ko es arī nepārzinu diez ko labi. P.S. Pēc pīppauzes - viss mājaslapas skripts ir konstruēts tā, ka dati tiek fetchoti tikai tad, kad kāds uzspiež uz saites (kaut vai par tām pašām filmām - http://okz.tv meklējot kādu filmu, viņš fetcho datus no tmdb (movie database) datubāzes. Pat ja filma nav mājaslapas datubāzē, viņš meklējot automātiski fetchos datus no tmdb un saglabās manā datubāzē. Spriežot, ka jaunumi strādā pēc tāda paša principa, sanāk, ka tavs kods ir pilnīgi pareizs, un viņš nofetcho nosaukumu, exceptu, bildi, bet, kad nospiežu uz jaunuma nosaukuma, lai lasītu pilnu ziņu, viņš mēģina iegūt datus no pilna jaunuma, un, tā kā selektors ir norādīts nepareizi, viņš izmet kļūdu. Sanāk, ka man vajag norādīt pareizo selektoru un visam vajadzētu būt "bumbās"? Offtopic: Vēl man nepatīk tāda tipa grāmatas kā "PHP" un "MySQL". Vismaz lielākajā daļā, kas man bija, tiek mācīts pliks MySQL vai PHP, bet par kaut kādu savienojumu starp šiem vai kodēšanu vienlaicīgi izmantojot HTML, CSS, PHP, SQL u.t.t. - nav. Izlasi vienu grāmatu, aizmirsti daļu, lasi otru, beigās nekas neštimm' kopā. Varbūt Jums ir kādi ieteikumi, ko varētu palasīt? Lieliski saprotu latviešu, krievu, angļu. Edited October 12, 2014 by kapeika Quote Link to comment Share on other sites More sharing options...
jurchiks Posted October 12, 2014 Report Share Posted October 12, 2014 >man nav kā news provider uzlikts firstshowing? Nē, tad tās FirstShowing metodes nemaz neizsauktos. Ja curl atgriež false, tas nozīmē, ka bija kļūda, ievelkot lapas saturu, tātad jāskatās, vai tiek padots pareizs URL. Īstenībā tajā $this->curl() metodē vajadzēja mest Exception, ja tiek atgriezts false, tad uzreiz zinātu, ka lapas saturu nav bijis iespējams lejupielādēt, jo tagad tu putrojies problēmās. >Sanāk, ka man vajag norādīt pareizo selektoru un visam vajadzētu būt "bumbās"? Papriekš jāizštuko pareizais URL, un tad jāskatās, vai tie selektori jāmaina. Par PHP/MySQL piemēriem runājot - skaties šīs lapas apakšsadaļas: http://php.net/manual/en/book.pdo.php BET sākumā es ieteiktu nepievērst uzmanību User Contributed Notes blokam, tur bieži ir diezgan slikti piemēri. Skaties oficiālos piemērus, piemēram, šos: http://php.net/manual/en/pdo.exec.php#refsect1-pdo.exec-examples http://php.net/manual/en/pdo.query.php#refsect1-pdo.query-examples http://php.net/manual/en/pdo.prepare.php#refsect1-pdo.prepare-examples Nu un, protams, pašu PDO konstruktoru: http://php.net/manual/en/pdo.construct.php Tāpat, manuprāt, šī lapa ir diezgan informatīva par šo tēmu: http://code.tutsplus.com/tutorials/why-you-should-be-using-phps-pdo-for-database-access--net-12059 Šeit, cik skatos, ir viss tas pats, bet varbūt kaut kas tomēr atšķirās: http://code.tutsplus.com/tutorials/php-database-access-are-you-doing-it-correctly--net-25338 Quote Link to comment Share on other sites More sharing options...
daGrevis Posted October 12, 2014 Report Share Posted October 12, 2014 Vienkārši mauc cauri un gremo to, ko tagad centies arī sagremot. Neviena grāmata nedos praksi. Es pats tagad jau Nto dienu skatos uz ~150 rindiņām Clojure koda un cenšos saprast (tā kā tu neesi vienīgais). Quote Link to comment Share on other sites More sharing options...
kapeika Posted October 12, 2014 Author Report Share Posted October 12, 2014 to jurchiks: Skan jau vienkārši, bet kādam ir jābūt pareizajam URL un pēc kā tas tiek noteikts? Es neredzu, ka kaut kur būtu definēts kaut kāds noteikts URL. to daGrevis: Nu tā jau ir, jau gadus 5 - 6 taisu mājaslapas, bet pašmācības ceļā "no nulles" neko grandiozu uztaisīt nevaru, vairāk rokos ap CMS un mainu to kodu, lai pielāgotu sev vajadzīgajam rezultātam. Quote Link to comment Share on other sites More sharing options...
jurchiks Posted October 12, 2014 Report Share Posted October 12, 2014 (edited) getFromFirstShowing($url) metodē ir līnija: 'full_url' => head($cr->filter('.continue > a')->extract(array('href'))) full_url vajadzētu vest uz individuālās filmas lapu. Izvadi getSingleFromFirstShowing($url) to $url variabli un paskaties, vai tā vērtība ir pareiza. Ja nē, jālabo parseris, ja jā, tad kaut kas nav riktīgi tajā $this->curl() metodē. @daGrevis - tas ir darba kods? Ja nē, ieposto kkur. Edited October 12, 2014 by jurchiks Quote Link to comment Share on other sites More sharing options...
kapeika Posted October 12, 2014 Author Report Share Posted October 12, 2014 (edited) Firstshowing kā tādam full_url ir šāds - 'full_url' => head($cr->filter('.continue > a')->extract(array('href'))) Kad inspektēju elementu, viņiem url uz visu rakstu ir ar pilnu linku ( <a href="http://www.firstshowing.net/2014/oblivion-director-joseph-kosinski-follows-trials-of-white-boy-rick/" title="'Oblivion' Director Joseph Kosinski Follows 'Trials of White Boy Rick'" target="_top">Continue Reading › </a> ) Savukārt KinoPoisk - 'full_url' => head($cr->filter('.more > a')->extract(array('href'))), un viņiem šis links ir šādā formātā - <a href="/news/2494989/">подробнее<s></s></a> Sanāk, ka man kaut kur tajā full_url jāiebāž http://kinopoisk.ru, lai parseris varētu nolasīt jaunumus. Tikai rodas jautājums - kur man to sākumu bāzt? Edited October 12, 2014 by kapeika Quote Link to comment Share on other sites More sharing options...
daGrevis Posted October 12, 2014 Report Share Posted October 12, 2014 > @daGrevis - tas ir darba kods? Ja nē, ieposto kkur. State at this moment. Vēl nelieku uz GitHub, jo nav gatavs pat v0.1. https://gist.github.com/2b0c0aebd56a7c4fa0be Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.