使用 Scrapy 从延迟加载内容中提取图像源

Extract image source from lazy loading content with Scrapy

我正在尝试使用 Scrapy 提取 src img 标签的值。

例如:

<img src="https://media.rightmove.co.uk/map/_generate?width=768&amp;height=347&amp;zoomLevel=15&amp;latitude=53.803485&amp;longitude=-1.561766&amp;signature=rq2YsiaRQTXqZ2ilgvbFF3fdWfU=" alt="Property location on the map" loading="lazy">

我想提取 URL:

https://media.rightmove.co.uk/map/_generate?width=768&amp;height=347&amp;zoomLevel=15&amp;latitude=53.803485&amp;longitude=-1.561766&amp;signature=rq2YsiaRQTXqZ2ilgvbFF3fdWfU=

当我查看从 scrapy shell 返回的 Chrome 中的响应时,我可以看到我想要(通过开发人员工具)提取的数据,但是当我尝试使用 XPath 提取它时returns 没有。

例如

response.xpath("""//*[@id="root"]/div/div[3]/main/div[15]/div/a/img""").get()

我猜 loading="lazy" 与此有关,但是,从 scrapy 返回的响应显示了我在浏览器中查看时想要的数据(禁用 javascript)。

重现步骤:

$ scrapy shell https://www.rightmove.co.uk/properties/91448747#/
$ view(response)

有人知道如何从地图中提取 URL 吗?我有兴趣这样做以提取 属性.

的经纬度

这个HTML标签是在浏览器打开页面时由一些JS生成的。使用 view(response) 检查时,我建议在 devtools/Network 选项卡中将选项卡设置为 Offline 并重新加载页面。

这将阻止选项卡下载其他内容,就像 scrapy shell 一样。确实,这样做之后我们可以看到此时这个标签是不存在的

但是这些数据似乎在其中一个脚本标签上可用。您可以检查它执行以下命令。

$ scrapy shell https://www.rightmove.co.uk/properties/91448747#/
import json
jdata = json.loads(response.xpath('//script').re_first('window.PAGE_MODEL = (.*)'))
from pprint import pprint as pp
pp(jdata)