Scrapy下载映像403错误

问题描述 投票:0回答:3

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

目标站点最近更改了它们使用唯一URL交付图像的方式。下载图片时出现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

关于如何下载图像的想法?

python scrapy varnish
3个回答
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处的文档


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, [])]

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()
© www.soinside.com 2019 - 2024. All rights reserved.