LINUX.ORG.RU

Парсер ссылок из файла

 , ,


0

2

Доброе время суток.

Есть большой файл в формате

random_numbers : http://тут_ссылка_на_файл.png

Например:

435345_5334554 : http://dfdsfdsf.net/c2/123.png

Может у кого есть регулярка на баше\питоне\перле\etc чтобы вытащить голые ссылки и сразу сохранить файлы?

или curl + bash например.

Сам пока не осиливаю написать, если ничего не найду - напишу на плюсах. Но это не Ъ путь и не лучшее решение.

★★★★★
#!/usr/bin/env perl
# by 
# cut urls from stdio
# regex from man urlview
 
while(<>)
{
    while (s$((((http|https|ftp|gopher)|mailto):(//)?[^< >"\t]*|(www|ftp)[0-9]?\.[-a-z0-9.]+)[^".,;\t\n\r< >\):]?[^,< >"\t]*[^".,;\t\n\r< >\):])$$)
    {
        print "$1\n";
    }
}

читает stdin, парсит ссылки

bl ★★★
()
#!/bin/bash
while read a; do
        b=$(echo "$a" | cut -d' ' -f3)
        wget -c "$b"
done < $1

Если я правильно понял. Скрипту кормить файл со строками.

sT331h0rs3 ★★★★★
()

Такое я точно видел в арчеконфиге zsh (это был алиас на перл), который честно слизан из grml.

DeadEye ★★★★★
()

утилита называется urlview, ее сделали специально чтобы в mutt было удобно открывать ссылки. попробуйте воспользоваться ею.

Spoofing ★★★★★
()
Ответ на: комментарий от sT331h0rs3
wget: unable to resolve host address '\r'
--2015-05-01 12:02:39--  http://%0D/
Resolving \r (\r)... ^C

Как я не пытался. Он же скачивать через curl должен был?

smilessss ★★★★★
() автор топика
Ответ на: комментарий от MrClon

Спасибо, достал список ссылок, теперь буду пробовать из сохранить чем-то.

smilessss ★★★★★
() автор топика
Ответ на: комментарий от Haodemon

--2015-05-01 12:08:23--  http://blabla.com/213f.jpg%0D
Connecting to blabla.com (blabla.com)|11.222.33.444|:80... connected.
HTTP request sent, awaiting response... 404 Not Found
2015-05-01 12:08:23 ERROR 404: Not Found.

213f.jpg%0D - в конце каждой ссылки %0D и оно вылетает в 404

Можно как-то убрать это "%0D" ?

smilessss ★★★★★
() автор топика
Ответ на: комментарий от MrClon

с помощью это регулярки вытащил список ссылок, а дальше просто

wget -i новый_файл

скачаивается, глянем всё ли там.

Ещё раз спасибо.

smilessss ★★★★★
() автор топика
Ответ на: комментарий от Haodemon

В первом коде ошибка, поменяй регулярку на «http.*[^\r]».

если ничего не найду - напишу на плюсах.

А вообще странно; не думал что люди, которые могут в C++, не могут в простейший bash.

Haodemon
()

Спасибо всем, вроде получилось)


FINISHED --2015-05-01 12:21:19--
Total wall clock time: 6m 17s
Downloaded: 1936 files, 207M in 3m 30s (1007 KB/s)

[\code]
smilessss ★★★★★
() автор топика
Ответ на: комментарий от Haodemon

А вообще странно; не думал что люди, которые могут в C++, не могут в простейший bash.


В нашем мире много всякого «бывает».

Спасибо за регулярку)

smilessss ★★★★★
() автор топика

cat file |perl -e 'while(<STDIN>){/.*(http.*)/;print $1.«\n»}' >newfile

anonymous
()
Ответ на: комментарий от Haodemon

если ничего не найду - напишу на плюсах.

А вообще странно; не думал что люди, которые могут в C++, не могут в простейший bash.

ТС не очень-то может на плюсах, или не верит сам в себя :) Времени от создания темы до решения по подсказке было более чем достаточно чтобы самому написать и отладить такое на знакомом языке.

MKuznetsov ★★★★★
()
Cat | xargs | awk '{print $3}' | wget

Не не то, я забыл что у тебя строчек куча.

daniilArch ★★
()
Последнее исправление: daniilArch (всего исправлений: 2)
Ответ на: комментарий от loz

Сплит по двоеточию не прокатывает, там двоеточие внутри урла. К тому же, не ясно, есть ли в файле еще что-нибудь кроме этих строк.

и curl на второй элемент.

А сколько соединений сможет курл одновременно открыть? Все в паралель сделтать нельзя, если файл большой, надо будет как то очередь городить видимо.

nondeterminism
()

Тред-детектор любителей грепать котов! НЕНАВИСТЬ!

DELIRIUM ☆☆☆☆☆
()
Последнее исправление: DELIRIUM (всего исправлений: 1)
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import re
import urllib

FILENAME = 'ololo.dat'

urls = re.compile(r'^.+?\s:\s(http:.+png)$', re.MULTILINE)
data = open(FILENAME, 'r').read()
for url in urls.findall(data):
	urllib.urlretrieve(url, url.split('/')[-1])
Siado ★★★★★
()
Ответ на: комментарий от nondeterminism

Сплит по двоеточию не прокатывает, там двоеточие внутри урла.

Ну в любом нормальном сплите можно указать сколько раз сплитим.

К тому же, не ясно, есть ли в файле еще что-нибудь кроме этих строк.

Раз в описании про это ни слова значит это не важно.

А сколько соединений сможет курл одновременно открыть? Все в паралель сделтать нельзя, если файл большой, надо будет как то очередь городить видимо.

Не забудь еще чтобы очередь раскидывалась на несколько нод и они перезапускали друг друга если вдруг что упадет, а так же пускай соединения через автоконфигурируемую проксю или тор, вдруг сайт начнет банить за количество подключений.

Ты правда считаешь что это все нужно учесть в такой элементарной задаче?

loz ★★★★★
()

Простое решение на питоне. Просто сохрани скриптик, и запускай так:

python3 script.py file.in file.out
Вот скрипт:
#!/bin/env python3

def parse_lines(lines_list):
    for line in lines_list:
        yield line.rstrip().split(' : ', 1)


if __name__ == '__main__':
    from sys import argv
    fi = open(argv[1])
    fo = open(argv[2], 'w')
    for num, url in parse_lines(fi.readlines()):
        fo.write(url + '\n')
    fi.close(); fo.close()

destabilizer
()
Ответ на: комментарий от destabilizer

осспаде, ват ю дуенг?!

awk '{print $3}' file.in > file.out

P.S.

while read url; do wget "$url"; done < file.out

P.P.S.

awk '{print $3}' file.in | while read url; do wget "$url"; done

Deleted
()
Последнее исправление: Deleted (всего исправлений: 2)
Ответ на: комментарий от smilessss

'\r'

GNU win32? или просто файл виндовый?

Stil ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.