2017-05-02 5 views
1

사이트에서 이미지를 다운로드하기 위해 스 크레이퍼를 만들었습니다. 그러나 이것을 실행하면 다음과 같은 오류가 표시됩니다. [HTTPError (req.full_url, code, msg, hdrs, fp) urllib.error.HTTPError : HTTP 오류 403]. 나는이 방법을 다른 사이트에서도 사용하여 이미지를 긁어 냈지만 문제는 발생하지 않았습니다. 왜이 오류가 나타나는지, 해결 방법은 무엇인지 알 수 없습니다. 누군가가 그것을 들여다보기를 바랍니다.내 스크레이퍼에서 이미지를 다운로드하는 대신 오류가 발생합니다.

import requests 
import urllib.request 
from lxml import html 

def PictureScraping(): 
    url = "https://www.yify-torrent.org/search/1080p/" 
    response = requests.get(url) 
    tree = html.fromstring(response.text) 
    titles = tree.xpath('//div[@class="movie-image"]') 
    for title in titles: 
     Pics = "https:" + title.xpath('.//img/@src')[0] 
     urllib.request.urlretrieve(Pics, Pics.split('/')[-1]) 
PictureScraping() 
+0

'403' HTTP 코드, 일명 * 인증되지 않은 *입니다. 당신은 틀림없이 크롤러로 목격 당했고 검은 색으로 나열되었습니다. 이런 종류의 행동을 우회하려면 프록시 및 사용자 에이전트 http 헤더를 사용해야합니다. – Arount

답변

2

초기 페이지를 만드는 데 사용한 것과 동일한 웹 스크래핑 세션을 사용하여 이미지를 다운로드해야합니다. 작업 코드 :

import requests 
from lxml import html 


def PictureScraping(): 
    url = "https://www.yify-torrent.org/search/1080p/" 
    with requests.Session() as session: 
     response = session.get(url) 

     tree = html.fromstring(response.text) 
     titles = tree.xpath('//div[@class="movie-image"]') 
     for title in titles: 
      image_url = title.xpath('.//img/@src')[0] 
      image_name = image_url.split('/')[-1] 
      print(image_name) 
      image_url = "https:" + image_url 

      # download image 
      response = session.get(image_url, stream=True) 
      if response.status_code == 200: 
       with open(image_name, 'wb') as f: 
        for chunk in response.iter_content(1024): 
         f.write(chunk) 

PictureScraping() 
+0

오 세상에! 마술처럼 작동합니다. 귀하의 효과적인 솔루션을 위해 고마워요. – SIM

관련 문제