【问题标题】:Writing instagram crawler with Scrapy. How can I go to the next page?用 Scrapy 编写 Instagram 爬虫。我怎样才能转到下一页?
【发布时间】:2016-07-18 16:11:52
【问题描述】:

作为练习,我决定编写一个 python 脚本来获取指定用户的所有图像。我对 Scrapy 有点熟悉,这就是我选择它作为抓取工具的原因。目前该脚本只能从第一页下载图像(最多 12 个)。

据我所知,instagram 页面是由 javascript 生成的。 Scrapy 的response.body(类似于从 Chrome 中查看的源代码)不像 Chrome 的 Inspector 那样显示 html 结构。在 Chrome 中,在 12 张图片之后,在底部有一个带有下一页链接的按钮。

例如,instagram.com/instagram。第 2 页的链接是 instagram.com/instagram/?max_id=1292385931151632610。在第 2 页有一个指向第 3 页的链接,带有max_id=1287301939457754444

如何在 Scrapy 中获取该号码,以便将我的蜘蛛发送到那里? response.body 甚至不包含该数字。还有其他方法可以到达下一页吗?

我知道 Instagram API 会提供一些好处,但我认为无需所有这些令牌也可以做到。

【问题讨论】:

标签: python scrapy instagram


【解决方案1】:

您还可以添加参数__a=1(如在https://www.instagram.com/instagram/?__a=1 中)以仅将JSON 包含在window._sharedData 对象中。

我使用这样的 shell 脚本来做类似的事情:

username=instagram
max=
while :;do
  c=$(curl -s "https://www.instagram.com/$username/?__a=1&max_id=$max")
  jq -r '.user|.id as$user|.media.nodes[]?|$user+" "+.id+" "+.display_src'<<<"$c"
  max=$(jq -r .user.media.page_info.end_cursor<<<"$c")
  jq -e .user.media.page_info.has_next_page<<<"$c">/dev/null||break
done

【讨论】:

    【解决方案2】:

    根据robots.txt 政策,您应该避免抓取/api//publicapi//query/ 路径,因此在用户分页上小心(并且负责任地)抓取。

    另外,从我看到的分页开始于“加载更多”请求,这实际上是一个 https://www.instagram.com/query/ 请求(您需要检查),只有两个必要的值 ownerend_cursor 作为 @ 发送987654328@请求。

    这些值可以在'//script[contains(., "sharedData")]/text()'内的原始请求正文中找到

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-10
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      • 2019-06-24
      • 2021-01-09
      相关资源
      最近更新 更多