首页 文章

无法使用scrapy刮取结果列表中的数据

提问于
浏览
1

我目前正试图在这个page上刮掉汽车的链接 .

我在chrome控制台上运行了这个xpath命令,以返回每辆车的链接

$x('//div[@class="vehicle-make-model"]/h3/a/@href')

但是,当我尝试使用相同的xpath时,在使用scrapy shell命令时,它不会返回任何链接 . 这是我为scrapy shell命令运行的代码

response.xpath('//div[@class="vehicle-make-model"]/h3/a/@href')

有人能指出我做错了什么吗?

1 回答

  • 1

    在Chrome中运行的XPath运行在使用JavaScript构建的DOM之上 . 这就是为什么有时一件事在Chrome中起作用但在scrapy shell中不起作用的原因 .

    您链接的页面就是这种情况 . 如果您查看页面的来源(右键单击并选择“查看页面源”或按Ctrl-U),您将看到Scrapy获得的相同数据 .

    在这种特殊情况下,数据似乎都在一个JSON块中,因此您可以提取JSON代码并使用python的JSON模块解析它,例如:

    import json
    raw_json = response.xpath(
        "//script[contains(., 'window.jsonData')]/text()"
    ).re('window.jsonData\s*=\s*(.+);$')[0]
    json_data = json.loads(raw_json)
    

    然后,您可以使用 json_data 中的数据构建下一个请求或刮取您需要的任何内容 .

    如果没有一个易于解析的JSON,另一个选择是使用js2xml库将JavaScript解析成一个你可以使用XPath抓取的XML .

相关问题