Scrapy下载图像403错误

时间:2014-11-27 14:56:48

标签: python scrapy varnish

我尝试从此网站下载图片:http://www.domu.com/chicago/neighborhoods/humboldt-park/1641-n-maplewood-ave-apt-1-chicago-il-60647

目标网站最近更改了使用唯一网址投放图片的方式。我下载图片时收到403错误。下方链接。我可以在浏览器中加载每个图像一次。加载图像一次后,后续请求会产生403错误。当我将浏览器更改为私人模式时,我可以多次重新加载图像。这让我相信他们正在以某种方式跟踪cookie。我试图在scrapy中禁用cookie,但继续收到403错误。我还尝试启用cookie,但一次处理一个请求。这也会产生403错误。目标站点正在使用清除服务器进行缓存。我认为Varnish包含一些防刮技术。

http://www.domu.com/sites/default/files/styles/gallery/public/filefield/field_img/20141117_133559.jpg?itok=pDSP-06i

有关如何下载图片的想法吗?

3 个答案:

答案 0 :(得分:1)

这是使用Selenium Webdriver和命令wget的可能解决方案。

通过Webdriver,您可以模拟浏览器导航并提取唯一的URL并通过wget命令下载。

from selenium import webdriver
import time
import scrapy
class domuSpider(CrawlSpider):
    name = "domu_spider"
    allowed_domains = ['domu.com']
    start_urls = ['http://www.domu.com/chicago/neighborhoods/humboldt-park/1641-n-maplewood-ave-apt-1-chicago-il-60647']

    def __init__(self):
        self.driver = webdriver.Firefox()

    def parse(self, response):
        self.driver.get(response.url)

        for element in self.driver.find_elements_by_css_selector("img"):
            print element.get_attribute('src')
            time.sleep(1)
            os.system('wget ' + element.get_attribute('src'))
        self.driver.quit()

http://selenium-python.readthedocs.org

上的文档

答案 1 :(得分:0)

我能够通过将引用添加到标头来解决此问题。

我用这篇文章来帮忙: How to add Headers to Scrapy CrawlSpider Requests?

这是我的自定义图片管道:

class MyImagesPipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
        return [Request(x, headers={'referer': 'http://www.domu.com'}) for x in item.get(self.IMAGES_URLS_FIELD, [])]

答案 2 :(得分:0)

尝试这个:

导入这些:

import scrapy
import urllib.request

您的函数如下:

def parse(self,response):
   #extract your images url
   imageurl = response.xpath("//img/@src").get()
   imagename = imageurl.split("/")[-1].split(".")
   imagename = "addsomethingcustom"+imagename[0] + imagename[-1]
   req = urllib.request.Request(imageurl, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.100 Safari/537.36'})
   resource = urllib.request.urlopen(req)
   output = open("foldername/"+imagename,"wb")
   output.write(resource.read())
   output.close()