【问题标题】:Copying the xpath from Instagram inspect (using chrome) returns an empty list从 Instagram 检查复制 xpath(使用 chrome)返回一个空列表
【发布时间】:2018-07-24 14:57:49
【问题描述】:

所以我会去一个 Instagram 帐户,比如 https://www.instagram.com/foodie/ 来复制它的 xpath,它给了我帖子的数量、关注者的数量和关注的数量。

然后我会在一个scrapy shell上运行这个命令:

response.xpath('//*[@id="react-root"]/section/main/article/header/section/ul')

抓取该列表中的元素,但scrapy 不断返回一个空列表。关于我在这里做错了什么有什么想法吗?提前致谢!

【问题讨论】:

  • 使用view(response)命令,然后检查站点是动态的还是元素不同。
  • 查看页面源代码,看看在浏览器执行 JS 之前你得到了什么。正如@la_vie_est_belle 所说,来自scrapy shell 的view(response)
  • 是的。 Scrapy 返回 True。命令 response.xpath('//*[@id="react-root"]') 返回一些东西,但是在包含 /section 之后,它应该返回它的子级时返回一个空列表。有什么想法吗?
  • 你看到的页面结构可能与scrapy蜘蛛“看到”的不同,这就是为什么你需要 view(response) 命令来检查蜘蛛“看到”的内容。

标签: xpath scrapy instagram


【解决方案1】:

此站点是单页应用程序 (SPA),因此在您的下载器工作时,渲染 DOM 的 javascript 尚未渲染。

当您使用view(response) 时,您的下载器收集的javascript 可以继续由您的浏览器呈现,因此您可以看到呈现DOM 的页面(但无法与Site API 交互)。您可以通过response.text 查看您下载的内容并看到了!

在这种情况下,您可以应用 selenium + phantomjs 为您的蜘蛛制作渲染页面!

另一个技巧:您可以使用正则表达式选择 Script 的 JSON 部分,将其解析为 JSON obj 并从脚本中选择您对应的属性值(帖子数、关注数、...)!

【讨论】:

    猜你喜欢
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    • 2021-12-20
    • 1970-01-01
    相关资源
    最近更新 更多