Jump to content
php.lv forumi

Crawl vai Scrape - kā pareizi? - mēģinos, nesanāk


kapeika

Recommended Posts

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.

Link to comment
Share on other sites

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 by jurchiks
Link to comment
Share on other sites

  • 1 month later...

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ā.

Link to comment
Share on other sites

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ā.

Link to comment
Share on other sites

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š.

Link to comment
Share on other sites

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 by jurchiks
Link to comment
Share on other sites

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 by kapeika
Link to comment
Share on other sites

>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

Link to comment
Share on other sites

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).

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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 by jurchiks
Link to comment
Share on other sites

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 by kapeika
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

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

Loading...
×
×
  • Create New...