2013-09-27 4 views
3

Я пытаюсь скачать кучу PDF-файлов из here с помощью запросов и beautifulsoup4. Это мой код:Загрузка файлов с помощью запросов и BeautifulSoup

import requests 
from bs4 import BeautifulSoup as bs 

_ANO = '2013/' 
_MES = '01/' 
_MATERIAS = 'matematica/' 
_CONTEXT = 'wp-content/uploads/' + _ANO + _MES 
_URL = 'http://www.desconversa.com.br/' + _MATERIAS + _CONTEXT 

r = requests.get(_URL) 
soup = bs(r.text) 

for i, link in enumerate(soup.findAll('a')): 
    _FULLURL = _URL + link.get('href') 

    for x in range(i): 
     output = open('file[%d].pdf' % x, 'wb') 
     output.write(_FULLURL.read()) 
     output.close() 

Я получаю AttributeError: 'str' object has no attribute 'read'.

Хорошо, я знаю это, но ... как можно загрузить с этого URL-адреса?

+0

почему строка прочитал()? –

+0

FULLURL - это, очевидно, строка. И вы, вероятно, захотите получить содержимое этого URL-адреса и сохранить контент вместо сохранения URL-адреса. Поэтому, пожалуйста, исправьте свой код. –

+0

открыть URL с 'request.get (_FULLURL)', и вы сможете сохранить содержимое содержимого ответа в файл. – TankorSmash

ответ

5

Это напишет все файлы со страницы с их исходными именами файлов в каталог pdfs/.

import requests 
from bs4 import BeautifulSoup as bs 
import urllib2 


_ANO = '2013/' 
_MES = '01/' 
_MATERIAS = 'matematica/' 
_CONTEXT = 'wp-content/uploads/' + _ANO + _MES 
_URL = 'http://www.desconversa.com.br/' + _MATERIAS + _CONTEXT 

# functional 
r = requests.get(_URL) 
soup = bs(r.text) 
urls = [] 
names = [] 
for i, link in enumerate(soup.findAll('a')): 
    _FULLURL = _URL + link.get('href') 
    if _FULLURL.endswith('.pdf'): 
     urls.append(_FULLURL) 
     names.append(soup.select('a')[i].attrs['href']) 

names_urls = zip(names, urls) 

for name, url in names_urls: 
    print url 
    rq = urllib2.Request(url) 
    res = urllib2.urlopen(rq) 
    pdf = open("pdfs/" + name, 'wb') 
    pdf.write(res.read()) 
    pdf.close() 
+0

@ filipe-manuel Я проверил это и успешно загрузил файлы. Это работало для вас? – samstav

2

Это может быть проще с wget, потому что тогда у вас есть full power of wget (агент пользователя, следить, игнорировать robots.txt ...), если это необходимо:

import os 

names_urls = zip(names, urls) 

for name, url in names_urls: 
    print('Downloading %s' % url) 
    os.system('wget %s' % url) 
+0

Я согласен с @ Balzer82 здесь, закодированный код с помощью wget после разбора всех необходимых файлов URL-адресов – Anirudh

Смежные вопросы