12 Programowanie

Text-scrapping na przykładzie wykop.pl

Na pierwszym radomskim barcampie, na jednym z moich slajdów, pojawił się na czerwono, tajemniczy zwrot – text-scrapping. Zaznaczony na czerwono, bo trzeba znać się na programowaniu w php, pythonie lub innym,. Postawienia wordpressa z pluginem do pobierania RSS jest proste i każdy to może zrobić.

Na pierwszym radomskim barcampie, na jednym z moich slajdów, pojawił się na czerwono, tajemniczy zwrot – text-scrapping. Zaznaczony na czerwono, bo trzeba znać się na programowaniu w php, pythonie lub innym,. Postawienia wordpressa z pluginem do pobierania RSS jest proste i każdy to może zrobić.

Należy wspomnieć, że to co jest tutaj pokazane jest złe i narusza prawa autorskie twórców stron czy autorów komentarzy. Mówiąc, a właściwie – pisząc, wprost - kradniemy treść ze strony!

Czy jest text-scrapping?

Jak sama nazwa wskazuje (z angielskiego), jest to zdrapywanie, drapanie, zeskrobywanie. W przypadku stron internetowych chodzi o „zeskrobywanie” konkretnych części strony tj. komentarze, wpisy (wiadomości) itp. Jest to możliwe tylko dlatego, że strony posiadają pewne części kodu HTML, które się powtarzają (np. wspomniane wcześniej komentarze). Jedyną rzeczą jaką się różnią to treść między powtarzającymi się znacznikami.

Po co to się robi?

Do spamowania i generowania olbrzymich stron. Im większa i unikalna treść strony tym lepiej dla linków, które będziemy tam zamieszczać, czy nawet dla reklam AdSense (MFA). Ponadto może potem to jest wykorzystać do zdobywania punktów w systemach wymiany linków.

Przykład

Posłużę się prostym skryptem napisanym w pythonie, a dokładniej python z Google App Enginie, dzięki któremu pobranie całej treści strony jest szybsze i prostsze niż za pomocą PHP. Poza tym, GAE daje hosting, więc można się będzie pobawić dłużej skryptem, bez obawy, że zużyjemy za dużo CPU. Nie ma to jak korzystać z narzędzi Google do spamowania Google ;).

from google.appengine.ext import webapp
from google.appengine.api import urlfetch

import re
 
url = "http://www.wykop.pl/link/LICZBA/prefix"
result = urlfetch.fetch(url)
replace_string = MAGICZNA_REGUŁKA
 
wyniki = re.findall(replace_string, result.content)

 
if wyniki:
	for w in wyniki:
		print '

# ' + w + '

'
  else: print 'brak wynikow'

Działanie skryptu można zobaczyć w serwisie appspot.

Omówienie kodu

Pierwsze cztery linijki (1-4) to importowanie odpowiednich bibliotek, które zapewnią nam, odpowiednia działa aplikacji. W tym konkretnym przykładzie najbardziej nas interesują urlfetch oraz re, które pozwolą na pobranie zarawtości strony i "zestrobanie" odpowiednich tagów HTML (za pomocą wyrażeń regularnych).

Kolejne 3 linijki (5-8) to:

  • ustalenie adresu strony, którą będzie "obrabiać",
  • "uruchomienie" strony (tak jak robi to przeglądarka),
  • ustawienie regułki, dzięki której będziemy pobierać treść ze strony

Linia numer 10, to przeszukanie całej zawartości strony pod względem pasującego wzorca replace_string (zdefiniowanego w linii nr 8).

Linie od 12 do 16, to wyświetlenie znalezionej treści (poprawnie, przed wyświetleniem wyników, należałoby sprawdzić jaki status zwróci nam strona - jeżeli 200 OK, to pokazujemy wyniki). Normalnie wszystko to byłoby zapisanie gdzieś w bazie i odpowiednio przerobione. Na potrzeby tego przykładu, komentarze z serwisu wykop.pl są tylko i wyłącznie wyświetlane. Ponadto specjalnie nie podałem w kodzie regułki odpowiadającej za "zeskrobywanie" komentarzy, aby nie było, że zachęcam do łamania prawa.

Jak widać, 10 linijek kodu i można generować olbrzymie spamy. W przypadku wykopu, wystarczy wszystkie wykopy przelecieć pętlą od 1 do 200000 i zbiorę wszystkie komentarze z serwisu. Wszystko to dzięki przyjaznym adresom, gdzie kluczem do wpisu jest liczba.

W podobny sposób działają inne spamerkie crawlery np. do pobierania adresów email ze strony.

