我尝试从此网站下载图片: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包含一些防刮技术。
有关如何下载图片的想法吗?
答案 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()
上的文档
答案 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()