我从欲望网站获取所有详细信息,但无法获取某些特定信息,请为此指导我。无法从网站获取列表值
targeted domain: https://shop.adidas.ae/en/messi-16-3-indoor-boots/BA9855.html
my code is
response.xpath('//ul[@class="product-size"]//li/text()').extract()
need to fetch data!!!
我从欲望网站获取所有详细信息,但无法获取某些特定信息,请为此指导我。无法从网站获取列表值
targeted domain: https://shop.adidas.ae/en/messi-16-3-indoor-boots/BA9855.html
my code is
response.xpath('//ul[@class="product-size"]//li/text()').extract()
need to fetch data!!!
通常电子商务网站在页面源代码中使用json格式的数据,然后将javscript在用户端解压缩。
在这种情况下,您可以打开禁用JavaScript的页面源代码并搜索关键字(如特定大小)。
我在这种情况下,发现它可以使用正则表达式中找到:
import re
import json
data = re.findall('window.assets.sizesMap = (\{.+?\});', response.body_as_unicode())
json.loads(data[0])
Out:
{'16': {'uk': '0k', 'us': '0.5'},
'17': {'uk': '1k', 'us': '1'},
'18': {'uk': '2k', 'us': '2.5'},
...}
编辑:更准确地说,你可能想要得到的JSON的不同部分,但还是回答或多或少是相同的:
data = re.findall('window.assets.sizes = (\{(?:.|\n)+?\});', response.body_as_unicode())
json.loads(data[0].replace("'", '"')) # replace single quotes to doubles
我在应用您的代码时遇到错误。 'IndexError Traceback(last recent call last)
似乎你的正则表达式是不同的,我的是''window.assets.sizes =(\ {(?:。| \ n )+?\});''vs你的''window.assets.sizes =(\ {。+?\});''。 – Granitosaurus
sir @Granitosaurus你能帮我解决飞溅问题吗?机器来完成这个任务,我尝试过但是不能完成它 –
您想要获取的数据是从javascript中加载的。它在标签class="js-size-value "
中明确表示。
如果你想得到它,你将需要使用渲染服务。我建议你使用Splash,安装简单,使用简单。你将需要码头安装飞溅。
虽然这是一个很好的懒惰选项,但它远非必要。通过挖掘一下,你可以在scrapy中用python复制javascript。 – Granitosaurus
是的,我同意。我会挖掘更多之前使用splash splash.Thanks的提示:-) –
@Blanquer Adrien意味着可能使用scrapy获得JavaScript基础数据。 –
它从javascript加载。 – mkHun
@mkHun请你给我**指导**完成任务。谢谢 –
在查看页面源码检查下面的JS变量'window.assets.sizesMap'。 – mkHun