Ik run een website voor een klant waarbij ze een grote database met informatie weergeven die ze in de loop der jaren nauwkeurig en langzaam hebben verzameld. Ze vinden hun gegevens op verschillende plaatsen op internet. Meer dan waarschijnlijk is het te danken aan een scraper die pagina per pagina door zijn site gaat en de informatie die hij nodig heeft in een eigen database haalt. En voor het geval je je dit afvraagt, weten ze dat het hun gegevens zijn vanwege een enkel geplant stuk gegevens in elke categorie op hun site.
Ik heb hier de afgelopen dagen veel onderzoek naar gedaan en ik kan je vertellen dat er geen perfecte alles-in-één oplossing is. Ik heb verschillende dingen gevonden om dit voor hen een beetje moeilijker te bereiken. Dit is wat ik voor de klant heb geïmplementeerd.
Aangeactiveerde gepagineerde gegevens
Als u veel gepagineerde gegevens heeft en u pagineert uw gegevens door gewoon een ander nummer toe te voegen aan het einde van uw URL, dat wil zeggen http://www.domain.com/category/programming/2 - Dan maakt u de taak van de crawler is veel eenvoudiger. Het eerste probleem is dat het zich in een gemakkelijk herkenbaar patroon bevindt, dus het plaatsen van een schraper op deze pagina's is eenvoudig als taart. Tweede probleem, ongeacht de URL van de volgende pagina's in de categorie, meer dan waarschijnlijk dat er een volgende en een vorige link voor hen is om aan te linken.
Door de gepagineerde gegevens via javascript te laden zonder een herladen van de pagina, maakt dit het werk voor veel scrapers aanzienlijk ingewikkelder. Google is pas onlangs zelf begonnen met het ontleden van JavaScript op pagina. Er is weinig nadeel aan het herladen van de gegevens zoals deze. U geeft een paar minder pagina's op voor Google om te indexeren, maar technisch gezien moeten gepagineerde gegevens toch allemaal verwijzen naar de hoofdcategoriepagina via canonicalisatie. Ajaxeer uw opgeroepen pagina's met gegevens.
Willekeurig sjabloonoutput
Schrapers worden vaak enigszins aangepast aan uw gegevens. Ze zullen latchen op een bepaalde div id of klasse voor de titel, de derde cel in elke rij voor uw beschrijving, enz. Er is een gemakkelijk herkenbaar patroon voor de meeste scrapers om mee te werken als de meeste gegevens die uit dezelfde tabel komen, wordt weergegeven door dezelfde sjabloon. Willekeurig uw div-id's en klassenamen, voeg lege tabelkolommen willekeurig in met 0 breedte. Toon uw gegevens in een tabel op één pagina, in opgemaakte div's en een combinatie op een andere sjabloon. Door uw gegevens voorspelbaar te presenteren, kan deze voorspelbaar en nauwkeurig geschraapt worden.
Honingpot
Dit is vrij netjes in zijn eenvoud. Ik ben deze methode tegengekomen op verschillende pagina's over het voorkomen van het schrapen van sites.
- Maak een nieuw bestand op uw server met de naam gotcha.html.
- Voeg het volgende toe in uw robots.txt-bestand:
User-agent: *
Disallow: /gotcha.html
Dit vertelt alle robots en spiders die uw site indexeren om het bestand gotcha.html niet te indexeren. Elke normale webcrawler respecteert de wensen van uw robots.txt-bestand en heeft geen toegang tot dat bestand. dat wil zeggen, Google en Bing. Wellicht wilt u deze stap implementeren en 24 uur wachten voordat u naar de volgende stap gaat. Dit zorgt ervoor dat een crawler niet per ongeluk door u wordt geblokkeerd vanwege het feit dat deze al midden in de crawl was toen u uw robots.txt-bestand bijwerkte. - Plaats een link naar gotcha.html ergens op uw website. Maakt niet uit waar. Ik zou het in de footer aanbevelen, maar zorg ervoor dat deze link niet zichtbaar is, in CSS, display: none;
- Noteer nu de IP / algemene informatie van de dader die deze pagina heeft bezocht en blokkeer deze. Als alternatief zou je een script kunnen bedenken om hen te voorzien van onjuiste en vervuilde gegevens. Of misschien een leuke persoonlijke boodschap van jou aan hen.
Gewone webviewers kunnen de link niet zien, dus er wordt niet per ongeluk op geklikt. Gerenommeerde crawlers (Google bijvoorbeeld), zullen de wensen van uw robots.txt respecteren en het bestand niet bezoeken. Dus de enige computers die over deze pagina zouden moeten struikelen, zijn die met kwaadaardige bedoelingen, of iemand die jouw broncode bekijkt en willekeurig rondkijkt (en ach, als dat gebeurt).
Er zijn een aantal redenen waarom dit misschien niet altijd werkt. Ten eerste werken veel scrapers niet zoals normale webcrawlers en ontdekken ze niet alleen de gegevens door elke link van elke pagina op uw site te volgen. Schrapers worden vaak gebouwd om op bepaalde pagina's in te haken en alleen bepaalde structuren te volgen. Een scraper kan bijvoorbeeld worden gestart op een categoriepagina en vervolgens alleen worden verteld om URL's te bezoeken met het woord / de gegevens in de slug. Ten tweede, als iemand zijn scraper op hetzelfde netwerk draait als anderen en er een gedeeld IP-adres wordt gebruikt, dan heb je een ban op het hele netwerk. U zou inderdaad een zeer populaire website moeten hebben, want dit is een probleem.
Schrijf gegevens onmiddellijk naar afbeeldingen
Zoek een kleiner gegevensveld, niet noodzakelijkerwijs lange tekenreeksen, want dit kan het maken van de pagina een beetje moeilijker maken. Voer deze gegevens uit in een afbeelding, ik heb er alle vertrouwen in dat er methoden zijn in zowat elke programmeertaal om tekst dynamisch naar een afbeelding te schrijven (in php, imagettftext). Dit is waarschijnlijk het meest effectief bij numerieke waarden, omdat getallen een veel onbeduidend SEO-voordeel bieden.
Alternatief
Dit was geen optie voor dit project. Een login vereisen na een bepaald aantal paginaweergaves, of een beperkt aantal gegevens weergeven zonder ingelogd te zijn, dat wil zeggen, als u 10 kolommen heeft, geeft u 5 alleen weer aan niet-ingelogde gebruikers.
Maak deze fout niet
Probeer niet om een oplossing te bedenken op basis van de user-agent van de bot. Deze informatie kan gemakkelijk worden vervalst door een schraper die weet wat ze doen. De Google-bot bijvoorbeeld kan gemakkelijk worden geëmuleerd. U wilt waarschijnlijk Google niet verbieden.