Języki skryptowe na co dzień | cz. 2. | pobieranie zdjęć z galerii flashowych

Będziemy pobierali zdjęcia z jednego z portali, gdzie galerie ze zdjęciami są wyświetlane we flashu. Pobieraniem plików zajmie się skrypt napisany w pythonie.

Jako przykład posłuży galeria na stronie: http://elka.pl/content/view/68471/434/

W pierwszej kolejności musimy poznać nazwy plików, które będziemy pobierać oraz określić dokładne ich położenie - dane te trzeba sobie "wydobyć". W tym celu warto skorzystać z darmowego Wiresharka. Zakładam, że czytelnik zna podstawy obsługi Wiresharka.

W Wiresharku przechodzimy do opcji przechwytywania pakietów (drugi przycisk od lewej strony: Show the capture options...) i wybieramy interfejs, z którego chcemy przechwytywać pakiety (eth czy wlan). Następnie klikamy start. W głównym oknie programu pojawią się szczegółowe dane nt. "wędrówki" naszych pakietów.

W przeglądarce otwieramy ww. adres i czekamy aż strona w całości się załaduje. Na początku widzimy pierwsze zdjęcie z galerii i miniaturki pozostałych. Otwieramy ostatnie zdjęcie z galerii. Możemy teraz zakończyć rejestrację pakietów w Wiresharku (czwarty przycisk od lewej strony: Stop the running live capture).

Filtrujemy teraz zebrane informacje po protokole i jego zawartości. Szukamy plików .jpg w danych protokołu http.

Zdobyliśmy zatem nazwy plików, jak również ścieżkę do nich. Widzimy także, jak zmieniają się ich nazwy. Określiliśmy - otwierając ostatni plik - numer ostatniego zdjęcia (0042.jpg). Widzimy również nazwę hosta, który w połączeniu ze ścieżką do pliku da nam pełny adres. Sprawdźmy zatem adres dla ostatniego zdjęcia: http://radio.elka.fm/Foto14/140130133815wieza/medium/0042.jpg. Działa.

Potrzebny jest zatem skrypt, który pobierze 42 zdjęcia z serwera zaczynając od 0001.jpg a kończąc na 0042.jpg.


#!/usr/bin/env python
import urllib, os
a = '000'
os.mkdir('/home/uzytkownik/Pulpit/galeria')
for x in range (1,43):
	if (x == 10):
		a = '00'
	adres = 'http://radio.elka.fm/Foto14/140130133815wieza/medium/' + a + str(x) + '.jpg'
	nazwa = '/home/uzytkownik/Pulpit/galeria/' + a + str(x) + '.jpg'
	urllib.urlretrieve(adres, nazwa)
	print ('Pobrano ' + a + str(x) + '.jpg')

Skrypt zapisujemy pod dowolną nazwą z rozszerzeniem .py. Uruchamiamy go wpisując w terminalu: python nazwa_skryptu.py lub ./nazwa_skryptu.py. Żeby drugi sposób uruchamiania zadziałał, musimy nadać naszemu plikowi atrybut wykonywalności: chmod 755 nazwa_skryptu.py

Co się dzieje w kodzie?

Najpierw importujemy potrzebne moduły: urllibs - dla urllib.urlretrieve - pobiera plik z danego adresu i zapisuje go pod podaną nazwą w konkretnej lokalizacji, os - dla os.mkdir - tworzy katalog, do którego będą pobierane pliki.

Widzieliśmy, jaką konstrukcję mają nazwy plików - cztery cyfry - musimy taką stworzyć. Dla zdjęć o numerach 1 - 9 musimy dopisać 000 przed cyfrą, a od 10 do 42 - dopisujemy 00. Stąd też, takie wartości (ciągi znaków) przyjmuje zmienna a.

Następnie jest tworzony katalog, do którego będą zapisywane pliki.

Dalej zaczyna się pętla, która będzie odpowiadała za zmianę nazwy i pobieranie plików. Funkcja range (1,43) przypisuje dla zmiennej x wartości od 1 do 42.

Następnie jest sprawdzana wartość x, żeby dopisać odpowiednią ilość zer do nazwy pliku.

str(x) - służy do konwersji zmiennej liczbowej na ciąg znaków.

Sposób pozyskiwania dokładnego położenia plików, jak również ich nazw nie jest taki sam dla każdej strony. Dzięki analizie wychodzących i przychodzących pakietów można je jednak określić. Niektóre strony zawierają zdjęcia z nazwami generowanymi przez różne skrypty, dlatego nawet gdy poznamy nazwę jednego (pierwszego?) zdjęcia, to iteracja jego nazwy nie da nam dostępu do kolejnych zdjęć. Niektóre flashowe gazetki z supermarketów tak mają.

Zdarzają się też sytuacje, w których nie musimy "odkrywać" położenia i nazw plików, gdyż już je znamy. Możemy zatem część związaną z Wiresharkiem pominąć.