Skrive en Web Robot i Delphi

I denne artikkelen viser David Bolton hvordan å lage en enkel web-robot som gjør flere parallelle søk på en søkemotor og besøk hvert nettsted i resultatene og nedlastinger som siden. I denne artikkelen viser David Bolton hvordan å lage en enkel web-robot som utfører flere parallelle søk på en søkemotor så besøker hvert nettsted i resultatene og laster ned den siden. Den bruker ActiveX-komponenter levert av Internet Explorer 4 eller 5.Caveat- koden som opprinnelig ble skrevet ville jobbe med Altavista, men det har endret seg sannsynligvis et dusin ganger så det som sannsynlig å fungere som din sjanse for bicyling opp Mt Everest! Copernicus (www.copernic.com) er en fantastisk (og gratis) søkemotor som søker, og de utsteder oppgraderinger for bestemte motorer på en jevnlig basis. Hvis du ønsker å skrive en, leke med Copernicus. Jeg vurdere det 11 av 10. (Nei jeg har ingen finanicial eller på annen måte tilknytning til dem-jeg er bare en veldig veldig fornøyd kunde) .Selv om det høres eksotisk, en bot (også kjent som en edderkopp, intelligent agent, Web robot, crawler, robot, og så videre) er rett og slett et program som besøker en rekke nettsteder. De mest kjente roboter er selvfølgelig edderkoppene som brukes av ulike søkemotorer for å katalogisere nytt innhold. Ta en titt på nettet og du vil finne massevis av referanser og detaljer. Det er enda en bok om emnet, utgitt av Microsoft Press: Programmering Bots, edderkopper og intelligente agenter i Visual C ++, av David Pallmann (ISBN 0-7356-0565-3). Det er vel verdt å få hvis du er interessert i å skrive roboter og du ikke tankene vade gjennom C ++ koden.Når du oppretter en bot, bør du være klar over at materialet boten samler fra nettsteder som det besøker kan godt være opphavsrettsbeskyttet-så vær forsiktig med hvordan du bruker den. En annen ting å huske på er dette: Hvis bot besøker et webområde gjentatte ganger, kan det forstyrre nettstedets eiere, spesielt hvis de bærer betalt annonsering. For en lignende reaksjon, bare nevne Video Recorders som automatisk hopper annonser eller Tivo til annonsering folk. Selvfølgelig, hvis boten ikke hamre et bestemt webområde og blir lagt merke til, kan du finne at din IP-adresse er ikke lenger adgang til dette området (Den fryktede 403!). I så fall en oppringt konto der ISP gir deg en dynamisk IP-adresse er trolig en mye bedre idé. Jeg skal diskutere Robot Exclusion Standard senere i forhold til this.The stort problem med å rulle din egen bot er ikke å skrive koden, det er hvor rask Internett-koblingen er. For seriøs gjennomgang, trenger du en permanent link, ikke ringe opp! Programmerbar browsingMicrosoft har gjort livet mye enklere for bot skapere (og virus skapere, trojanske forfattere!) Av sin vanlige praksis med å inkludere et par ActiveX surfing objekter i Internet Explorer (IE ) siden versjon 4. Egentlig er dette gjenbrukbare 'motor' tilnærming er å bli beundret, hvis bare det var ikke misbrukes så mye! Hvis du bruker dem, de tar vare på 99 prosent av den vanskelige ting som internett, brannmurer, og ved hjelp av HTTP for å laste ned sidene 'HTML. IE har mye funksjonalitet innebygd, og mye av det er tilgjengelig. IE tre hadde noen gjenstander i det, men jeg er ikke sikker på om disse er brukbare i samme way.If du er en ivrig IE hater, ta hjertet! Du trenger ikke å forråde dine prinsipper eller hoppe over denne artikkelen. Når du bruker IE formåls, du aldri se IE-det er fullt integrert i Windows.WebBrowser er navnet på ActiveX objekt fra IE. Med Delphi 3, hvis du har IE installert på PC-en, må du opprette typebiblioteket unit gå til Import ActiveX-kontroller i Delphi, velg Microsoft Internet Controls, og klikk installere. Du skal nå se TWebBrowser_V1, TWebBrowser, og TShellFolderViewOC i kategorien ActiveX på komponenten paletten. Vi skal bruke TWebBrowser. Delphi 4 presenterer et problem på grunn av endringer i håndtering av ActiveX mellom Delphi versjoner 3 og 4. Et program som gikk fint etter Delphi 3 genererer en EOLESysError henhold Delphi 4: ". CoInitialize ikke Called" Typen bibliotek Pascal kilde for kontrollen er nå dobbelt så stor som i Delphi 5 enn det var i Delphi 3. Hvis du har Delphi 4, foreslår jeg at du enten oppgradere til Delphi 5 eller finne noen som har det og se om Delphi 5 Shdocvw .pas fungerer for deg. Alle IE objektet funksjonaliteten ligger i shdocvw.dll.If du har Delphi 5 eller 6, trenger du ikke å gjøre dette. TWebBrowser har erstattet den eldre THTML komponent og den siste komponenten på Internett Tab. Du får også en demo for å bruke dette i mappen Demos /Coolstuff, og hjelpefilen har noen ting på TWebBrowser, men merkelig, Borland har ikke lagt den TWebBrowser_V1 komponent, selv om det er i kildefilen. Hvis du ønsker å finne ut mer om bruk TWebBrowser eller TWebBrowser_V1, gå til www.microsoft.com og gjøre et søk, eller få Delphi 5 for hjelpefilen! TWebBrowser er et veldig enkelt komponent for å arbeide med. Omtrent halvparten av eiendommene kan ignoreres som de er for det synlige IE-grensesnittet for å kontrollere den elektroniske utseendet på IE-lignende verktøylinjer eller visning på full skjerm. Synlig egenskapen avgjør om vi kan se nettleservinduet eller ikke. I den endelige søknaden, vil brukeren aldri se det, men det kan være nyttig for debugging.The enkleste måten å bruke WebBrowser er ved å ringe Naviger (URL) -metoden, deretter håndtering av OnNavigateComplete2 hendelsen og bruke Document eiendommen for å få tilgang til nedlastede side. Selv om det er to andre hendelser-OnDocumentComplete og OnDownloadComplete-som skal hjelpe avgjøre om en nettside ble lastet ned, fant jeg det lettere å behandle alt fra OnNavigateComplete2. Dette utløser kun når nettleseren har fått flyttet til den angitte URL; Men det er forvirret av flere rammer, så litt ekstra omsorg må tas, så vil du see.WebBrowser gir deg flere egenskaper som forenkler oppgaven med å trekke ut dataene. Disse egenskapene inkluderer Links, ankere, applets, skjemaer, rammer, stilark, og noen flere. Det eneste problemet, spesielt når rammer er brukt, sortering agnene fra hveten-hvilke koblinger er gyldige, og som kan være annonser eller andre tjenester? I så fall, er den eneste måten å gjøre det på er å skanne HTML og trekke ut relevant informasjon. Når hver side er lastet ned, kan det være tilgang directly.Frames Som du kanskje vet, mange søkesider ikke indeks rammer. Et HTML-dokument kan bestå av en eller flere rammer. Hvilke ramme holder det du vil? Det er vanligvis den første (og ofte eneste) side. Den eneste pålitelige måten er å gå gjennom hver side på jakt etter tekst og deretter søker dette for strenger som identifiserer resultater. En mye større problem er det flere utløsning av de ulike DocumentComplete, DownloadComplete, og NavigationComplete hendelser. Mye debugging, banning, og hårfjerning skjedde før jeg skjønte hva som skjedde. Ignorer DownloadComplete. I stedet bruker enten DocumentComplete eller NavigationComplete. Jeg gjorde noen flere eksperimenter og fant ut at den beste måten var å bruke en og sjekke om et dokument var klar med VarIsEmpty (fwebbrowser.document). Så får rammen fra nettleseren Document: = fWebBrowser.Document, telle antall rammer, og indeksen gjennom dem. Frame 0 bruker script.top, mens andre rammer bruke frames.Item (indeks). Legg merke til den grunnleggende type matrise indeksering. Fra rammen, sjekk document.body, og trekke den faktiske teksten fra dette. Vær oppmerksom på at createtext vil føre til et unntak hvis det er ingen tekst, som i et banner objekt derav try-bortsett fra å fange den. På dette punktet har vi komplett HTML-kode, og alt vi gjør neste er å få de resultatene og navigasjonskoblinger fra it.HTML scanningWhen jeg teste dette, jeg brukte ordet Alternativer på Altavista. Siden som ble returnert inneholdt 85 ledd i henhold til nettleseren linker (document.links.Items (Index) eiendommen er brukt). Av disse er bare 10 er resultater og en del er fra annonser, bannere, og sånn samt navigasjonskoblinger. Oppsettet er forskjellig for hver søkemotor resultat, og en HTML-analyse objekt ville gjøre en god ide for en fremtidig artikkel. Jeg har stuck med Altavista, som andre søkemotorer legge ut ting på sin egen måte. For å holde koden kort, har jeg brukt to tekst strings- "Altavista funnet" og "Result Pages" -to markere start og stopp av resultatet hopp. Alle nettadresser (se etter "href =") som oppstår mellom disse to strenger, og ikke inneholde teksten definert i ignorere teksten (som "jump.altavista") er used.Program structureEverything sentre på tre komponenter: TSearchEngine, TFetchResult, og TResultHandler. En liste over TSearchEngines er konstruert ved programstart med hvert objekt å holde detaljer som trengs for å bruke denne motoren og en forekomst av WebBrowser objektet. Søkestrengen er gått til denne listen, og hver komponent starter deretter en spørring med egen motor. Resultat linker kommer tilbake til en sentral liste, men som samtidig er forsiktig med å serial tilgang til denne listen gjennom en enkel vakt variabel (fbusy) for å hindre to liste tillegg oppstår på samme tid. Hvis det var bare én operasjon blir gjort, dette kan unngås, men jeg har en liste søk i tillegg, og dette tar tid, så vakten variable må være used.For en typisk søkemotor som Altavista, er spørringen behandles av en cgi -bin script kalt spørring med ulike parametere lagt til noe som dette for søkestrengen "søk tekst" (sitater inkludert): pg = q & kl = no & q =% 22search tekst% 22 & STQ = 20, som jeg forstår som pg = q (det er en spørring), kl = no (språk er engelsk), og STQ = 20 (resultatene begynner med 20-resultat) sikret klasse TSearchEngine har metoder PostQuestion, ExtractResultLinks, og NavigateNextResultPage og setter WebBrowser hendelseshåndterere å handle deretter . Mesteparten av programmet tid er brukt på å gjøre noe mer enn å vente på nettleseren hendelser for å utløse. Jeg har tatt med en enkel tilstand mekanisme slik at brukere av denne klassen kan avgjøre hva som skjer, og det er i stand til å holde oversikt over hva det er ment å være doing.For hver resultat kobling funnet, er en TFetchResult komponent opprettet og lagt til en liste over henter. Hver forekomst av denne klassen har sin egen WebBrowser komponent og hendelseshåndterer kode. Jeg brukte en liste for å forenkle sporing av alle hentinger. Jeg bruker en timeout periode (standard 240 sekunder), og hvert 30. sekund, er hele listen over hent skannet og sjekket for tidsavbrudd. En global timer er lysere på Windows-ressurser enn en tidtaker for hvert objekt. Som det er også vanskelig å nøyaktig fastslå når en side er ferdig nedlastet, gir dette timeout en ryddigere måte å gjøre it.If en hente lykkes, er HTML-innholdet i dokumentet lagres til en resultat mappe. Jeg har ikke tatt grafikken for å holde koden kortere. Filnavnet er avledet fra rammen navn etter fjerning uakseptabelt characters.ParallelismIn en måte er dette en flertrådet program med en rimelig grad av parallellitet, selv om det er ingen tråder som brukes eksplisitt. Hver av nettleseren komponentene anvendes uavhengig av hverandre, en i hver TSearchEngine og en i hvert TFetchResult. Det synes å være noen øvre grense for antall parallelle søk, selv om den generelle hastigheten er selvsagt gjenstand for båndbredde på Internett link.If du var å skrive et fullstendig produkt, vil du sannsynligvis opprette en config fil med noen måte å definere spørringen format for hver motor den kan håndtere samt utpakking resultat lenker. Hver søkemotor gir resultater i ulike formater og kan godt endre formatet når de like.There er også stor sannsynlighet for at to eller flere søk vil gi samme nettadresse. Jeg får rundt det ved å søke på listen over aktuelle hentinger. Jeg foreslår en annen liste brukes, da dette bare holder dagens hentinger. Før henting av resultatene fra en bestemt nettadresse, er et raskt søk gjort av denne listen for å sørge for at nettadressen ikke allerede har blitt hentet. Hvis den ikke har det, blir URL lagt til listen og hente proceeds.As alltid med søkemotorer, må du velge søketeksten nøye for å unngå flere millioner resultater. En grenseverdi hardkodet som 100 er satt for hver TSearchEngine.One siste punkt: Vær forsiktig med bruk av Application.ProcessMessages når du bruker WebBrowser. Jeg har unngått det, unntatt der hentinger er lagt til, som venter hvis resultProcessor er opptatt. Jeg vet ikke om det er slik hendelser er sendt, men jeg fant ut at innstillingen en etikett og roper application.ProcessMessages kan tvinge den samme hendelsen skal skje igjen. Dette skjedde mer i debugger, men hvis du får merkelig oppførsel, kommentere dem out.CaveatI tror denne koden er litt ujevn og klar, men det fungerer veldig bra. Muligens de minst tilfredsstillende metoder å påvise hvilken ramme har tekst. Jeg fant det vanskelig å regne ut, annet enn ved å bruke unntaket vekkende, så hvis du kjører den i debugger, forventer noen fanget unntak. Det er heller ikke en veldig polert program det kan være et bedre brukergrensesnitt, for eksempel. Men det gjør det jeg ment-it utfører flere parallelle søk og nedlastinger på samme time.Robots ikke welcomeA standard har dukket kalt Robot Exclusion Standard, som webområder skal bruke for å spesifisere trær som ikke skal indekseres av edderkopper fordi sidene endres ofte eller inneholde kjørbare eller ikke-tekstlig files.I lest at de nyeste anslagene tyder på at det er mer enn 800 millioner websider i tilværelsen, og at de fleste av søkemotorene har indeksert færre enn halvparten av den totale blant dem. De største søkemotorene bare ha indekser for 150-200 millioner sider. Så noe som begrenser "støy" er velkomne, og en måte å gjøre dette på er gjennom denne standarden. Bare plassere en robots.txt tekstfil i roten, for eksempel www.altavista.com/robots.txt-like følgende: User-agent: * Disallow: /cgi-binThis slår fast at alle nettroboter ikke bør se på /cgi-bin. Selvfølgelig trenger dine roboter ikke å ense dette-det er ment hovedsakelig for web edderkopper, men det er dårlig oppførsel å ignorere det, og det er fornuftig å gå sammen med det med mindre du virkelig trenger å se hva som er there.How, kan du lurer på, gjør Web site folk vet når en robot har besøkt dem? Ganske enkelt-det er den brukeragent navn i overskriften sendes til webserveren. Dette er som oftest Mozilla, men det kan være Scooter (Altavista spider) eller andre. Mozilla (for "Mosaic Killer") var arbeidsnavnet for Netscape og IE har også vedtatt det. Det kan være mulig å endre dette i femte parameter i TWebBrowser Naviger metoden, som har flere overskrifter. Eller du kan skrive din egen HTTP-grensesnitt i stedet for å bruke IE, og angi et navn. Gitt at det vi gjør ikke kan være svært populær blant søkemotorene, er det sannsynligvis best å gjøre det bak anonymitet av en Mozilla nettleser! I tillegg kan det være lurt å legge en 10-sekunders forsinkelse mellom hopping sider. På den måten vil det i hvert fall se ut som om det er en menneskelig operatør og ikke et program.



Previous:
Next Page: