Salve vários destinos de URL em arquivos de texto

4

Eu tenho uma lista de URLs e quero salvar cada um dos seus alvos em um arquivo de texto separado.

Veja um exemplo do arquivo de entrada contendo as URLs:

~$: head -3 url.txt 
http://www.uniprot.org/uniprot/P32234.txt
http://www.uniprot.org/uniprot/P05552.txt 
http://www.uniprot.org/uniprot/P07701.txt

Atualmente, estou usando uma função personalizada do Python para realizar essa tarefa. Funciona, mas os principais inconvenientes são: o usuário tem que copiar e colar URLs manualmente (não há entrada direta de arquivo) e a saída contém alguns caracteres 'b' no início de cada linha (binário).

~$: head -3 P32234.txt
b' ID   128UP_DROME             Reviewed;         368 AA.
'b' AC   P32234; Q9V648;
'b' DT   01-OCT-1993, integrated into UniProtKB/Swiss-Prot.

Aqui está o código Python:

def html_to_txt(): 
    import urllib.request 
    url = str(input('Enter URL: ')) 
    page = urllib.request.urlopen(url) 
    with open(str(input('Enter filename: ')), "w") as f: 
        for x in page: 
            f.write(str(x).replace('\n','\n')) 
    s= 'Done' 
    return s

Existe uma maneira mais limpa de fazer isso usando alguns utilitários Unix?

    
por dovah 06.08.2014 / 09:47

6 respostas

6

Use a opção -i :

wget -i ./url.txt

De man wget :

-i file

--input-file=file

Read URLs from a local or external file. If - is specified as file, URLs are read from the standard input. (Use ./- to read from a file literally named -.) If this function is used, no URLs need be present on the command line. If there are URLs both on the command line and in an input file, those on the command lines will be the first ones to be retrieved. If --force-html is not specified, then file should consist of a series of URLs, one per line.

However, if you specify --force-html, the document will be regarded as html. In that case you may have problems with relative links, which you can solve either by adding "" to the documents or by specifying --base=url on the command line.

If the file is an external one, the document will be automatically treated as html if the Content-Type matches text/html. Furthermore, the file's location will be implicitly used as base href if none was specified.

    
por 06.08.2014 / 10:09
5

wget tem uma opção para fazer exatamente isso:

wget --input-file url.txt

lerá um URL por linha de url.txt e os baixará para o diretório atual seqüencialmente.

Mais geralmente, você pode usar xargs para esse tipo de coisa, combinado com wget ou curl :

xargs wget < url.txt
xargs curl -O < url.txt

xargs lê cada linha de sua entrada e a fornece como um argumento para um comando que você fornece. Aqui esse comando é wget ou curl -O , os quais baixam uma URL e a salvam no diretório atual. < url.txt fornece o conteúdo de url.txt como entrada para o comando xargs .

O problema com o seu código Python é que o que você obtém do urllib é byte que você está imprimindo diretamente em um arquivo, que vincula os bytes a b'abc%code%%code%a...' (que é como você escreve literais de byte).

    
por 06.08.2014 / 09:51
2

com w3m :

echo 'http://unix.stackexchange.com/questions/148670/save-html-to-text-file' |
tee - - - | 
xargs -n1 w3m -dump | 
sed '/Save html/!d;N;N;N;N;N;N;N' 

Parece-me que xargs não deveria ser necessário - certamente existe uma configuração para vários URLs de uma só vez, mas não consigo criá-lo no momento. Em qualquer caso, xargs funciona:

Save html to text file

            I'd like to save some (plain HTML) web pages to text file, from URL
            stored in text files as well.

            Here's an exemple of the input file containing the URLs:

            ~$: head -3 url.txt
Save html to text file

            I'd like to save some (plain HTML) web pages to text file, from URL
            stored in text files as well.

            Here's an exemple of the input file containing the URLs:

            ~$: head -3 url.txt
Save html to text file

            I'd like to save some (plain HTML) web pages to text file, from URL
            stored in text files as well.

            Here's an exemple of the input file containing the URLs:

            ~$: head -3 url.txt
Save html to text file

            I'd like to save some (plain HTML) web pages to text file, from URL
            stored in text files as well.

            Here's an exemple of the input file containing the URLs:

            ~$: head -3 url.txt
    
por 06.08.2014 / 11:14
2

Eu faria isso no shell com o wget.

while read y; do
     wget "$y"
done < url.txt
    
por 06.08.2014 / 09:51
1

Existem dois outros métodos:

wget $(<file)

e

while read -r link; do wget "$link"; done < file
    
por 06.08.2014 / 10:18
1

Pessoalmente, gostaria apenas de manter os ACs UniProt no arquivo:

$ cat names
P32234
P05552
P07701

Você pode usar o mesmo arquivo para várias operações. Por exemplo, para baixar o arquivo simples correspondente do UniProt, alimente-o em um loop:

while read prot; do 
    wget http://www.uniprot.org/uniprot/"$prot".txt -O "$prot".flat
done < names

Como o seu arquivo agora só tem as acessões, você pode reutilizá-lo para obter, por exemplo, os IDs correspondentes:

$ while read prot; do  
    printf "%s\t" "$prot"
    wget http://www.uniprot.org/uniprot/"$prot".txt -O - | 
        awk '$1=="ID"{print $2}'; 
 done 2>/dev/null < names 
P32234  128UP_DROME
P05552  ADF1_DROME
P07701  SGS5_DROME
    
por 06.08.2014 / 16:28

Tags