WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Bygga spindel/crawler (https://www.wn.se/forum/showthread.php?t=18497)

Pettolajnen 2007-01-07 19:36

Jag behöver en sorts spindel till min hemsida (www.svenskabatmarknaden.se) för att kunna lista ut annonser från andra annonssidor, likt allaannonser.se.

Jag har tänkt underlätta lite genom att be de anslutna handlarna att göra index-sidor som ser ut såhär:

Datum|Bild(Ja/Nej)|Rubrik|Beskrivning|Kategori|Län|Typ|Pris|Länk
Datum|Bild(Ja/Nej)|Rubrik|Beskrivning|Kategori|Län|Typ|Pris|Länk
Datum|Bild(Ja/Nej)|Rubrik|Beskrivning|Kategori|Län|Typ|Pris|Länk
Datum|Bild(Ja/Nej)|Rubrik|Beskrivning|Kategori|Län|Typ|Pris|Länk

osv..

Med andra ord, en annons per rad. Frågan är nu hur man gör självaste funktionen/spindeln som ska lista ut alla annonser/rader från de olika sidorna och dessutom sortera dem i t ex. datumordning. Någon som vet hur Allaannonser.se har gjort om dom sparar i databasen och sedan listar ut eller om dom kör direkt från index-sidorna? Det blir ju genast svårare om man ska spara i databasen, då man måste göra regelbundna granskningar och resultaten blir inte lika färska.

Obs: Jag kan inte XML och RSS, ja kör helst PHP.

Vore SUPERGLAD för hjälp!!

Danski 2007-01-07 19:51

Har sidorna du ska ta annonserna ifrån RSS så har du det lätt tillgängligt redan. Om inte får du skapa en crawler, t.ex. i Web Scraper+ (finn säkert billigare och gratis men det är den jag använder).

Det brukar inte ta lång tid att sätta sig in i hur det fungerar.

Den här crawlern låter du t.ex. sen rulla på servern och infoga det direkt i en uppsatt MySQL databas.

Edit: Missförstod lite, tänkte att du skulle ta informationen från redan tillgängliga sidor. Men om du har anslutna handlare kan de väl skapa ett RSS-flöde eller infoga det direkt genom att fylla i formlär? Du får dock problem med att ha det helt uppdaterat om du ska läsa det från en sida eller RSS, då det inte läses i realtid.

Pettolajnen 2007-01-07 19:56

Jo som sagt jag kan inte själv RSS så det är redan uteslutat. Och då vet jag som sagt att jag måste skapa en crawler. Kan man inte göra en själv då? Det borde väl inte vara allt för svårt eftersom alla index-filerna som den ska söka igenom ser likadana ut, en annons per rad i filen. Sedan är jag som sagt skeptisk till databas-användning eftersom det blir svårt att hantera t ex. när en annons tas bort från den ursprungliga sidan och när det kommer till annonser, eller när någon ändrar i sin annons. Det vore bättre att bara lista ut direkt från ursprungssidan.

Pengar har jag inga, men hoppas att få med min spindel/crawler :)

EDIT: Med ansluten handlare menar jag att jag har avtalat med handlaren t ex. Börjessons Båt att jag får ta information från deras hemsida. Och då ber jag dom fixa en såndär index-sida där annonserna radas ut en per rad. Än en gång, varken jag eller min målgrupp kan RSS så det är ingen idé att föreslå det ;)

Daniel.st 2007-01-07 20:15

Du kanske kan få tillgång till dem i ett enkelt txt eller csv filformat så borde det vara relativt enkelt att plocka ut infon. Fast xml, rss eller webservices är ju annars helt oslagbart för detta, du har ju en bra anledning att börja lära dig detta nu annars :)

Jag skulle nog rekommendera dig att besöka alla sidor en eller ett par gång per dygn eller liknande och spara ner infon i en db istället för att hämta infon för varje besökare, det kommer att bli väldigt många frågor annars och riskerar att skapa en ganska långsam sida. I de fall en annons plockas bort har säkert Börjessons Båt en vanlig felsida eller liknande som visar att annonsen plockats bort.

