2014-02-07 2 views
1

В целях обучения Я пытаюсь загрузить все сообщения с изображениями статьи Buzzfeed.Загруженные изображения являются пустым изображением, а не фактическими изображениями

Вот мой код:

import lxml.html 
import string 
import random 
import requests 

url ='http://www.buzzfeed.com/mjs538/messages-from-creationists-to-people-who-believe-in-evolutio?bftw' 
headers = headers = { 
     'User-Agent': 'Mozilla/5.0', 
     'From': '[email protected]' 
} 

page= requests.get(url) 

tree = lxml.html.fromstring(page.content) 

#print(soup.prettify()).encode('ascii', 'ignore') 

images = tree.cssselect("div.sub_buzz_content img") 

def id_generator(size=6, chars=string.ascii_uppercase + string.digits): 
    return ''.join(random.choice(chars) for x in range(size)) 

for image in images: 
    with open(id_generator() + '.jpg', 'wb') as handle: 
     request = requests.get(image.attrib['src'], headers=headers, stream=True) 

     for block in request.iter_content(1024): 
      if not block: 
       break 
      handle.write(block) 

Что извлекаются образы все 110 байтов в размере, и их просмотр просто пустое изображение. Я делаю что-то не так в моем коде здесь, что вызывает проблему? Мне не нужно использовать запросы, если есть более простой способ сделать это.

+0

Попробуйте добавить пользовательского агента по вашему запросу. Многие веб-серверы отклоняют запросы без пользовательского агента. Обычно обычным образом оставлять адрес электронной почты в пользовательском агенте при обходе, чтобы позволить владельцу сервера связаться с вами, если они не одобряют обход. –

+0

@SteinarLima Все еще не повезло с добавлением пользовательского агента. Я обновил свой OP новым кодом. Я считаю, что я правильно реализовал пользовательский агент? – ComputerLocus

+0

С другой стороны: вы не должны хранить такие изображения на своем компьютере. Они заставят вас выглядеть глупо. –

ответ

1

Если вы внимательно посмотрите на исходный код веб-страницы, которую вы пытаетесь ползать, вы увидите, что изображение URL, вы хотите не указано в атрибуте img тегов src, но в атрибуте rel:bf_image_src.

Изменение image.attrib['src'] до image.attrib['rel:bf_image_src'] должно устранить вашу проблему.

мне не удалось повторить свой код (он утверждает, что cssselect не установлен), но этот код с BeautifulSoup и urllib2 работать бесперебойно на моем компьютере, и скачать все 22 фотографий.

from itertools import count 
from bs4 import BeautifulSoup 
import urllib2 
from time import sleep 


url ='http://www.buzzfeed.com/mjs538/messages-from-creationists-to-people-who-believe-in-evolutio?bftw' 
headers = { 
    'User-Agent': 'Non-commercical crawler, Steinar Lima. Contact: https://stackoverflow.com/questions/21616904/images-downloaded-are-blank-images-instead-of-actual-images' 
} 

r = urllib2.Request(url, headers=headers) 
soup = BeautifulSoup(urllib2.urlopen(r)) 
c = count() 

for div in soup.find_all('div', id='buzz_sub_buzz'): 
    for img in div.find_all('img'): 
     print img['rel:bf_image_src'] 
     with open('images/{}.jpg'.format(next(c)), 'wb') as img_out: 
      req = urllib2.Request(img['rel:bf_image_src'], headers=headers) 
      img_out.write(urllib2.urlopen(req).read()) 
      sleep(5) 
+0

Мне интересно, что означает это обозначение: 'images/{}. Jpg' – ComputerLocus

+0

@Fogest Это для формирования строки с использованием [str.format] (http: //docs.python. орг/2/библиотека/stdtypes.html # str.format). Я использую 'c' как [' itertools.count'] (http://docs.python.org/2/library/itertools.html#itertools.count) и используя '' images/{}. Jpg ' .format (next (c)) ', имена файлов начинаются с' 0.jpg' и подсчитываются вверх. –

+0

Ну ладно, это имеет смысл. Является ли 'count()' по сути эквивалентом установки целого числа в 0 и затем приращения его при каждом запуске цикла? Если да, есть ли преимущество использования 'count()'? Использование добавочных чисел, вероятно, является лучшим решением, чем использование случайных строк, как я. – ComputerLocus

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