Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

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ąć. 

linux porady programowanie

Komentarze

0 nowych
ShpxLbh   3 #1 07.02.2014 23:34

o ja głupi. używałem print screen :D

nitro2012   10 #2 08.02.2014 04:21

tytuł do poprawy

entat   5 #3 08.02.2014 09:49

@nitro2012 poprawiony:)

gregorywojcik   1 #4 08.02.2014 10:32

W takich galerich najczęściej zaszyty jest gdzieś plik xml który podaje do flsha zdjęcia, dlatego w przypadku kiedy zdjęć nie da się iterować wystarczy wyszukać takiego pliku xml przezywanego w flashvars i z niego można wyciągnąć listę zdjęć, dla tego przykładu mamy taki oto plik xml: http://radio.elka.fm/Foto14/140130133815wieza/gallery.xml

kwpolska   5 #5 08.02.2014 12:33

Wiresharka można zastąpić Developer Tools (karta Network) w Chrome (pewnie w innych przeglądarkach też)

pjlyoko   4 #6 08.02.2014 14:11

Dzięki wielkie za skrypt :)
Teraz wystarczy dodać listy wielowymiarowe i można różne katalogi pobierać ;)

  #7 09.02.2014 20:49

Skrypt?

for x in $(seq -w 1 42); do wget http://radio.elka.fm/Foto14/140130133815wieza/medium/00$x.jpg; done

  #8 10.02.2014 15:16

Można jeszcze zamiast '$(seq -w 1 42)' wpisać '{01..42}', albo nawet pójść po bandzie i wpisać po prostu:
wget http://radio.elka.fm/Foto14/140130133815wieza/medium/00{01..42}.jpg

entat   5 #9 15.02.2014 10:13

@Really? (niezalogowany)
@~ (niezalogowany)
W pierwszej kolejności chciałem do tego użyć wget ale zrezygnowałem z niego. Wykorzystanie urllib w pythonie wydaje się być bardziej przenośne między systemami. Ale dzięki za wersję z wget.

Pozdrawiam.

  #10 15.02.2014 10:54

jest we wszystkich Linuksach (przynajmniej ja nie trafiłem na distro bez niego), port dla Windows jest (może nie najnowszy, ale jest), dla OSX też jest, jest jeszcze oczywiście cURL.

entat   5 #11 15.02.2014 17:44

@wget
Miałem na myśli raczej mobilne systemy. Choć wgeta na Androida już gdzieś chyba widziałem.