Scrapy - извлечение определенных данных с помощью CSS-запроса не работает - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь создать супер простой скребок, который собирает цены на квартиры и квадратные метры с веб-сайта.Я использую Python + scrapy для реализации этого, и у меня есть только одна проблема: кажется, что раздел, в котором находится необходимая информация, выглядит пустым, когда возвращается как ответ, и все, что в нем содержится (div, span и т. Д.), Также не может быть решеночерез CSS-запрос.Я могу получить доступ ко всему, кроме содержимого в этом разделе.

Это веб-сайт: https://www.251brandon.com/floorplans

Так выглядит мой предварительный паук (в данном примере просто ищем класс "fp-price "):

import scrapy

class Brandon251Spider(scrapy.Spider):
name = "Brandon251"

def start_requests(self):
    urls = [
        "https://www.251brandon.com/floorplans"
    ]
    for url in urls:
        yield scrapy.Request(url=url, callback=self.parse)

def parse(self, response):
    price = response.css('.fp-price').extract()

    yield {
        'test': price
    }

Возврат представляет собой пустой SectorList вместо всех элементов, имеющих класс fp-price.

CSS structure of website

Спасибо затвоя помощь.:)

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

@ Каспер правильно, страница сгенерирована с использованием Javascript.Если вы попытаетесь загрузить страницу в браузере с отключенным JavaScript, то содержимое не будет отображаться.Однако, как это часто бывает, когда страница загружается с помощью javascript, нужные вам данные находятся в формате JSON.Я проверил в сетевых ответах одно из значений sqr ft и обнаружил, что все данные загружаются вместе со страницей в переменную с именем pageData.

Если при поиске по источнику страницы вы обнаружите, что это объект JSONопределяется данными страницы, готовыми к созданию страницы.

var pageData = {
  filters: {
    beds: [],
    baths: 0,
    priceRange: {
  low: 0,
  high: 9999
},
sqftRange: {
  low: 0,
  high: 9999
},
availableDate: "all",
amenities: []
  },
  hasImages: true,
  amenities: {
am_0: "Built in USB Ports",
am_1: "Designer Carpeting and Two-Tone Paint",
am_2: "Dishwasher",
am_3: "Double Stainless Steel Sinks",
am_4: "Gas Range",
am_5: "Granite Countertops",
am_6: "Large Patio Or Balcony",
am_7: "Linen Closet",
am_8: "Platinum Silver Kitchen Appliances",
am_9: "Pre-Wired For Technology",
am_10: "Spacious Closets",
am_11: "Stackable Washer/Dryer",
am_12: "Wood Blinds"
  },
  floorplans: [
    {
  id: 2029996,
  name: "1 Bed 1 Bath | 1B",
  amenities: [],
  sqft: 594,
  beds: 1,
  baths: 1.0,
  lowPrice: 2392,
  highPrice: 4208,
  availableCount: 1,
  availableDate: "10/8/2018",
  special: false,
  images: [
    {
      src: "/dmslivecafe/3/234323/1B.png?quality=85",
      alt: "",
      title: "1 Bed 1 Bath | 1B",
      caption: ""
    }
  ],
0 голосов
/ 02 октября 2018

Вы можете попробовать использовать xpath вместо селектора: response.xpath('//*[@id="floorplan"]/text()')

также взгляните на: https://doc.scrapy.org/en/latest/topics/selectors.html

, если @Casper прав, и определенный элемент загружается с помощью javascript, вы должны проверить scrapy-splash (https://github.com/scrapy-plugins/scrapy-splash), это позволит вам загрузить javascript и впоследствии очистить страницу. Удачи!

...