2014-02-07 9 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이 설치되어 있지 않음). BeautifulSoupurllib2 코드는 내 컴퓨터에서 부드럽게 실행되고 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.)을 사용하여 문자열을 형식화하기위한 것입니다. org/2/library/stdtypes.html # str.format). 나는''itertools.count' (http://docs.python.org/2/library/itertools.html#itertools.count)와''images/{}. jpg ''를 사용하여'c'를 사용합니다. .format (next (c))', 파일 이름은'.jpg'에서 시작해서 위쪽으로 셀 수 있습니다. –

+0

아, 그래. 'count()'는 기본적으로 정수를 0으로 설정 한 다음 루프가 실행될 때마다이를 증가시키는 것과 동일합니까? 그렇다면'count()'를 사용하는 것이 유리합니까? 증가하는 숫자를 사용하는 것은 아마도 내가했던 것처럼 임의의 문자열을 사용하는 것보다 나은 해결책 일 것입니다. – ComputerLocus

관련 문제