Kirjoittaja Aihe: Tiedostojen haku skriptillä  (Luettu 3665 kertaa)

Kari Argillander

  • Käyttäjä
  • Viestejä: 437
  • Kubuntu - Hardy
    • Profiili
Tiedostojen haku skriptillä
« : 26.05.09 - klo:20.36 »
Tarkoitus olisi saada skripti joka hakee halutusta urlista kaikki pdf-tiedostot valittuun hakemistoon. Pdf:ä voi olla jopa 300 joten käsin niitä ei viitsi ladata. Ajattelin tehdä sen niin, että haetaan sivun lähdekoodi ja otetaan aina seuraava pdf urli ja tallennetaan se ja taas seuraava, mutta en vain tahdo keksiä miten tuon saisi toteutettua helposti. Olisiko jollain vinkkejä tai suora vastaus.

Ystävällisin terveisin
Kari Argillander
Kaikkea täällä sanomaani saa käyttää public domain lisenssillä. Lainauksia ei saa käyttää ellei lainauksen lähde sitä salli. Tiedostoja ei saa käyttää ellei sitä erikseen sallita.

jussike

  • Käyttäjä
  • Viestejä: 979
    • Profiili
Vs: Tiedostojen haku skriptillä
« Vastaus #1 : 26.05.09 - klo:20.51 »
En nyt jaksa loppuun asti miettiä, mut jos tästä mun vanhasta skriptin pätkästä ois jotain hyötyä niin että pääsisit alkuun.

Koodia: [Valitse]
cat file.html | sed -n -e '/http.*rm/p' | sed -e 's/.*\(http\)/\1/' | sed -e 's/rm.*/rm/1' >> linkit.txt

Tuolla pätkällä olen poiminut hötölömö-koodista kaikki realmedia-linkit.
Muistaakseni sedit toimii seuraavasti:
1. valitsee vain rivit, joilta löytyy merkkijono "http...ihanmitätahansa....rm"
2. leikkaa rivistä kaiken pois mitä on ennen http
3. leikkaa rivistä kaiken rm jälkeen olevan pois

Sitten tohon perään for-luuppi, joka hakee wgetillä tiedostot..

Kari Argillander

  • Käyttäjä
  • Viestejä: 437
  • Kubuntu - Hardy
    • Profiili
Vs: Tiedostojen haku skriptillä
« Vastaus #2 : 26.05.09 - klo:21.26 »
Sain toimimaan, mutta jos tiedosto nimet ovat samalla rivillä sed pyyhkii ne pois.
Kaikkea täällä sanomaani saa käyttää public domain lisenssillä. Lainauksia ei saa käyttää ellei lainauksen lähde sitä salli. Tiedostoja ei saa käyttää ellei sitä erikseen sallita.

jussike

  • Käyttäjä
  • Viestejä: 979
    • Profiili
Vs: Tiedostojen haku skriptillä
« Vastaus #3 : 26.05.09 - klo:21.30 »
Sain toimimaan, mutta jos tiedosto nimet ovat samalla rivillä sed pyyhkii ne pois.

Totta. Sellainen puute tuossa on. Sitten vaan pähkäilemään :)

snifi

  • Vieras
Vs: Tiedostojen haku skriptillä
« Vastaus #4 : 26.05.09 - klo:22.42 »
Minulta löytyi arkistoista tällainen Python-koodin pätkä, jota olen joskus käyttänyt html-sivun linkkien luetteloimiseen. Siihen kun lisäät yhden if url.endswith('.pdf') ehtolauseen, niin tuon pitäisi toimia pdf-tiedostojen listaamiseen:

Koodia: [Valitse]
"""
  Example Usage:
    $ python urllister.py GtkGLExtReferenceManual.html

"""

from sgmllib import SGMLParser
import sys

class URLLister(SGMLParser):
  def reset(self):
    SGMLParser.reset(self)
    self.urls = []

  def start_a(self, attrs):
    href = [v for k, v in attrs if k=='href']
    if href:
      self.urls.extend(href)

if __name__ == "__main__":
  import urllib
  usock = urllib.urlopen(sys.argv[1])
  parser = URLLister()
  parser.feed(usock.read())
  parser.close()
  usock.close()
  for url in parser.urls: print url

mgronber

  • Käyttäjä
  • Viestejä: 1458
    • Profiili
Vs: Tiedostojen haku skriptillä
« Vastaus #5 : 27.05.09 - klo:12.34 »
Sain toimimaan, mutta jos tiedosto nimet ovat samalla rivillä sed pyyhkii ne pois.

Koodia: [Valitse]
cat file.html | tr '<>' '\n\n' | …

Tuon pitäisi auttaa tässä tapauksessa.

retu

  • Käyttäjä
  • Viestejä: 949
    • Profiili
Vs: Tiedostojen haku skriptillä
« Vastaus #6 : 27.05.09 - klo:13.40 »
Tämmöisen web-sivuston kopioinnin voi tehdä ihan pelkällä wget-komennolla, se osaa parsia ne linkit sieltä html-koodista. Jos kerran kyse on yhdestä web-sivusta, jolla on linkkejä pdf-dokumentteihin, ne saa kopioitua näin:

Koodia: [Valitse]
wget -r -N -A.pdf http://pdf-sivun-url/
Tuo -r parametri tekee rekursiivisen latauksen eli lataa myös kaikki sivut/dokumentit joihin kohdesivulla viitataan. -N parametri hakee vain muuttuneet tiedostot eli kätevä kun haluaa aika ajoin päivittää pdf-tiedostot omalle koneelleen. -A on "accept list" eli tallentaa vain annetun tyyppiset (tarkenne) tiedostot, ei siis tallenna sivuilla mahdollisesti olevia .doc tai .jpg tiedostoja yms.

Tuo yo. lataa myös muilla sivuilla olevat pdf-tiedostot kaikilta sivuilta joille kohdesivulla on linkki. Tätä voi rajata -np ja -l parametreillä. -l parametrilla rajataan rekursion syvyys ja -np estää lataamasta mitään ylemmän tason hakemistoista.

Koodia: [Valitse]
wget -r -N -A.pdf -l 1 http://pdf-sivun-url/
Lataa vain sivun ja sillä olevat linkit. Jos sivulla on linkki toiselle sivulle siellä olevia pdf-tiedostoja ei ladata.

Koodia: [Valitse]
wget -r -N -A.pdf -np http://pdf-sivun-url/
Lataa sivun ja kaikki sen alla olevat sivut.

Asia avautuu varmasti wget man sivua tutkimalla, vaikka se on kyllä  ensi vilkaisulla ehkä vähän lannistava pituutensa takia. Mutta parametrien määrä johtuu vain siitä että wget on niin monipuolinen ohjelma web-sivujen latailuun. Toinen näppärä ohjelma "web-automaatioon" on curl. Sillä onnistuu mm. lomakkeiden käyttö.