Panelen



Forumnavigering
Senast inloggade
RSS
Sponsorer

Forum > Övriga serverspråk > PHP

Scrapa information - funderasam på tillvägagångssätt

Hultin
Hultin

Gradering

#20574

Hejsan allihopa!

Jag lovade under gårdagen att jag skulle hjälpa en kompis att bygga en modul till hans websida som skulle skrapa information ifrån http://www.tibia.com/community/?sub...p;world=Refugia , jag vet hur man hämtar in själva sidan men mitt problem kommer när jag skall sedan välja ut specifika värden (namn, level och vocation) och sedan köra in dessa i en databas. Om ni kollar på koden så förstår ni nog ganska omgående. Den är ett rent och skärt helvete men då han länkade till sidor som gjort det så måste det ju onekligen gå att göra.

Har även funderat på att använda HTMLDom(http://simplehtmldom.sourceforge.net/), men då de olika tabellerna inte har några unika classer, idn eller dyl så kan jag tyvärr inte nyttja detta, inte såvitt jag kan se iallafall.¨

Är tacksam för alla idéer och förslag!

 

Uppdaterat: Har kommit på hur jag kan börja, med att plocka namn via länkar. 

Har försökt skapa ett regulärt uttryck, känns dock inte som att jag lyckats då det inte händer något. 

Så här ser det ut:

preg_match_all('/\&name=[^">]*">([^<]+)</i', $text, $matches);

$text innehåller websidans innehåll

edit: Notera att jag verkligen är urusell på regexp, och har försökt kopiera och klistra ihop ett uttryck med information från olika sidor -.-'

 

Uppdatering 2: 

provade denna kod:

preg_match_all('/\&name=(.*)?\"/i', $text, $matches);

Den returnerar inte namnet, eller inte bara, som det var tänkt. Utan detta: (första två orden med ett + emellan är den info jag vill åt, alltså ett namn)

Ablani+Zupoma" >Ablani&#160;Zupoma</a></td><td style="width:10%;" >55</td><td style="width:20%;" >Paladin</td></tr><tr class="Ev

Behöver även få min kod att matcha alla träffar, som det är just nu träffar den max 1 rad och nöjer sig där.

 

För att förtdliga hela denna posten: Så här ser <a> taggen ut på sidan; <a href="http://www.tibia.com/community/?sub...=Hades+Sorceres" >Hades&#160;Sorceres</a> och jag vill alltså plocka namnet Hades+Sorceres i detta fallet.

... ORANGE HEARTS!
Redigerades av Hultin den 8 januari 2011. Läs tidigare inlägg.
Redigerades av Hultin den 8 januari 2011. Läs tidigare inlägg.
Redigerades av Hultin den 8 januari 2011. Läs tidigare inlägg.
Redigerades av Hultin den 8 januari 2011. Läs tidigare inlägg.
Redigerades av Hultin den 8 januari 2011. Läs tidigare inlägg.
ID: #20574 | Skapades: 2011-01-08 18:07:57 | Tråden har 10 svar och har lästs 452 gånger.

Hultin
Hultin

Gradering

#20575

Provat och testat och haft mig, och kommer verkligen ingen vart alls känns det som.

/subtopic=character&name=.+?>(.+?)</A>/i

Funkar icke, får ett felmedellande från php som lyder:

Warning: preg_match_all() [function.preg-match-all]: Unknown modifier '\' in C:\xampp\htdocs\pages\test.php on line 11

... ORANGE HEARTS!
ID: #20575 | Skapades: 2011-01-09 13:44:35

voigtan
voigtan

Gradering

#20576

Citerar Hultin:
Har även funderat på att använda HTMLDom(http://simplehtmldom.sourceforge.net/), men då de olika tabellerna inte har några unika classer, idn eller dyl så kan jag tyvärr inte nyttja detta, inte såvitt jag kan se iallafall.¨
Men om det är en DOM hantering så borde du i alla fall kunna hitta element och nu vet jag inte hur kraftfull den är men om den klarar css Selectorer på ett smidigt sätt så borde det ju inte vara några problem alls att hämta ut vad du är ute efter, att köra Regex känns som ett dåligt sätt när det finns smidigare sätt.

Hur man ställer en fråga: http://support.microsoft.com/kb/q555375
ID: #20576 | Skapades: 2011-01-09 17:02:19

Hultin
Hultin

Gradering

#20577

DOM gick inget vidare, då sidan, tibia.com, är ett helvete och dem har miljarder av tabelceller osv.. Blir lättare att, tror jag iallafall, att hitta länken som länkar till deras karaktärs sida (något som finns på alla karaktärer i onlinelistan på tibia.com) och dra namnet från länken då det enda som där skiljer sig är namnet på just karaktären.

 

Provar lite gran just nu, denna koden borde ju i all rimlighet returnera bara världnamnet (Alltså "Premia") och inget annat.

function checkplayer($name){
 $name = str_replace(' ', '+', $name);
$raw = file_get_contents('http://www.tibia.com/community/?sub...acters&name='.$name) or die('Couldn\'t access Tibia.com to retrieve data');
$pattern = '/World:<\/td><td>(.*)?<\/td><\/tr>/';
$charName = preg_match($pattern, $raw, $matches);
return $matches[0];
}

Just nu returnerar den dock:

Citat:
World:PremiaResidence:FarmineHouse:Arakmehn I (Ankrahmun) is paid until Jan 28 2011Last login:Jan 09 2011, 15:19:28 CET


... ORANGE HEARTS!
Redigerades av Hultin den 9 januari 2011. Läs tidigare inlägg.
ID: #20577 | Skapades: 2011-01-09 17:04:30

voigtan
voigtan

Gradering

#20579

DOM är ju a-element, så det förstå jag inte alls vad problemet skulle vara med att det är "miljader tabeller", det är ju inte det du är intresserad över.

.InnerTableContainer:eq(2) tr:gt(0) a
är xPathen, enklare än så känns det inte som du kan få regex för att hitta urlen verkar ju det ända du är egentligen intresserad över:

http://www\.tibia\.com/ community/\?subtopic=chara cters&name=([\w ]+)
(ta bort mellanslag då det verkar vara en bugg på aspkoll just nu ;)

Hur man ställer en fråga: http://support.microsoft.com/kb/q555375
Redigerades av voigtan den 9 januari 2011. Läs tidigare inlägg.
ID: #20579 | Skapades: 2011-01-09 17:36:30

Hultin
Hultin

Gradering

#20582

Hittade en färdigklass på PHPportalen som uppfyller det jag just nu behöver, dock är det en grej som är utdaterad och jag vet vad som behövs fixas vet bara inte HUR.

class tibia {
   private $_charURL = 'http://www.tibia.com/community/?sub...ers&name=%s';

   public function getCharacter($character) {

$character = str_replace(' ', '+', $character);

      $url = sprintf($this->_charURL, ucfirst($character));

      $content = file_get_contents($url);

      if(strpos($content, 'Character Information') === false)

         return false;

      $content = str_replace(array('<br />', '&#160;'), array('', ' '), $content);

      $content = preg_replace('/<A HREF="([^>]+)">([^<]+)<\/A>/', '[url=\1]\2[/url]', $content);

      preg_match_all('/(Name|Sex|Profession|Level|Residence|Last login|Comment|Account Status|Guild membership|World):(?:<\/?[^>]+>){2}([^<]+)/', $content, $matches);

      $data = array();

      $count = count($matches[0]);

      for($i = 0; $i < $count; $i++) {

         $var = strtolower($matches[1][$i]);

         $var = str_replace(' ', '_', $var);

         $value = html_entity_decode($matches[2][$i]);

         $data[$var] = $value;

      }

      return $data;

   }

}

 

I tibia kan man byta värld, om man bytar värld så kommer den att lista på karaktärsvyn på tibia.com "former world" före world, hur gör jag för att få den att skall läsa in WORLD och inte former world som "world"? (alltså world i regexpn tar formerworld om det finns :<)

... ORANGE HEARTS!
ID: #20582 | Skapades: 2011-01-09 19:00:54

voigtan
voigtan

Gradering

#20583

Vad få du på $content? Gör en kontroll om du kan och se om den börjar med World, men om du ha " world:" som text så kommer det inte hjälpa:

preg_match_all('/(Name|Sex|Profession|Level|Residence|Last login|Comment|Account Status|Guild membership|^World):(?:<\/?[^>]+>){2}([^<]+)/', $content, $matches);

Hur man ställer en fråga: http://support.microsoft.com/kb/q555375
ID: #20583 | Skapades: 2011-01-09 19:08:55

Hultin
Hultin

Gradering

#20586

Kunde inte testa det igår, då tibia.com var ostabil. I vilket fall, ^innebär väl att det måste börja på World, eller har jag missförstått något? I vilket fall fungerar inte det. 

$data = $tibia->getCharacter('Herrop');
echo $data['world'];

Returnerar alltid ett null värde när ^world är med i leken.

... ORANGE HEARTS!
ID: #20586 | Skapades: 2011-01-10 08:05:02

voigtan
voigtan

Gradering

#20588

Vad få du i:

$content = preg_replace('/<A HREF="([^>]+)">([^<]+)<\/A>/', '[url=\1]\2[/url]', $content);
Som jag skrev i förra inlägget så vill jag gärna veta vad man har för data som man skall leta igenom.

ASPKolls kod (som är mitt fel) klipper bort för långa ord, så kan du postar din kod på http://aspkoll.se/code/ så bli det lite lättare att se vad du har för url som du scrapar ifrån.

Hur man ställer en fråga: http://support.microsoft.com/kb/q555375
Redigerades av voigtan den 10 januari 2011. Läs tidigare inlägg.
ID: #20588 | Skapades: 2011-01-10 10:11:32

Hultin
Hultin

Gradering

#20589

Oj, själklart skall jag göra det. 

KOD (Hela Test.php): http://www.aspkoll.se/code/Index.asp?id=651

Där återfinner du url, fullständig kod jag jobbar med. För karaktärs namn, fyll i Herrop (en karaktär jag vet existerar) 

... ORANGE HEARTS!
ID: #20589 | Skapades: 2011-01-10 11:31:41

voigtan
voigtan

Gradering

#20590

preg_match_all('/>(Name|Sex|Profession|Level|Residence|Last login|Comment|Account Status|Guild membership|World):(?:<\/?[^>]+>){2}([^<]+)/', $content, $matches);
den kollar nu om det är > i början, vilket du få nog köra, men överväg om du inte skall köra DOM hanteringen istället.

Sen skall du nog bygga in din funktion i din klass, sen vet jag inte hur det är med PHP, men det känns onödigt att skapa ett objekt innan du behöver använda den, skapar upp ditt $tibia = new tibia; inne i din if fråga, det är bara där du använder den ändå.

så här hade jag gjort: http://www.aspkoll.se/code/Index.asp?id=652 ... på ett ungefär.

Hur man ställer en fråga: http://support.microsoft.com/kb/q555375
Redigerades av voigtan den 10 januari 2011. Läs tidigare inlägg.
Redigerades av voigtan den 10 januari 2011. Läs tidigare inlägg.
ID: #20590 | Skapades: 2011-01-10 12:30:32
© Copyright 2007-2009 Shadi Domat | Version 3.0 | Sidkarta | Policy