Python İle Mechanize Ve Beautifulsoup Modülleri
-
Python ile Mechanize ve BeautifulSoup modüllerini kullanarak wallbase.net sitesindeki
tüm resimleri indirmeye yarayan Linux için python ile ufak bir script yazdım.
Bu modüllerin kullanımına örnek olabileceği için paylaşıyorum.
Windows üzerinde denemedim, fakat dizin işlemlerini os modülü ile yaptığım için çalışabilir.
Şimdilik resimleri tek tek sırayla indiriyor. Daha sonra threading eklenebilir.
wallbase.py şeklinde kaydedip, çalıştırabilirsiniz.
#!/usr/bin/env python
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Wallbase.net Wallpaper Grabber
# ----------------------------------
# Libraries: mechanize, cookielib, beautifulsoup
# It can grab wallpapers from http://www.wallbase.net site
# and save them in a specified directory.
# ----------------------------------
# cnr437
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
import os, sys, re
import mechanize
import cookielib
from BeautifulSoup import BeautifulSoup as BS
url = "http://www.wallbase.net/wallpaper/"
START = 179588 # baslangic resmi numarasi
TEST = 1000 # test icin resim sayisi
FULL = 502000 # sitenin icerdigi resim sayisi
if len(sys.argv)>1:
own_path = sys.argv[1]
if not os.path.isdir(own_path):
print "No such directory. It was set default to working directory."
own_path = os.getcwd()
print "%s\n" % own_path
else:
own_path = os.getcwd()
path = os.path.join(own_path,"WallBase.net")
if not os.path.isdir(path):
os.mkdir(path)
os.chdir(path)
# indirilmis resimler listesi
local_files = []
# indirilecek resimler listesi
net_files = []
sys.stdout.write("Loading...\r")
# resimleri listelemek
for root,dirs,files in os.walk(path):
local_files.extend([os.path.splitext(f)[0] for f in os.listdir(root)])
# for dir in dirs:
# for file in files:
# print file
# local_files.append(file)
# sitede olmayan, yada olupta silinmis olan resimlerin numaralarini listelemek
no_img = open("no_image.txt","a+")
no_list = [line.strip() for line in no_img.readlines()]
no_img.close()
# indirilecek resimlerin listelenmesi
for number in xrange(START,START+TEST): #TEST yerine FULL yazilacak
if str(number) not in local_files and str(number) not in no_list:
net_files.append(str(number))
sys.stdout.flush()
#debug
#print local_files
#print no_list
#print net_files
# Tarayiciyi baslat
br = mechanize.Browser()
# Cookieleri aktif et
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)
# Handlerlari aktif et
br.set_handle_equiv(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(),max_time=1)
# User-agent
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.8) Gecko/20100723 ZUbuntu/10.04 (kerkenez) Firefox/3.6.8')]
# resmi indirme fonksiyonu
def image_get(img_number):
# sayfayi tarayici ile acmak
br.open(url+img_number)
# sayfayi html olarak okumak
html = br.response().read()
# html'i beautifulsoup ile derlemek
# (beautifulsoup html'in icersindeki nesneleri daha rahat okumayi saglar)
soup = BS(html)
# resmin icinde bulundugu "div" bulur
img_div = soup.find('div', {'id':'bigwall','class':'right'})
if not img_div:
# eger resim yoksa
no_img = open("no_image.txt","a")
no_img.write(img_number+'\n')
no_img.close()
# debug
#print "There is not image with this number: %s in wallbase.net" % img_number
return
img = img_div.find('img')
# resmin linki
img_link = img.attrs[0][1]
stat_div = soup.find('div', {'class':'stats left'})
#resmin kategorisi
stat = stat_div.contents[2].replace(' ','').strip()
ext_div = soup.find("span", {'class':re.compile('right imgtype*')})
#resmin uzantisi
ext = ext_div.contents[0].lower()
directory,category = stat.split(' / ')
#dizinlerin ayarlanmasi ve olusturulmasi
dir_dir = os.path.join(path,directory)
if not os.path.isdir(dir_dir):
os.mkdir(dir_dir)
dir_cat = os.path.join(dir_dir,category)
if not os.path.isdir(dir_cat):
os.mkdir(dir_cat)
file_name = os.path.join(dir_cat,img_number+'.'+ext)
try:
# resmin siteden cekilmesi ve kaydedilmesi
br.retrieve(img_link,file_name)[0]
except:
print "Downloading Error."
sys.exit(0)
# durum ve yuzde gostergesi
def status(percent,count,total):
sys.stdout.write("Downloading %3.2f%% [%d. file of %d files]\r" % (percent,count,total))
sys.stdout.flush()
if __name__ == "__main__":
tot = len(net_files)
cnt = 1
#indirilecek resimlerin listesinin dongusu
for image in net_files:
perc = (float(cnt) / tot)*100.0
status(perc,cnt,tot)
image_get(image)
cnt += 1
# bitir :)
print "Finished. Bye :)"
raw_input("Enter.") -
2.000 tane duvar kağıdı indirdim daha şimdiden :)
500.000 tane kaldı :)
cnr437 aşşağıda bunu yazdı :)
-----------------------------
Ahanda windows versiyonu :D
wine'da da çalışıyo :D
Program Files\WallBase Grabber\WallBase.net dizini içerisine atıyor
http://filebin.ca/nbtyg/WallBase_v0.1.exe
Not: Şimdi şöyleki, wallbase'in içerisindeki resimlerin hepsini sırayla indirmeyi amaç edindiğinden ötürü sakıncalı (+18) duvar kağıdı indirme durumu da var. Dikkatli olursunuz. :)
----------------------------- -
Windows için olanıni derleyebilir misin peki ?
-
Blitz bunu yazdı:
-----------------------------
Windows için olanıni derleyebilir misin peki ?
-----------------------------derlemek derken? ahah. python interpreter dilidir hocam compiler değil. pythonu kur kodları wallbase.py olarak kaydet ve çift tıkla dosyana.
-
Hıı öyle desene. Hiç python la uğraşmadım bilmiyorum o yüzden. Değiştiriyorum soruyu pythonu kurup bunu çalıştrabilir miyiz bi düzenleme yapmadan windows için ? :)
-
Blitz bunu yazdı:
-----------------------------
Windows için olanıni derleyebilir misin peki ?
-----------------------------windows için bir exe oluşturmaya şuan vaktim yok, ama olursa yaparım.
BeelzeBuB bunu yazdı:
-----------------------------
derlemek derken? ahah. python interpreter dilidir hocam compiler değil. pythonu kur kodları wallbase.py olarak kaydet ve çift tıkla dosyana
-----------------------------python kurması yetmeyebilir, 2 tane modül dışarıdan.
mechanize ve beautifulsoup modüllerini bulmak ve yüklemek gerekebilir.
-
cnr437 bunu yazdı:
-----------------------------
Blitz bunu yazdı:
-----------------------------
Windows için olanıni derleyebilir misin peki ?
-----------------------------windows için bir exe oluşturmaya şuan vaktim yok, ama olursa yaparım.
BeelzeBuB bunu yazdı:
-----------------------------
derlemek derken? ahah. python interpreter dilidir hocam compiler değil. pythonu kur kodları wallbase.py olarak kaydet ve çift tıkla dosyana
-----------------------------python kurması yetmeyebilir, 2 tane modül dışarıdan.
mechanize ve beautifulsoup modüllerini bulmak ve yüklemek gerekebilir.
-----------------------------modülleri indirmeyi denedim ama olmadı easyinstall diye bir program varmış onu kurduktan sonra konsoola gelip easy_install mechanize yazıyormuşsun ama öyle bir komut yok diyor :S
-
modülleri,
python setup.py install
komutu ile yüklemeyi dene
Not: Eğer windows kullanıyorsan, python komutunu çalıştırabilmen için, python dizinini Ortam Değişkenlerine eklemen gerekir.
-
Ahanda windows versiyonu :D
wine'da da çalışıyo :D
Program Files\WallBase Grabber\WallBase.net dizini içerisine atıyor
http://filebin.ca/nbtyg/WallBase_v0.1.exe
Not: Şimdi şöyleki, wallbase'in içerisindeki resimlerin hepsini sırayla indirmeyi amaç edindiğinden ötürü sakıncalı (+18) duvar kağıdı indirme durumu da var. Dikkatli olursunuz. :)
-
faytonun gözünü seveyim.
-
Oha tüm siteyi mi indiriyoruz? Tüm resimleri ha? Kaç GB Yer tutar bu la? :D