作为练习,我决定编写一个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会提供一些好处,但我认为没有所有这些令牌就可以完成。
答案 0 :(得分:3)
您还可以添加参数__a=1
(如https://www.instagram.com/instagram/?__a=1
中所示),仅在window._sharedData
对象中包含JSON。
我使用像这样的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
答案 1 :(得分:2)
根据robots.txt政策,您应该避免抓取/api/
,/publicapi/
和/query/
路径,因此请仔细(并负责任地)抓取用户分页。
同样从我看到的分页开始于&#34;加载更多&#34;请求,实际上是https://www.instagram.com/query/
请求(您需要检查),只有两个必要的值owner
和end_cursor
作为POST
请求发送。
可以在'//script[contains(., "sharedData")]/text()'