Pettolajnen 2007-01-07 20:20

Som programerare med kärlek för automatik tänker jag VERKLIGEN INTE gå in på sidorna flera gånger per dag och hålla på och kolla alla uppdateringar, det är HELT UTSELUTET.

Jag förstår inte att det ska vara så svårt att plocka ut all information och lista dem i datumordning, speciellt när sidorna som jag tar informationen ifrån ser likadana ut:

Datum|Bild(Ja/Nej)|Rubrik|Beskrivning|Kategori|Län|Typ|Pris|Länk
Datum|Bild(Ja/Nej)|Rubrik|Beskrivning|Kategori|Län|Typ|Pris|Länk
Datum|Bild(Ja/Nej)|Rubrik|Beskrivning|Kategori|Län|Typ|Pris|Länk
Datum|Bild(Ja/Nej)|Rubrik|Beskrivning|Kategori|Län|Typ|Pris|Länk

Det MÅSTE ju gå att göra på nått inte så krångligt sätt. Om RSS inte visar realtid så är ju inte det heller bra, men eftersom alla pratar så gott om RSS i detta sammanhang så kan jag tänka mig att läsa t ex. om det finns någon artikel om hur man gör det jag ska göra. Ge mig länk bara så.

Magnus_A 2007-01-07 20:54

Om du får företagen i fråga att skapa sådan sidor är det en kakbit att promenera omkring och hämta värdena.
Själv plockar jag in några hundra värden från några hundra webbsidor dagligen och de är INTE strukturerade på det sätt som beskrivs här. Men allt går om man ger sig f_n på det.
Vad du behöver är:
En tabell på adresserna till sidorna ifråga.
En tabell med strukturerade data om vilka värden som är vilka och var dom finns att hämta på sidan.
en tabell där du lägger in värdena när du hämtat dom på ett automatiserat sätt. där bör också finnas info om senast hämtat, eventuella fel (ej laddad sida, tolkningsfel eller dylikt. )
När du kör uppdateringen får du ut vilka fel som blivit och sen får du manuellt scanna av vad det handlar om.

Om du får data från butikerna ifråga så fins det en risk att de inte uppdaterar lika ofta som de uppdaterar andra sidor.
Sen måste det finnas ett mervärde för handlaren att infon verkligen når ut, annars kommer han att skita i det så fort det innebär krångel av nåt slag. Lita inte på att alla handlare kommer att leverera punktligt bara för att du sagt att du vill ha data.
Därför finns det en fördel i att hämta råvärden direkt från sidorna.
lämpliga kommandon i PHP:
curl för att hämta sidor
tidy för att analysera dem.
regexp för att hitta rätt i materialet.

Pettolajnen 2007-01-07 20:58

Kan man inte på nått sätt skapa en temporär tabell i databasen där man kör in all data på nytt och skriver ut varje gång sidan uppdateras? Typ såhär:

Kod:

<?
$filepath = "http://www.beg.se/allaannonser.asp";

$contents = file($filepath);

mysql_query("CREATE TEMPORARY TABLE spider");

foreach ($contents as $row) {
 * *list($datum, $bild, $rubrik, $beskrivning, $kategori, $lan, $typ, $pris, $lank) = explode("|", $row);
        mysql_query("INSERT INTO spider ( `annonstyp` , `annons_kategori` , `annons_rubrik` , `annons_text` , `annons_lank` , `annons_pris` , `kontakt_lan` , `datetime` ) VALUES ('".$typ."','".$kategori."','".$rubrik."','".$beskrivning."','".$lank."','".$pris."','".$lan."','".$datum."')");
       
} ?>

bara det att jag inte riktigt vet hur man gör en temporär tabell

Pettolajnen 2007-01-07 21:28

Nej detdär var visst ingen bra idé då det tog sjukt lång tid för sidan att laddas.

Pettolajnen 2007-01-08 00:42

Snälla hjälp mig. Jag kan tyvärr inte betala er men jag kan erbjuda bannerplats på hemsidan om ni hjälper mig. Snälla! <3

Weaver 2007-01-08 07:36

