Часть HTML не видна для Scrapy - PullRequest
       7

Часть HTML не видна для Scrapy

0 голосов
/ 14 декабря 2018

Настройка

Я использую скрап для очистки рекламных объявлений жилья.

Для каждого объявления я пытаюсь получить информацию о году постройки.

Эта информация указана в большинстве объявлений.


Проблема

Я вижу год постройки и другую информацию вокруг него в разделе about, когда проверяю объявление в браузере и его HTMLкод в режиме разработчика.

Однако, когда я использую Scrapy, мне возвращается пустой список.Я могу очистить другие части страницы объявлений (цены, номера и т. Д.), Но не раздел о них.

Проверьте этот пример объявления .

Если я использую response.css('#caracteristique_bien').extract_first(), я получу,

<div id="caracteristique_bien"></div>

Это так далеко, как я могу пойти.Любое глубже возвращает пустоту.

Как узнать год постройки?

Ответы [ 4 ]

0 голосов
/ 14 декабря 2018
  1. В режиме разработчика перейдите на Сеть и обновите страницу.
  2. Выберите XHR (XMLHttpRequest).
  3. Фильтруйте типпо json

XHR Request

Проверьте корпус ответа на год изготовления.Если он там, отправьте запрос, используя URL-адрес в заголовках вместо того, который вы использовали изначально.

Я не могу получить доступ к сайту, но часто это возвращает ответ «мини».API уже структурирован в формате json.

0 голосов
/ 14 декабря 2018

Загрузил страницу, открыл devtools браузера и сделал ctrl-F с выбранным вами селектором css (caracteristique_bien), и обнаружил этот запрос: https://www.seloger.com/detail,json,caracteristique_bien.json?idannonce=139747359, где вы можете найти то, что вы естьищу

0 голосов
/ 14 декабря 2018

Как я уже говорил, это делается с использованием 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']
0 голосов
/ 14 декабря 2018

Рассматривая ваш пример, адд загружается динамически с javascript, поэтому вы не сможете получить его через scrapy .

Вы можете использовать Selenium для (массового) списания (я делал похожие вещи на известном французском рекламном сайте)

Просто используйте его без параметров в Chrome, и это будет хорошо:

from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument('headless')
driver = webdriver.Chrome(options = options)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...