Hjälp med script till automator för att ladda hem pdf:er

Tråden skapades och har fått 13 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • Linköping
  • 2012-01-22 10:33

Hej!

Är det någon av er som vet hur man kan sätta upp ett automator script som laddar hem alla pdf:er från en webbsida som både är "gömda" och synliga på en webbsida? För att ge er ett litet exempel. Följande webbsida innehåller 10pdf:er per år som är synliga under tre år. Men om ni öppnar källkoden så ser ni att det finns ytterligare 2 år. MAI:TATA41
Jag skulle vilja att detta automator script laddade hem alla dessa pdf:er.

edit:
Jag har nu lyckats få den att ladda hem alla synliga objekt men inte de dolda. De synliga laddas hem genom:
Hämta angivna url:er
Hämta länkande url:er
Filtrera url:er - Sökväg innehåller pdf
Hämta angivna webbsidor

Så om det är någon som vet hur man kan hitta även de dolda så skulle jag bli glad!

Senast redigerat 2012-01-22 11:38
  • Medlem
  • Stockholm
  • 2012-01-22 12:51

Vet inte hur du kan göra i automator, men med shell script kan du filtrera ut med grep.

grep -oP "tentor/(st)?\d+.pdf"

T.ex. filtrerar ut alla länkar till tentor från källan, möjligen kan du byta ut "hämta länkade url:er" och "Filtrera url:er" mot kör kommandotolk skript (tror jag det heter). Annars går det ju göra hela scriptet i bash.

  • Medlem
  • Linköping
  • 2012-01-22 13:00

Tack, men hur bestämmer jag vart jag vill söka söka någonstans?
För nu försöker jag hämta url:en och sedan köra din kod på scriptet.
Alternativt hur skulle ett helt bash script se ut?
Kör kommandotolk script finns det något som heter och jag la till din kod i den men den måste ju fortfarande veta vart den ska söka eller?

  • Medlem
  • Stockholm
  • 2012-01-22 13:11

Jo, du måste nog lägga till URL till den sidan som pdf filerna ligger på.

grep -oP "tentor/(st)?\d+.pdf" | xargs printf "http://www.mai.liu.se/TM/kurser/TATA41/%s\n"

Kan kanske fungera. Har pillat lite med blandning av shell script och automator tidigare och det känns alltid lite som en "tejp och snöre" lösning, om man inte bara kör ett skript från automator.

Har testat detta skriptet som laddar ner alla filer till en mapp på skrivbordet, kolla bara så att du inte redan har en "matte_tentor" mapp där.

#!/bin/bash

mkdir ~/desktop/matte_tentor
cd ~/desktop/matte_tentor

curl -A "Mozilla/5.0" http://www.mai.liu.se/TM/kurser/TATA41/tentor... | grep -oP "tentor/(st)?\d+.pdf" | xargs printf "http://www.mai.liu.se/TM/kurser/TATA41/%s\n" > links.txt
while read line; do out=$( echo $line | grep -oP "(st)?\d+.pdf"); curl -A "Mozilla/5.0" $line > $out ; done < links.txt

rm links.txt

Om du inte vill använda koden Fred! skrev har jag ett alternativ åt dig:

curl -s http://www.mai.liu.se/TM/kurser/TATA41/tentor... | grep -o -E 'href="tentor/([^"#]+)"' | cut -d'"' -f2 | xargs echo | sed 's/ /,/g;s/^/http:\/\/www.mai.liu.se\/TM\/kurser\/TATA41\/{/;s/$/}/' | xargs curl -s -O

Den laddar ner alla länkar som pekar till "tentor/" till den katalog varifrån det körs och skapar ingen extra fil såsom Fred!s gör.

  • Medlem
  • Linköping
  • 2012-01-22 14:50

Tack så mycket men får jag fråga varför ni båda två skriver såhär:

http:\/\/www.mai.liu.se\/TM\/kurser\/TATA41\/{/;s/$/}

Varför går ni upp ett steg där och tar bort tentor.html.

Hade ni gjort samma sak om adressen varit
http://www.mai.liu.se/TM/kurser/TATA41/NYMAPP/

Eller hade ni då skrivit:

http:\/\/www.mai.liu.se\/TM\/kurser\/TATA41\/NYMAPP\/{/;s/$/}

Och varför lyckas inte min modifierade kod få med de som börjar med st?

mkdir ~/desktop/TATA41
cd ~/desktop/TATA41


