Implementation av en sökmotor och robot för webbsidor Av Jakob Bandelin Fördjupningsuppgift i kursen Artificiell intelligens, 729G50 Linköpings Universitet, 2007 Jakob Bandelin Jakob.bandelin@gmail.com Fördjupningsuppgift Artificiell intelligens, 729G50 Linköpings universitet, 2007 Förord Det här arbetet är en fördjupningsuppgift på kursen Artificell Intelligens, 729G50, på programmet för kognitionsvetenskap vid Linköpings universitet. Sammanfattning Sökmotorer använder robotar för att samla information om webbsidor och presentera dessa sidor efter relevans när en användare gör en sökning. Arbetet går kortfattat igenom hur sökmotorer och robotar är uppbyggda samt beskriver en implementation av en enkel sökmotor och robot. Sida 2 Jakob Bandelin Jakob.bandelin@gmail.com Fördjupningsuppgift Artificiell intelligens, 729G50 Linköpings universitet, 2007 Innehållsförteckning Förord ............................................................................................................................................... 2 Sammanfattning ............................................................................................................................. 2 Innehållsförteckning ...................................................................................................................... 3 Inledning .......................................................................................................................................... 4 Bakgrund ..................................................................................................................................... 4 Syfte .............................................................................................................................................. 4 Metod och upplägg ................................................................................................................... 4 Litteraturgenomgång..................................................................................................................... 5 Sökmotorers anatomi ................................................................................................................ 5 Sökmotorers intelligens ............................................................................................................ 5 Robotens anatomi ...................................................................................................................... 7 Robotens intelligens .................................................................................................................. 7 Implementationen...................................................................................................................... 8 Sökmotorn............................................................................................................................... 8 Roboten.................................................................................................................................... 9 Avslutning ..................................................................................................................................... 10 Slutsatser från implementationen ........................................................................................ 10 Diskussion kring sökmotorerna ........................................................................................... 10 Referenser....................................................................................................................................... 12 Länkar......................................................................................................................................... 12 Bilagor ............................................................................................................................................. 13 index.php................................................................................................................................... 13 robot.php5 ................................................................................................................................. 14 Sida 3 Jakob Bandelin Jakob.bandelin@gmail.com Fördjupningsuppgift Artificiell intelligens, 729G50 Linköpings universitet, 2007 Inledning Bakgrund På Internet finns många webbsidor fyllda med information. Problemet för internetanvändaren är att hitta bland informationen. För att underlätta sökandet har det utvecklats sökmotorer som snabbt kan ge svar på vilka sidor en besökare kan vara intresserad av utifrån olika sökord. Problemet för sökmotorerna är att presentera de sidor som är mest relevanta för användaren. De använder olika mer eller mindre intelligenta strategier när de samlar, ordnar och presenterar sitt innehåll. Sökmotorerna använder agenter, även kallade robotar eller crawlers, för att förse sig med information om webbsidor och deras innehåll. Syfte Syftet med denna fördjupningsuppgift är att gå igenom hur en sökmotor och robot fungerar. Utifrån teorin görs en implementation av en sökmotor där en intelligent strategi används för att avgöra vilka webbsidor som är relevanta för en sökning. För att fylla sökmotorn med information krävs också implementation av en robot. Metod och upplägg En kort litteraturgenomgång följs av en beskrivning av implementationen. Rapporten avslutas med slutsatser från implementationen och en diskussion. Sida 4 Jakob Bandelin Jakob.bandelin@gmail.com Fördjupningsuppgift Artificiell intelligens, 729G50 Linköpings universitet, 2007 Litteraturgenomgång Sökmotorers anatomi En sökmotor för Internet är ett webbaserat gränssnitt kopplat till en databas. I databasen finns information om webbsidors innehåll och deras internetadresser, url. När en användare skriver in ett eller flera sökord i gränssnittet är det sökmotorns uppgift att gå igenom den information den har i sin databas och returnera till användaren de sidor som kan tänkas vara relevanta för användaren. För att analysera vilka av de lagrade sidorna som är mest intressanta används olika funktioner. Sökmotorers intelligens Det mest grundläggande sättet för en sökmotor att avgöra hur relevant en sida är för en sökning är att helt enkelt räkna förekomsten av sökordet, eller sökorden. Den sida som har flest träffar bedöms som mest relevant. För att ge ännu bättre resultat så används även andra knep. Ett sätt är att ge mer vikt, eller poäng, om sökorden förekommer på vissa ställen på webbsidan, det vill säga i hemsidans kod. Sidor som har sökorden i titeln eller inom vissa taggar som <h1> eller <em> ger mer vikt eftersom dom bedöms vara mer relevanta för användaren än sidor som saknar sökorden i rubriker och dylikt. För att undvika att det kommer upp sökresultat där någon bara fyllt sidor med ord så viktas ofta resultatet så att sidor med få ord i titeln, och så vidare, får bättre poäng. Sökord som dyker upp långt ner på sidan ges mindre eller inga poäng. Analys av vilka sidor som länkar till och från webbsidan påverkar också dess bedömda relevans. Samma sak gäller för hur sidans adress ser ut. Adresser som slutar på / eller .html ger bättre poäng än de som slutar på exempelvis ?articleID=57743&Session=3oiurweoiruweiouweriuwuv5&cookie=set. (Arasu, 2001. Brin & Page, 1998. Pinkerton, 1994). Sökmotorer vill gärna ha sidor som är byggda på ett visst sätt. Följande är från Googles Design and content guidelines: • Make a site with a clear hierarchy and text links. Every page should be reachable from at least one static text link. Sida 5 Jakob Bandelin Jakob.bandelin@gmail.com • Fördjupningsuppgift Artificiell intelligens, 729G50 Linköpings universitet, 2007 Offer a site map to your users with links that point to the important parts of your site. If the site map is larger than 100 or so links, you may want to break the site map into separate pages. • Create a useful, information-rich site, and write pages that clearly and accurately describe your content. • Think about the words users would type to find your pages, and make sure that your site actually includes those words within it. • Try to use text instead of images to display important names, content, or links. The Google crawler doesn't recognize text contained in images. • Make sure that your TITLE tags and ALT attributes are descriptive and accurate. • Check for broken links and correct HTML. • If you decide to use dynamic pages (i.e., the URL contains a "?" character), be aware that not every search engine spider crawls dynamic pages as well as static pages. It helps to keep the parameters short and the number of them few. • Keep the links on a given page to a reasonable number (fewer than 100). (http://www.google.com/support/webmasters/bin/answer.py?answer=35769. Hämtad 2007-10-10.) Ett citat från “What is a tall poppy among web pages?” ger också en vink om hur en webbsida skall vara uppbyggd för att hamna på en bra plats hos sökmotorerna (Pringle, 1998): “If you want your web page to stand out above the crowd for appropriate searches on several search engines the following are good tactics. Give informative title, headings, meta fields and, of course, text. Include important keywords in the title, headings and meta fields but do not use excessive repetition which will be caught out. Consider using terms in full more often than one would in normal writing, rather than using pronouns and other indirect ways of referring to subjects. It may be necessary to have different pages to attract different kinds of reader who might use different language and jargon - the novice, the expert, the technician, the end-user, etc. - but avoid spamming and do not attempt to attract search engines by deceit.” Sida 6 Jakob Bandelin Jakob.bandelin@gmail.com Fördjupningsuppgift Artificiell intelligens, 729G50 Linköpings universitet, 2007 Robotens anatomi Roboten har en databas med adresser som den skall besöka. Det kan vara sidor som den redan besökt men skall göra ett återbesök till eller helt nya sidor. När den kommer till en sida rapporterar den till sökmotorns databas vad den hittar. Den lägger till de länkar den hittar på sidan i sin adressdatabas. Robotens intelligens Om roboten väljer de länkar den skall besöka i första hand med omsorg kommer sökmotorn få ett bättre index (Cho, 1998). När roboten skall rapportera till sökmotorn måste den tampas med att korrekt tolka den kod den hittar. Det är inte säkert att sidorna är korrekt skrivna och HTML-taggarna kan vara mer eller mindre nästlade i varandra. Roboten måste också ta reda på om den får läsa en sida överhuvudtaget. På de flesta webbservrar finns en fil som talar om om det finns dokument som inte skall sparas i sökmotorer. Roboten måste också visa hänsyn till att den tar mycket resurser från de system som den letar igenom. En snabb robot kan läsa flera hundra sidor i sekunden så det är bra om den kan bearbeta olika webbplatser samtidigt. (Arasu, 2001. Brin & Page, 1998. Pinkerton, 1994). Sida 7 Jakob Bandelin Jakob.bandelin@gmail.com Fördjupningsuppgift Artificiell intelligens, 729G50 Linköpings universitet, 2007 Implementationen Bild 1. Sökmotorn. Sökmotorn För sökmotorn byggdes en webbsida i html, css och php med ett formulär där användaren kan skriva in sitt sökord och skicka iväg. Sökmotorn svarar då med att visa en sida med resultatet av sökningen(se bild 1). För att sökmotorn skall kunna utföra sin uppgift behövdes en databas, som byggdes i MySQL, med ett par tabeller: • Urls, lagrade sidors adress (url) och ett id • Titles, lagrade en sidas titel som kopplades till ett urls id • Contents, lagrade en sidas innehåll och kopplade det till en urls id • Lexicon, lagrade alla de ord som roboten stötte på under sin färd på WWW. Varje ord kopplades till ett id. Sida 8 Jakob Bandelin Jakob.bandelin@gmail.com • Fördjupningsuppgift Artificiell intelligens, 729G50 Linköpings universitet, 2007 Counts, lagrade det poäng som en sida, url id, fått för ett visst ord, lexicon id. När användaren sökte så kontrollerade sökmotorn vilket lexicon-id sökordet hade. Sedan hämtade den de sidor som fått högst poäng på det ordet och skrev ut titel, url och en sammanfattning av innehållet i en lista. För att enklare kunna se hur väl poängsättningen fungerade skrevs även poäng ut för sidan (bild 1). Roboten Roboten använde en tabell i databasen för att lagra adresser. När den kom till en ny sida kontrollerade den först om den fick läsa sidan för servern. Om den fick läsa sidan tog den ut alla länkar på sidan och kontrollerade om det var några länkar som redan var lagrade i sökmotorn eller låg i tabellen och väntade på att bli besökta. De nya länkarna lagrade roboten i sin att-besöka-tabell. För att inte belasta en enskild server och få lite spridning på vad den besökte valde den slumpvis adress att besöka. När den tagit länkarna så plockade roboten ut titeln från sidan och sidans innehåll. Sen plockade roboten bort tecken som inte skulle vara med i sökmotorns index såsom %, #, !, med flera. För att snabba på analysen av sidorna och minska storleken på sökmotorns databas plockades även de 25 vanligaste förekommande orden i engelska bort (British National Corpus®, http://www.natcorp.ox.ac.uk/). Sen gick roboten igenom titel och sidans innehåll och summerade ord för ord hur många poäng sidan fick. Poängsättningsfunktionen satte ihop titel med innehållet och gav fem poäng till de första hundra orden, två poäng till de nästa etthundra femtio orden och ett poäng till och med det ord som kom på plats femhundra. Ord som kom senare fick inga poäng. Sida 9 Jakob Bandelin Jakob.bandelin@gmail.com Fördjupningsuppgift Artificiell intelligens, 729G50 Linköpings universitet, 2007 Avslutning Slutsatser från implementationen • Det är svårt att parsa kod som är felaktigt skriven. • Databasen blir snabbt en flaskhals. Jag byggde den inte på ett bra sätt. • Tabellen med länkar som skulle besökas växte explosionsartat. Även när jag tagit bort så att bara länkar som började med “http://” fick ta plats så växte den fort. På ungefär 350 sidor kan man lätt samla på sig över 10 000 länkar. • En del sidor är väldigt stora så det var bra att klippa av dem innan de analyserades eftersom det ändå bara de femhundra första orden som skulle få poäng. • När jag tog bort de 25 vanligaste engelska orden från analys och lagring ökade hastigheten på roboten markant. • När jag tog bort flera specialtecken från analys och lagring så växte lexikonet mycket långsammare. Det växte ändå förvånansvärt snabbt, snabbare än vad jag förväntat mig. Femhundra urls i sökmotorn gav runt 20 000 ord i lexikonet. • Det gick att ändra i poängsättning och annat utan att hämta hem alla sidor på nytt om man kan tolerera att det finns kvar sidor med gammal poängsättning. En smartare implementation av databaser och sökmotor hade varit att inte låta roboten poängsätta utan att låta det ske och skötas av sökmotorn när den fick en sökning. • Poängsättningen verkar vara rätt så ok. Men mitt index är för litet, knappt 1 000 sidor för att kunna avgöra hur ok det skulle vara med fler webbsidor i index. Diskussion kring sökmotorerna Sökmotorernas uppgift är att presentera bra sökresultat till användarna. För att göra det måste de minimera felaktiga träffar och sökresultat där individer eller organisationer med hjälp av olika knep manipulerar sig till bra placeringar. Det finns fler än tio miljarder webbsidor och skapas fler varje dag. Google har gått från två analyser, sin berömda PageRank och en som kontrollerar ord som kommer tidigt på en sida, till runt 200 olika analyser enligt egen utsago i en artikel i New York Times (Hansell, 2007). Nuförtiden räcker det inte med ett stort index. Sökmotorerna måste bli Sida 10 Jakob Bandelin Jakob.bandelin@gmail.com Fördjupningsuppgift Artificiell intelligens, 729G50 Linköpings universitet, 2007 smartare – både för att hålla fuskare borta och för att presentera bra resultat. Det verkar lovande med att göra ingående semantiska analyser av sidor och sökningar. Det är svårt att veta hur mycket som redan finns i sökmotorerna idag eftersom det är hårt skyddade affärshemligheter. Jag tror också det kommer dyka upp fler nichade sökmotorer som specialiserar sig på olika ämnen och tjänster. Dessa kommer kunna ha mycket mer hårt tweakade analysfunktioner än de allmänna sökmotorerna. Dom behöver inte heller crawla hela nätet utan kan försöka räkna ut vilka sidor som är intressanta att besöka oftare. Så förmodligen har vi snart även meta-sökmotorer där man kan söka reda på vilken sökmotor man skall använda för att söka efter en viss sak. För att förbättra sina resultat håller sökmotorerna gärna kolla på vad användaren sökt efter tidigare och var sökningen kommer ifrån. När sökmotorerna vill skräddarsy träfflistan efter användarens sökhistorik blir det också en etisk fråga om personlig integritet. Vill vi verkligen ha sökmotorer som vet allt om vad vi gör på nätet – även om dom ger oss kanonbra sökträffar? Sida 11 Jakob Bandelin Jakob.bandelin@gmail.com Fördjupningsuppgift Artificiell intelligens, 729G50 Linköpings universitet, 2007 Referenser Arasu, A., Cho, J., Garcia-Molina, H., Paepcke, A., and Raghavan, S. Searching the Web ACM Trans. on Internet Technology 1(1), 2-43, 2001. Brin, Sergey and Page, Larry (1998). The Anatomy of a Large-Scale Hypertextual Web Search Engine. Proceedings of the seventh international conference on World Wide Web. Junghoo Cho, Hector Garcia-Molina, Lawrence Page. Efficient Crawling Through URL Ordering. In Proceedings of the the World Wide Web conference (WWW), Brisbane, Australia, April 1998. Hansell, Saul. Google Keeps Tweaking Its Search Engine, New York Times. Published: June 3, 2007. Pinkerton, Brian. Finding What People Want: Experiences with the WebCrawler. The Second International WWW Conference Chicago, USA, October 17–20, 1994. Scoring mechanisms. Pringle, Glen, Allison, Lloyd and Dowe, David L. What is a tall poppy among web pages? in Proc. 7th Int. World Wide Web Conference, Brisbane, pp369-377, April 1998, & Comp. Networks & ISDN Systems 30(#1-7). Länkar Googles Webmaster Guidelines. Design and content guidelines. http://www.google.com/support/webmasters/bin/answer.py?answer=35769 Hämtad 2007-10-10. Sida 12 Jakob Bandelin Jakob.bandelin@gmail.com Fördjupningsuppgift Artificiell intelligens, 729G50 Linköpings universitet, 2007 Bilagor index.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <title>Search engine</title> <link rel="stylesheet" href="stylesheets/basic.css" type="text/css" media="screen" title="no title" charset="utf-8" /> </head> <?php $word = htmlspecialchars(trim($_POST['word'])); include('includes/db.inc.php'); $db = db_connect(); ?> <body> <div id='content'> <div id="search"> <h1>Search Engine</h1> <?php $query = "SELECT * FROM lexicon"; $result = mysql_query($query); $words = mysql_num_rows($result); $query = "SELECT * FROM urls"; $result = mysql_query($query); $urls = mysql_num_rows($result); ?> <p class='info'>Current index is <?=$urls?> urls and <a href='lexicon.php'>lexicon</a> containing <?=$words?> unique words.</p> <form action="index.php" method="post"> <input type="text" name="word" value="<?=$word?>" /> <input type="submit" name="submit" value="search" /> </form> </div> <div id='results'> <?php if ($word != "") { print "<p class='status'>Search results for word: $word</p>"; $query = "SELECT lexiconid FROM lexicon WHERE word = '$word'"; //print "$query<br />"; $result = mysql_query($query); $row = mysql_fetch_row($result); $lexiconid = $row[0]; if ($lexiconid != "") { // print "lexiconid: $lexiconid<br />"; $query = "SELECT urlid, count FROM counts WHERE lexiconid = '$lexiconid' ORDER BY count DESC LIMIT 10"; // print "query: $query<br />"; $result = mysql_query($query); while($row = mysql_fetch_array($result)) { Sida 13 Jakob Bandelin Jakob.bandelin@gmail.com Fördjupningsuppgift Artificiell intelligens, 729G50 Linköpings universitet, 2007 $urlid = $row['urlid']; $count = $row['count']; $subquery = "SELECT url FROM urls WHERE id = '$urlid'"; $subresult = mysql_query($subquery); $r = mysql_fetch_row($subresult); $url = $r[0]; $subquery = "SELECT title FROM titles WHERE urlid = '$urlid'"; $subresult = mysql_query($subquery); $r = mysql_fetch_row($subresult); $title = htmlspecialchars(substr($r[0], 0, 64)); $subquery = "SELECT content FROM contents WHERE urlid = '$urlid'"; $subresult = mysql_query($subquery); $r = mysql_fetch_row($subresult); $content = htmlspecialchars(substr($r[0], 0, 256)); if ($title == "") { $title = $url; } print "<p class='title'><a href='$url'>$title</a></p> <p class='url'>$url</p> <p class='content'>$content</p> <p class='keywordcount'>Score: $count</p>"; } } if ($lexiconid == "") { print "<p>No search results for: $word</p>"; } } ?> </div> <div id='footer'> <p>This simple search engine is built for the AI course at Link&ouml;ping univeristy, by Jakob Bandelin.</p> </div> </div> </body> </html> robot.php5 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <title>robot</title> </head> <body> <?php include("robotsallowed.php"); include("includes/db.inc.php"); $db = db_connect(); function getTitle($s) { $s = stristr($s, '<title>'); $s = substr($s, 7); $s = explode("</title>", $s); $s = htmlspecialchars(substr($s[0], 0, 128)); return $s; Sida 14 Jakob Bandelin Jakob.bandelin@gmail.com Fördjupningsuppgift Artificiell intelligens, 729G50 Linköpings universitet, 2007 } function acceptableWord($s) { //remove 25 most common enlish words $unwanted = array("the", "of", "to", "and", "a", "in", "is", "it", "you", "that", "he", "was", "for", "on", "are", "with", "as", "I", "his", "they", "be", "at", "one", "have", "this", " "); $s = str_ireplace($unwanted, "", $s); if ($s == "") { return false; } return true; } function getRandomUrlId() { $query = "SELECT id, url FROM urlstack"; $result = mysql_query($query); $rows = mysql_num_rows($result); $rand = rand(0, $rows); for ($j = 0; $j < $rand; $j++) { $row = mysql_fetch_row($result); } $id = $row[0]; $url = $row[1]; // for debugging - print "random is: $rand, url is: $url"; // if the stack happens to be empty go to delicious else remove it from the stack and return it if ($rows == 0) { $url = "http://del.icio.us"; } else { $query = "DELETE FROM urlstack WHERE id = '$id'"; $result = mysql_query($query); } return $url; } function getLinksAndContentFromUrl($url) { ini_set('user_agent', 'JBAI (http://www.bandelin.se/ai/robotinfo.html)'); if(robots_allowed($url, "JBAI")) { $input = @file_get_contents($url); if ($input == "") { $returnstr = "access denied for: $url"; return $returnstr; } $regexp = "<a\s[^>]*href=(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/a>"; if(preg_match_all("/$regexp/siU", $input, $matches, PREG_SET_ORDER)) { foreach($matches as $match) {}} //get links //add each if not added already foreach($matches as $match) { $link = $match[2]; $substr = substr($link, 0, 7); //print "<h3>analysing: $link</h3>"; if ($substr != "http://") { //print "skipped"; } if ($substr == "http://") { // will only take the links starting with http:// $query = "SELECT * FROM urlstack WHERE url = '$link'"; Sida 15 Jakob Bandelin Jakob.bandelin@gmail.com Fördjupningsuppgift Artificiell intelligens, 729G50 Linköpings universitet, 2007 $result = mysql_query($query); $rows1 = mysql_num_rows($result); $query = "SELECT * FROM urls WHERE url = '$link'"; $result = mysql_query($query); $rows2 = mysql_num_rows($result); if ($rows1 > 0) { //print "in stack already.<br />"; } elseif ($rows2 > 0) { //print "in index already.<br />"; } else { $query = "INSERT INTO urlstack (id, url) VALUES ('', '$link')"; $result = mysql_query($query); //print "added to stack!<br />"; } } } } return $input; } function addRandomSite() { $url = getRandomUrlId(); print "<h3>$url</h3>"; //some feedback is always nice //process links -> content $input = getLinksAndContentFromUrl($url); if ($input != "could not access url") { //Store the URL $query = "INSERT INTO urls (id, url) VALUES ('', '$url')"; $result = mysql_query($query); $query = "SELECT id FROM urls WHERE url = '$url'"; $result = mysql_query($query); $row = mysql_fetch_row($result); $urlid = $row[0]; //Get & Store the title from input $title = getTitle($input); if ($title == "") { $title = $url; } $query = "INSERT INTO titles (urlid, title) VALUES ('$urlid', '$title')"; $result = mysql_query($query); print "<h4>Title: $title</h4>"; //Get the words and clean up some $unwanted = array("<", "+", "-", ":", "[", "]", "_", "", "", "", "", ">", "/", "'","=", "?","!", "#", "&", "%", "|", ",", ".", ";", "(", ")", "{", "}", "*", "\"", "\n"); $input = strip_tags($input); $content = htmlspecialchars(substr(trim($input), 0, 255)); $input = trim(str_replace($unwanted, " ", $input)); $title = trim(str_replace($unwanted, " ", $title)); print "<p>going to explode:<br />INPUT: $input<br />TITLE: $title<br />"; print "<p>SUMMARY: $content</p>"; //print "<h2>String is now</h2>"; //print "$s"; $exploded = explode(" ", $input); // n first words $exploded_title = explode(" ", $title); Sida 16 Jakob Bandelin Jakob.bandelin@gmail.com Fördjupningsuppgift Artificiell intelligens, 729G50 Linköpings universitet, 2007 $exploded = array_merge($exploded_title, $exploded); $query = "INSERT INTO contents (urlid, content) VALUES ('$urlid', '$content')"; $result = mysql_query($query); $c = 0; //for giving the first words more value print "WORDS:"; foreach($exploded as $word) { $word = trim($word); if (acceptableWord($word)){ //fix the scores $c++; $value = 0; if ($c > 500) { break; } if ($c < 500) { $value = 1;} if ($c < 250) { $value = 2;} if ($c < 100) { $value = 5;} //if word is not in lexicon add it print "$word($value), "; $query = "SELECT * FROM lexicon WHERE word = '$word'"; $result = mysql_query($query); $rows = mysql_num_rows($result); if ($rows == 0) { $query = "INSERT INTO lexicon (lexiconid, word) VALUES ('', '$word')"; $result = mysql_query($query); } //get lexicon id $query = "SELECT lexiconid FROM lexicon WHERE word = '$word'"; $result = mysql_query($query); $row = mysql_fetch_row($result); $lexiconid = $row[0]; //add count $query = "SELECT count FROM counts WHERE lexiconid = '$lexiconid' AND urlid = '$urlid'"; $result = mysql_query($query); $rows = mysql_num_rows($result); if ($rows == 0) { $query = "INSERT INTO counts (count, urlid, lexiconid) VALUES ('$value', '$urlid', '$lexiconid')"; $result = mysql_query($query); } $query = "SELECT count FROM counts WHERE lexiconid = '$lexiconid' AND urlid = '$urlid'"; $result = mysql_query($query); $row = mysql_fetch_row($result); $count = $row[0] + $value; $query = "UPDATE counts SET count = '$count' WHERE urlid = '$urlid' AND lexiconid = '$lexiconid'"; $result = mysql_query($query); } } } else { print "Access denied by robots.txt."; } } ?> Sida 17 Jakob Bandelin Jakob.bandelin@gmail.com Fördjupningsuppgift Artificiell intelligens, 729G50 Linköpings universitet, 2007 <?php for ($k = 0; $k < 50; $k++) { //add 50 sites print "$k..."; addRandomSite(); } //stop loop ?> </body> </html> Sida 18