Scrapy-splash 找不到图片来源 url
Scrapy-splash Can't find image source url
我正在尝试从 ZARA 抓取产品页面。喜欢这个:https://www.zara.com/us/en/fitted-houndstooth-blazer-p07808160.html?v1=108967877&v2=1718115
我的 scrapy-splash 容器是 运行。在 shell 我获取页面
fetch('http://localhost:8050/render.html?url=https://www.zara.com/us/en/fitted-houndstooth-blazer-p07808160.html?v1=108967877&v2=1718115')
2021-05-14 14:30:42 [scrapy.core.engine] INFO: Spider opened
2021-05-14 14:30:43 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://localhost:8050/render.html?url=https://www.zara.com/us/en/fitted-houndstooth-blazer-p07808160.html?v1=108967877&v2=1718115> (referer: None)
到目前为止一切正常,我可以得到 header 和价格。但是,我想获取产品的图片 URL。
我尝试通过
到达
response.css('img.media-image__image::attr(src)').getall()
但响应是这样的:
['https://static.zara.net/stdstatic/1.211.0-b.44/images/transparent-background.png', 'https://static.zara.net/stdstatic/1.211.0-b.44/images/transparent-background.png', 'https://static.zara.net/stdstatic/1.211.0-b.44/images/transparent-background.png', 'https://static.zara.net/stdstatic/1.211.0-b.44/images/transparent-background.png', 'https://static.zara.net/stdstatic/1.211.0-b.44/images/transparent-background.png', 'https://static.zara.net/stdstatic/1.211.0-b.44/images/transparent-background.png']
全部为背景图片,并非真实图片。我可以在浏览器上显示图像,并且可以看到网络请求中出现的图像。是因为加载了 AJAX 个请求吗?我该如何解决?
我上周才开始研究网络抓取,所以我不确定我是否能提供很多帮助,但我确实找到了一些东西。
源代码在顶部的脚本中显示了这一点:
_mkt_imageDir = /BASE_IMAGES_URL=(.*?);/.test(document.cookie) && RegExp. || 'https://static.zara.net/photos/';
再往下看:
"originalUrl":"/us/en/fitted-houndstooth-blazer-p07808160.html?v1=108967877&v2=1718115","imageBaseUrl":"https://static.zara.net/photos/"
那么这里的所有图像似乎都在 javascript:
[{"@context":"http://schema.org/","@type":"Product","sku":"108967877-046-1","name":"FITTED HOUNDSTOOTH BLAZER","mpn":"108967877-046-1","brand":"ZARA","description":"","image":["https://static.zara.net/photos///2021/I/0/1/p/7808/160/046/2/w/1920/7808160046_1_1_1.jpg?ts=1620821843383","https://static.zara.net/photos///2021/I/0/1/p/7808/160/046/2/w/1920/7808160046_2_1_1.jpg?ts=1620821851988","https://static.zara.net/photos///2021/I/0/1/p/7808/160/046/2/w/1920/7808160046_2_2_1.jpg?ts=1620821839280","https://static.zara.net/photos///2021/I/0/1/p/7808/160/046/2/w/1920/7808160046_6_1_1.jpg?ts=1620655538200","https://static.zara.net/photos///2021/I/0/1/p/7808/160/046/2/w/1920/7808160046_6_2_1.jpg?ts=1620655535611","https://static.zara.net/photos///2021/I/0/1/p/7808/160/046/2/w/1920/7808160046_6_3_1.jpg?ts=1620656141718","https://static.zara.net/photos///contents/cm/w/1920/sustainability-extrainfo-label-JL78_0.jpg?ts=1602602200357"]
我不知道你会如何抓取它们,但当你找到答案时我很想知道答案。
问候塞缪尔
看起来网址在 json 文件中,我相信您可以从中抓取网址。
json
关于从 json here
中抓取的一些 info/code
@samuelhogg 因找到 json
而值得称赞,但这里有一个蜘蛛示例,展示了如何从页面获取所有图像 url。请注意,您甚至不需要在这里使用 splash,我没有使用 splash 对其进行测试,但我认为它应该仍然有效。
from scrapy import Spider
import json
class Zara(Spider):
name = "zara"
start_urls = [
"https://www.zara.com/us/en/fitted-houndstooth-blazer-p07808160.html?v1=108967877&v2=1718115"
]
def parse(self, response):
# Find the json identified by @samuelhogg
data = response.css("script[type='application/ld+json']::text").get()
# Make a set of all the images in the json
images = {image for i in json.loads(data) for image in i["image"]}
# Do what you want with them!
print(images)
我正在尝试从 ZARA 抓取产品页面。喜欢这个:https://www.zara.com/us/en/fitted-houndstooth-blazer-p07808160.html?v1=108967877&v2=1718115
我的 scrapy-splash 容器是 运行。在 shell 我获取页面
fetch('http://localhost:8050/render.html?url=https://www.zara.com/us/en/fitted-houndstooth-blazer-p07808160.html?v1=108967877&v2=1718115')
2021-05-14 14:30:42 [scrapy.core.engine] INFO: Spider opened
2021-05-14 14:30:43 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://localhost:8050/render.html?url=https://www.zara.com/us/en/fitted-houndstooth-blazer-p07808160.html?v1=108967877&v2=1718115> (referer: None)
到目前为止一切正常,我可以得到 header 和价格。但是,我想获取产品的图片 URL。
我尝试通过
到达response.css('img.media-image__image::attr(src)').getall()
但响应是这样的:
['https://static.zara.net/stdstatic/1.211.0-b.44/images/transparent-background.png', 'https://static.zara.net/stdstatic/1.211.0-b.44/images/transparent-background.png', 'https://static.zara.net/stdstatic/1.211.0-b.44/images/transparent-background.png', 'https://static.zara.net/stdstatic/1.211.0-b.44/images/transparent-background.png', 'https://static.zara.net/stdstatic/1.211.0-b.44/images/transparent-background.png', 'https://static.zara.net/stdstatic/1.211.0-b.44/images/transparent-background.png']
全部为背景图片,并非真实图片。我可以在浏览器上显示图像,并且可以看到网络请求中出现的图像。是因为加载了 AJAX 个请求吗?我该如何解决?
我上周才开始研究网络抓取,所以我不确定我是否能提供很多帮助,但我确实找到了一些东西。
源代码在顶部的脚本中显示了这一点:
_mkt_imageDir = /BASE_IMAGES_URL=(.*?);/.test(document.cookie) && RegExp. || 'https://static.zara.net/photos/';
再往下看:
"originalUrl":"/us/en/fitted-houndstooth-blazer-p07808160.html?v1=108967877&v2=1718115","imageBaseUrl":"https://static.zara.net/photos/"
那么这里的所有图像似乎都在 javascript:
[{"@context":"http://schema.org/","@type":"Product","sku":"108967877-046-1","name":"FITTED HOUNDSTOOTH BLAZER","mpn":"108967877-046-1","brand":"ZARA","description":"","image":["https://static.zara.net/photos///2021/I/0/1/p/7808/160/046/2/w/1920/7808160046_1_1_1.jpg?ts=1620821843383","https://static.zara.net/photos///2021/I/0/1/p/7808/160/046/2/w/1920/7808160046_2_1_1.jpg?ts=1620821851988","https://static.zara.net/photos///2021/I/0/1/p/7808/160/046/2/w/1920/7808160046_2_2_1.jpg?ts=1620821839280","https://static.zara.net/photos///2021/I/0/1/p/7808/160/046/2/w/1920/7808160046_6_1_1.jpg?ts=1620655538200","https://static.zara.net/photos///2021/I/0/1/p/7808/160/046/2/w/1920/7808160046_6_2_1.jpg?ts=1620655535611","https://static.zara.net/photos///2021/I/0/1/p/7808/160/046/2/w/1920/7808160046_6_3_1.jpg?ts=1620656141718","https://static.zara.net/photos///contents/cm/w/1920/sustainability-extrainfo-label-JL78_0.jpg?ts=1602602200357"]
我不知道你会如何抓取它们,但当你找到答案时我很想知道答案。
问候塞缪尔
看起来网址在 json 文件中,我相信您可以从中抓取网址。 json
关于从 json here
中抓取的一些 info/code@samuelhogg 因找到 json
而值得称赞,但这里有一个蜘蛛示例,展示了如何从页面获取所有图像 url。请注意,您甚至不需要在这里使用 splash,我没有使用 splash 对其进行测试,但我认为它应该仍然有效。
from scrapy import Spider
import json
class Zara(Spider):
name = "zara"
start_urls = [
"https://www.zara.com/us/en/fitted-houndstooth-blazer-p07808160.html?v1=108967877&v2=1718115"
]
def parse(self, response):
# Find the json identified by @samuelhogg
data = response.css("script[type='application/ld+json']::text").get()
# Make a set of all the images in the json
images = {image for i in json.loads(data) for image in i["image"]}
# Do what you want with them!
print(images)