2017-05-02 4 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

関連する問題