Vad som är uteslutet är att du plockar denna infon varje gång en användare kommer in på sidan. Det kommer att göra användarupplevelsen väldigt dålig.

Vad du vill göra är att föra informationen närmare dig. Sedan beror det klart på hur du vill lagra den.

Ser två alternativ här:

Om du är rädd för databaser så kan du lagra det du läser från annonssajterna som rådata (som du får det från siten) i filer. Du kan uppdatera dina filer ett par gånger om dagen. För att parsa upp datan använder du explode. Detta är en relativt okomplicerad metod men inte alls effektiv eftersom du måste analysera datan varje gång du ska presentera den.

Det andra alternativet, som jag själv använder, och rekommenderar är att du laddar ned rådatan och analyserar. Efter analys är klar så sätter du in det i några databastabeller (ingen temporary). Detta är den helt klart snabbare metoden och underlättar saker som sökning. Ett litet problem jag ser här är att du måste hitta dubletter av annonser efter varje nedladdning. Kanske kan du göra en enkel crc32 hash över datum, titel och beskrivning för att avgöra om annonsen är unik eller inte. Om den inte är unik så sätter du helt enkelt inte in den i databasen.

Sedan rekommenderar jag också att du cachar undan det du läser från databasen, tex cachar det i en halvtimme. Lagra cachen i RAM med eAccelerator eller APC.

Pettolajnen 2007-01-08 11:50

Jag har kommit på hur min spindel ska se ut nu och det går ut på att jämföra databasen med handlarens index-fil helatiden. Först kolla om det kommit nya annonser och sedan kolla om någon annons från databasen inte gäller längre. Såhär ser det ut med kod:
Kod:

<?
$query_handlare=mysql_query("SELECT * FROM handlare");
while ($r_handlare=mysql_fetch_array($query_handlare)) {

$filepath = $r_handlare['link'];
$contents = file($filepath);


        // Kollar om det kommit nya annonser
        foreach ($contents as $row) {
  list($datum, $bild, $rubrik, $beskrivning, $kategori, $lan, $typ, $pris, $lank) = explode("|", $row);
       
        $query_new=mysql_query("SELECT * FROM annonser WHERE h_id='".$r_handlare['id']."' AND h_lank='".$lank."'");
 if (mysql_num_rows($query_new) < 1) {
 mysql_query("INSERT INTO annonser () VALUES ()");
 }
       
       
       
        // Kollar om det försvunnit annonser
        $query_old=mysql_query("SELECT * FROM annonser WHERE h_id='".$r_handlare['id']."'");
        while ($old=mysql_fetch_array($query_old)) {
       
// PROBLEM: HÄR SKA DET KOLLAS OM DET FINNS NÅGON RAD DÄR $old['h_lank'] INTE FINNS MED, ISÅFALL SKA DEN RADERAS FRÅN DATABASEN
 foreach ($contents as $row) {
          list($datum, $bild, $rubrik, $beskrivning, $kategori, $lan, $typ, $pris, $lank) = explode("|", $row);
 }
       
        }

}
?>

MEN, ni ser mitt problem där vid rad 24 - 27. Hur gör man en count på hur många rader det finns där länken från databasen matchar en länk från någon rad i index-filen? Och om det är mindre än 1 så ska den raderas från databasen.

brokep 2007-01-08 12:43

Vet att detta är ett totalt okonstruktivt inlägg.. men det är ganska underhållande tråd det här.

Pettolajnen 2007-01-08 12:46

Ja de va faktiskt jävligt meningslöst inlägg, jag vill inte ens veta vad du tycker är underhållande med den, jag vill bara veta hur man kör en count() på foreach() efter hur många rader där $lank är samma som $old['h_lank'] från databasen.

Pettolajnen 2007-01-08 13:02

Förresten säg bara hur man gör för att kolla om t ex. "Hej" finns i en fil och i så fall skriva "Hej finns" annars "Hej finns inte".

freakalis 2007-01-08 13:22

Citat:

Originally posted by Pettolajnen@Jan 8 2007, 14:02
Förresten säg bara hur man gör för att kolla om t ex. "Hej" finns i en fil och i så fall skriva "Hej finns" annars "Hej finns inte".
http://se.php.net/manual/en/function.strpos.php

grazzy 2007-01-08 15:02

Rent programmeringstekniska detaljer tas med fördel upp på andra forum, typ phpportalen.net eller vart phpprogrammerare håller till nuförtiden.

Björn 2007-01-08 15:33

Citat:

Originally posted by Pettolajnen@Jan 7 2007, 20:56
Jo som sagt jag kan inte själv RSS så det är redan uteslutat. Och då vet jag som sagt att jag måste skapa en crawler. Kan man inte göra en själv då? Det borde väl inte vara allt för svårt eftersom alla index-filerna som den ska söka igenom ser likadana ut, en annons per rad i filen. Sedan är jag som sagt skeptisk till databas-användning eftersom det blir svårt att hantera t ex. när en annons tas bort från den ursprungliga sidan och när det kommer till annonser, eller när någon ändrar i sin annons. Det vore bättre att bara lista ut direkt från ursprungssidan.

Pengar har jag inga, men hoppas att få med min spindel/crawler :)

