我正在尝试从此站点下载图像: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包含一些防刮技术。
关于如何下载图像的想法?
这里是使用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()
我能够通过将引荐来源网址添加到标头中来解决此问题。
我用这篇文章来帮助: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, [])]
尝试这个:
导入这些:
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()