Как я уже говорил, это делается с использованием javascript, что означает, что некоторые части HTML будут загружаться браузером динамически (Scrapy
не является браузером).
Хорошая вещь для этого случаяявляется то, что javascript находится внутри фактического запроса, что означает, что вы все еще можете анализировать информацию, но по-разному.
Например, чтобы получить описание, вы можете найти его внутри:
import re
import demjson
script_info = response.xpath('//script[contains(., "Object.defineProperty")]/text()').extract_first()
# getting description
description_json = re.search("descriptionBien', (\{.+?\});", script_info, re.DOTALL)
real_description = demjson.decode(description_json)['value']
# getting surface area
surface_json = re.search("surfaceT', (\{.+?\})\);", script_info, re.DOTALL).group(1)
real_surface = demjson.decode(surface_json)['value']
...
Как видите, script_info
содержит всю информацию, вам просто нужно придумать способ разобрать это, чтобы получить то, что вы хотите
Но есть некоторая информация, которая не входит в тот же ответ,Чтобы получить его, вам нужно выполнить запрос GET:
https://www.seloger.com/detail,json,caracteristique_bien.json?idannonce=139747359
Как видите, для него требуется только idannonce
, который вы можете получить из предыдущего ответа с помощью:
demjson.decode(re.search("idAnnonce', (\{.+?\})\);", script_info, re.DOTALL).group(1))['value']
Позже со вторым запросом вы можете получить, например, «год постройки» с помощью:
import json
...
[y for y in [x for x in json.loads(response.body)['categories'] if x['name'] == 'Général'][0]['criteria'] if 'construction' in y['value']][0]['value']