curl -s http://www.mai.liu.se/TM/kurser/TATA41/tentor... | grep -o -E 'href="([.*\.pdf]+)"' | cut -d'"' -f2 | xargs echo | sed 's/ /,/g;s/^/http:\/\/www.mai.liu.se\/TM\/kurser\/TATA41\/{/;s/$/}/' | xargs curl -s -O
Senast redigerat 2012-01-22 15:23
  • Medlem
  • Stockholm
  • 2012-01-22 15:01
Ursprungligen av mojitoo:

Varför går ni upp ett steg där och tar bort tentor.html.

Det beror på att länkarna i källan inte innehåller hela adressen. Om du kollar på href taggarna så ser du att de börjar på /tentor/.
grep filtrerar ut detta, men för att det sedan skall fungera behöver man ju hela url:en.

tentor.html är bara en textfil på en server någonstans som vi hämtar ut länkarna från. För att sökvägarna i källan innehåller "tentor/XXXXX.pdf" behöver man lägga på det som gör en fullständig sökväg/webbadress till filerna.
Det är en relativ sökväg som används i tentor.html.

Hade det varit länkar med fullständiga sökvägar, inklusive webbserveradress, hade man inte behövt det.

  • Medlem
  • Stockholm
  • 2012-01-22 15:19
Ursprungligen av mojitoo:

Och varför lyckas inte min modifierade kod få med de som börjar med st?

Vet faktiskt inte, jag är allergisk mot POSIX regex helt okonsekvent. -P flaggan ger dig Perl regex vilket är "vanlig" regex med en rikare syntax som du träffar på i Python, Ruby mm.

Jag tycker du ska kolla lite på Regular-Expressions.info - Regex Tutorial, Examples and Reference - Regexp Patterns
Det handlar enkelt sagt om skillnaden mellan giriga/lata (greedy/lazy) matchningar i ditt urval.
Du har andra grejer med… Inom [ ] anger man enstaka tecken eller negationer osv. Läs mer i länken, det är väldigt pedagogiskt genomgånget.

I din modifierade kod ändra

grep -o -E 'href="([.*\.pdf]+)"'

till

grep -o -E 'href="([^"]+\.pdf)"'

Om jag ska förklara min regex så matchar den mot "href=([TECKEN_SOM_INTE_ÄR_CITATIONSTECKEN]HUR_MÅNGA_GÅNGER_SOM_HELST_SOM_SLUTAR_PÅ_.pdf)"

Vet inte om jag strular till det mer för dig med min förklaring, men inom [ ] kan man använda ^ som en negation och + för att matcha en eller flera av det som står direkt till vänster om det.

Ett bra sätt att bygga upp sitt kommando är att ta det pö om pö. Speciellt om man inte är helt 100:a på hur Regex funkar.

  • Medlem
  • Stockholm
  • 2012-01-22 16:17

Går igenom den regex jag använde oxå.

grep -oP "(st)?\d+.pdf"

Text inom parantes matchar grupper, t.ex. (foo|bar|baz) matchar antingen "foo", "bar" eller "baz"

Detta föjs av ? vilket innebär exakt 1 eller 0 av föregående.

\d är digits, dvs allt mellan 0-9

+ är exakt 1 eller fler av föregående

.pdf ordagrant ".pdf"

edit:

greps -o flagga tar bort allt som inte matchas.

  • Medlem
  • Stockholm
  • 2012-01-22 17:09

Om du vill övertyga dig om skillnaden testa att byta ut P mot E och vise versa, de flesta språk avänder idag varianter på Perl regex. Det som är okensekvent i POSIX regex är främst metatecken och escape. Man märker det oftast när man försöker använda en regex rakt av i grep som funkar på andra ställen.

  • Medlem
  • Stockholm
  • 2012-01-22 21:06

Kom på att man kan använda xargs -I (stort i) för replace string och göra allt i en rad.

curl -A "Mozilla/5.0" http://www.mai.liu.se/TM/kurser/TATA41/tentor... | grep -oP "tentor/(st)?\d+.pdf" | xargs -I xx curl -A "Mozilla/5.0" "http://www.mai.liu.se/TM/kurser/TATA41/"xx -O

Man kan givetvis strunta i användar agent argumentet (-A) om man vill.

Ursprungligen av Fred!:

Kom på att man kan använda xargs -I (stort i) för replace string och göra allt i en rad.

curl -A "Mozilla/5.0" http://www.mai.liu.se/TM/kurser/TATA41/tentor... | grep -oP "tentor/(st)?\d+.pdf" | xargs -I xx curl -A "Mozilla/5.0" "http://www.mai.liu.se/TM/kurser/TATA41/"xx -O

Man kan givetvis strunta i användar agent argumentet (-A) om man vill.

Snyggt! (Ja, det här är nörderi )

1
Bevaka tråden