EDIT: Med ansluten handlare menar jag att jag har avtalat med handlaren t ex. Börjessons Båt att jag får ta information från deras hemsida. Och då ber jag dom fixa en såndär index-sida där annonserna radas ut en per rad. Än en gång, varken jag eller min målgrupp kan RSS så det är ingen idé att föreslå det ;)

"kan rss", det är ju bara en fil med text det med.. tror du missförstått användningsområdet lite, du kan ju lika gärna ta din info från en sådan korrekt formaterad fil som att skapa en egen standard, som dessutom kommer vara merjobb om det redan finns rss? Sen ang databasen... du lär väl behöva casha informationen på något vis, annars kommer det bli tungt om du får trafik på siten. Så att bara hämta rakt av är ingen bra ide tror jag.

iXam 2007-01-08 21:47

Citat:

Originally posted by Pettolajnen@Jan 8 2007, 14:02
Förresten säg bara hur man gör för att kolla om t ex. "Hej" finns i en fil och i så fall skriva "Hej finns" annars "Hej finns inte".
Med tanke på vad du vill göra och vad du verkar ha kunskaper att göra så tycker jag att du ska ta en sak i taget och börja med att lära dig dina verktyg, i detta fallet PHP.

Pettolajnen 2007-01-08 22:51

Men PHP kan jag någorlunda, det jag måste lära mig är ju tydligen RSS, nån som vet nån guide på svenska?

kers 2007-01-08 23:38

Pettolajnen: med all respekt så kan en bra start vara att förstå termerna du använder och sedan göra lite googling.

http://en.wikipedia.org/wiki/RSS_(file_format)
http://en.wikipedia.org/wiki/XML
http://en.wikipedia.org/wiki/Web_scraping

är en bra start.

Köp sedan en lämplig bok och besök diverse programmeringsrelaterad webbforum. Lycka till!

brokep 2007-01-09 00:59

Citat:

Originally posted by Pettolajnen@Jan 8 2007, 23:51
Men PHP kan jag någorlunda, det jag måste lära mig är ju tydligen RSS, nån som vet nån guide på svenska?

Helt ärligt - skulle nån påstå att dom kunde PHP och sen inte veta hur man hittade "en sträng i en textfil" så skulle jag nog inte påstå tillbaka att dem kan PHP.

Det är ingen skam i att inte kunna, men det är väldigt tråkigt när man ignorerar sina egna brister.

terlag 2007-01-18 01:03

Kan användarna på annonssidan göra | tecken i deras annonser? för isåfall faller väl hela ditt system.

Men använd Google lite så kommer du nog hitta något php-forum som kan fylla ditt nyfikna begär =)

Pettolajnen 2007-02-06 18:23

Jag är redan medlem på PHPportalen och PHPSidan sen långt tillbaka. Men dom säger bara samma sak som alla andra, att man ska googla eller köpa en bok. Jag ska inte säga högt vad jag tycker om sånna svar, det är inte så att jag tror att ni kommer argumentera för mig direkt.


Alla tider är GMT +2. Klockan är nu 22:17.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson