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ść.
Komentarze 12
[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?
Brzmi ciekawie - trzeba będzie w wolnej chwili przetestować ):>
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 ;]).
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
}
Sorry, odświeżyłem i poszło drugi raz ;/ skasuj ostatni.
@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ę ;)
No jasne, ale po części można po utrudniać ;], Pobieraj co chcesz :D Ja oczywiście tak nie kombinuje :] :D
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.
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 ;]
[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ę.
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ć ;)
@shpyo: Racja, ale na życzenie napewno Ci umożliwią otwieranie zdalnych plików ;]