[Çözüldü] Python Sıralı Dosya İndirme

Başlatan fghty, 07 Nisan 2012 - 17:27:34

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

fghty

Bu http://distro.ibiblio.org/tinycorelinux/4.x/x86/tcz/ dosyaları indirmek istiyorum ama çok fazla dosya olduğu için hepsinin adresini tek tek yazmam çok zaman alacak. Bu yüzden bu dosyaların linklerini ototmatik alıp indiren python kodu yazılabilir mi? Bu konuda yardım edebilir misin?

zeusmaster

Bu işi yapan programlar var. Jdownloder tam bu iş için.
Up and Running...

fghty

Hocam onda nasıl olacak. Anlatır mısın?

virs

#3
Alıntı yapılan: fghty - 07 Nisan 2012 - 17:27:34
Bu http://distro.ibiblio.org/tinycorelinux/4.x/x86/tcz/ dosyaları indirmek istiyorum ama çok fazla dosya olduğu için hepsinin adresini tek tek yazmam çok zaman alacak. Bu yüzden bu dosyaların linklerini ototmatik alıp indiren python kodu yazılabilir mi?

Bu gibi durumlarda düzenli ifadeleri kullanmak gerekir.

Yapılacak işlemler:
1. Verdiğin link yüklenecek.
2. Düzenli ifadelerle istenen linkler ayıklanacak. Link olarak ayıklanamazsa dosya adları vardır,
onlar ayıklanır ve linke dönüştürülerek bir listede tutulur
3. Linkler teker teker indirilir ve dosya linkten aldığımız dosya adıyla belli bir yere kaydedilir.
Bu son aşama aslında 1. aşamanın aynısı, tek farkı dosyaya kaydetme işlemi var.

Verdiğin linkin kaynak kodu incelendiğinde link olarak değilde dosya adları var şu taglar arasında:
<tr><td class="n"><a href="0mq-dev.tcz">0mq-dev.tcz</a></td>

Herhangi birini indirdiğimizde indirme linki "http://distro.ibiblio.org/tinycorelinux/4.x/x86/tcz/0mq-dev.tcz" şeklinde.
Demek ki taglar arasından dosya adını alıp verdiğin linke eklemek dosyanın linkini oluşturmak için yetecek.

regex = "<tr><td class="n"><a href="(.*?)">.*?</a></td>"

Burada parantez içindeki kısım almayı düşündüğümüz kısımdır. findall() fonksiyonuyla da metnin sonuna
kadar bu şekilde alabileceğimiz ifadeleri tarayıp bir listeye ekletmiş oluyoruz.

Koddaki  hedefDizin = u"/home/user/dosyalar/" kısmını kendinize göre düzenleyin ve belirttiğiniz klasörü oluşturun.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import re, urllib

url = 'http://distro.ibiblio.org/tinycorelinux/4.x/x86/tcz/'

site = urllib.urlopen(url)
veri = site.read()

regex = '<tr><td class="n"><a href="(.*?)">.*?</a></td>'
dosyalar = re.findall(regex, veri)

hedefDizin = u"/home/user/dosyalar/"

sayac = len(dosyalar)
for dosyaAdi in dosyalar:
    dosyaLinki = url + dosyaAdi
       
    site = urllib.urlopen(dosyaLinki)
   
    print u"Sıradaki Dosya: " + dosyaAdi
    print "Link: " + dosyaLinki
    print u"Kalan Dosya Sayısı: " + str(sayac) + "\n"
   
    try:
        dosya = open(hedefDizin + dosyaAdi, "wb")
        dosya.write(site.read())
        dosya.close()
    except IOError:
        pass
   
    sayac = sayac - 1


Çıktı:
Sıradaki Dosya: 0mq-dev.tcz
Link: http://distro.ibiblio.org/tinycorelinux/4.x/x86/tcz/0mq-dev.tcz
Kalan Dosya Sayısı: 24923

Sıradaki Dosya: 0mq-dev.tcz.dep
Link: http://distro.ibiblio.org/tinycorelinux/4.x/x86/tcz/0mq-dev.tcz.dep
Kalan Dosya Sayısı: 24922

Sıradaki Dosya: 0mq-dev.tcz.info
Link: http://distro.ibiblio.org/tinycorelinux/4.x/x86/tcz/0mq-dev.tcz.info
Kalan Dosya Sayısı: 24921

Kolay gelsin :)
İnsan için ancak çalıştığının karşılığı vardır. (Kur'an: Necm, 39)

burk

Anlatım için teşekkürler @virs. :)

fghty

Hocam yardım için çok sağol.  :)

Zaten python da şu regex leri bi türlü anlayamadım.

fghty