【问题标题】:scrapy and chromium tools don't return the same valuesscrapy 和 chromium 工具不返回相同的值
【发布时间】:2017-09-24 12:56:34
【问题描述】:

我正在学习scrapy,目前正在玩它的外壳。作为一个简单的练习,我想从这个站点中提取可见的房间图像: https://www.gumtree.com/flats-houses/london。 开火后:

scrapy shell "https://www.gumtree.com/flats-houses/london"

我正在使用以下简单的命令来完成这项工作:

response.xpath("//div[@class='listing-side']/div[@class='listing-thumbnail']/img/@src").extract()

但是它返回一个包含 30 个元素的列表,其中 25 个值是空字符串。首先,我认为我的 xpath 一定有问题,所以我用 chromium 工具对其进行了测试,我必须说它就像一个返回完整图像 url 列表的魅力。一切如预期。但是为什么scrapy不这样做呢?

编辑:

抱歉,实际上在这个站点的情况下,要启动 shell 必须发出以下命令:

shell -s USER_AGENT="Mozila/5.0" "https://www.gumtree.com/flats-houses/london"

换句话说,必须指定用户代理。

【问题讨论】:

    标签: python web-scraping scrapy


    【解决方案1】:

    尝试这样做:

    listings = response.xpath("//div[@class='listing-thumbnail']")
    images = [listing.xpath('.//img/@src').extract()[1] for listing in listings]
    

    'images' 是一个包含所有列表图像的列表。

    【讨论】:

    • 它似乎有效,但我不明白为什么我的方法不起作用。即使在玩了一段时间后,我发现如果我将“src”属性更改为“data-lazy”,它会按预期开始工作。这里应该注意的是,这两种方法都适用于铬工具。您对如何解释这种行为有任何想法吗?
    • @Albert,在制作任何抓取工具之前,您应该确保禁用 javascript,然后想出抓取的逻辑。否则你会混淆浏览器和scrapy行为。
    • @TarunLalwani 啊,太对了!出于某种原因,我没有考虑过,我的错。但现在一切都清楚了。谢谢!
    • @Albert 请记住 Scrapy 默认不处理 javascript。如果你想抓取带有 javascript 生成内容的网站,你可以使用 Splash link
    • @mostaszewski 是的,我想说这很明显,也很合乎逻辑,但出于某种原因,它只是让我忘记了……我当时想:“为什么以所有美好的名义……” .谢谢!
    【解决方案2】:

    没办法。有一个解决方案给你。你期望的方式。试试这个:

    for item in response.xpath("//img[@itemprop='image'][not(@aria-hidden)]/@src").extract():
        print(item)
    

    并使用 css 选择器:

    for item in response.css("[itemprop='image']:not([aria-hidden])::attr(src)").extract():
        print(item)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-07
      • 1970-01-01
      相关资源
      最近更新 更多