【问题标题】:Scrapy - Extracting specific data via CSS query doesn't workScrapy - 通过 CSS 查询提取特定数据不起作用
【发布时间】:2018-10-02 16:54:19
【问题描述】:

我正在尝试实现一个超级简单的抓取工具,它可以从网站上抓取公寓价格和平方英尺。我使用 Python + scrapy 来实现它,只有一个问题:似乎该部分是所需的信息,当作为响应返回时显示为空,并且它包含的所有内容(div、spans 等)也无法解决通过 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 类的元素。

感谢您的帮助。 :)

【问题讨论】:

  • 查看页面源代码(而不是检查)。您会看到该页面是通过 javascript 构建的,因此爬虫无法通过蜘蛛中指定的 CSS 选择器提取此数据。

标签: python scrapy css-selectors


【解决方案1】:

您可以尝试使用 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 并在之后抓取页面。祝你好运!

【讨论】:

  • 感谢大家的快速回复。通过 javascript 动态生成的内容确实是一个问题。 Scrapy 在“浏览器”中的构建仅返回原始 html 代码而不执行 javascript。使用 splash 和插件 scrapy-splash 有效!这是一个很好的简短视频,帮助我添加了scrapy-splash:youtube.com/watch?v=VvFC93vAB7U
【解决方案2】:

@Casper 是正确的,页面是使用 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: ""
    }
  ],

【讨论】:

    猜你喜欢
    • 2020-11-22
    • 2021-10-25
    • 2019-09-27
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2017-01-09
    • 2014-02-04
    • 1970-01-01
    相关资源
    最近更新 更多