Czy można się przed tym bronić?

Nie można. Można ewentualnie utrudnić pobranie treści, ale jak ktoś naprawdę będzie chciał, to pomimo trudności, pobierze treść.



Zdjęcie autora wpisu - Piotr Cichosz

Piotr Cichosz — autor wpisu

Frontend developer. Tworzę zaawansowane systemy webowe w JS. Swoją wiedzę nt. SEO wykorzystuję do rozwijania własnych projektów (z lepszym lub gorszym efektem). Dużo eksperymentuję i staram się określić jak bardzo można nagiąć cierpliwość algorytmów Google (:.

Komentarze 12

author Kits www 15.03.2009 13:53:52

[quote]dzięki któremu pobranie całej treści strony jest szybsze i prostsze niż za pomocą PHP[/quote]
Co jest w tym szybszego i prostszego, bo chyba znam jakieś inne PHP?

author Ender www 15.03.2009 17:03:14

Brzmi ciekawie - trzeba będzie w wolnej chwili przetestować ):>

author DJ SEBSON www 16.03.2009 00:39:13

Można się bronić w pewnych przypadkach np., jak Python użyje urllib2 i nie podszyje się pod żadną przeglądarkę, a często tak jest (przeglądnijcie apache logs ;]).

author DJ SEBSON www 16.03.2009 00:40:30

Hmm, kod się nie wysłał ;]
// Jeśli przeglądarka przedstawia się jako Python-urllib/2.5
if($_SERVER['HTTP_USER_AGENT'] == "Python-urllib/2.5") {
// Zabroń dostępu
}
// Jeśli nie, wpuść
else {
// Dostęp
}

author DJ SEBSON www 16.03.2009 00:52:07

Sorry, odświeżyłem i poszło drugi raz ;/ skasuj ostatni.

author shpyo www 16.03.2009 08:25:47

@Kits: zobacz ile linijek jes tutaj napisanych. Do tego dochodzi prostota i lepsza wydajność.
@DJ SEBSON: No jasne, że można tak utrudnić. Jak będę chciał pobrać jakąś treść z Twojej strony to i tak to zrobię ;)

author DJ SEBSON www 16.03.2009 08:34:30

No jasne, ale po części można po utrudniać ;], Pobieraj co chcesz :D Ja oczywiście tak nie kombinuje :] :D

author Mih www 16.03.2009 10:47:39

Na studiach na zaliczenie napisałem kiedyś taki skrypt w Pythonie, który robił dogłębną analizę strony. Zawierał niewiele ponad 50 linijek i robił wszystko to co niejeden skrypt php, który zajmuje przynajmniej kilka razy więcej linijek. Python, choć mało popularny, zawiera ogromną ilość gotowych bibliotek, które można łatwo importować i je wykorzystywać. Jak dla mnie przewaga Pythona nad PHP jest oczywista, jeśli chodzi o przejrzystość kodu i możliwości. Sam fakt, że Google posługuje się Python'em jako jednym z 3 głównych języków (obok C++ i Java) już o czymś świadczy.

author DJ SEBSON www 16.03.2009 11:02:26

Google to całkiem inna sprawa. Na PHP by za wiele nie zrobili, tu mówimy o małym projekcie, gdzie PHP wystarczy w zupełności, jeśli chcesz przejrzysty kod to pisz klasy ;] Tak apropo widze, że Google zablokowało urllib ;]

author kits www 18.03.2009 16:19:12

[quote=shpyo]zobacz ile linijek jes tutaj napisanych. Do tego dochodzi prostota i lepsza wydajność.[/quote]

Tzn ile ? więcej. ta sama operacja w PHP:
[code]
$url = 'http://www.wykop.pl/link/109588/najwieksze-problemy-na-forum';
$html = file_get_contents($url);
preg_match_all($pattern, $html, $matches);
if(preg_match_all($pattern, $html, $matches)){
foreach($matches[1] as $item) {
echo ''.$item.'';
}
} else {
echo 'brak wynikow';
}
[/code]

Prostota jest dokładni taka sama - jedyna różnica to nazwy funkcji/metod. O wydajności nawet nie wspomnę.

author shpyo www 18.03.2009 17:05:21

kits - jasne, można i tak, tylko problem pojawi się wtedy, gdy firma hostingowa zablokuje otwieranie zdalnych plików (ze względów bezpieczeństwa). Co do wydajności, to można się spierać ;)

author DJ SEBSON www 18.03.2009 17:16:31

@shpyo: Racja, ale na życzenie napewno Ci umożliwią otwieranie zdalnych plików ;]

Dodaj komentarz