如何在初始 http 请求时 html 正文为空 twitch.tv 爬网,并且内容由各种脚本加载



我正在尝试使用 Scrapy 在 twitch 上抓取流页面。问题是 html 请求没有返回有用的 url。例如,使用 wget 到主页 twitch.tv,我得到一个空的正文标签:

<body>
//some stuff
<div id='flyout'>
<div class='point'>
</div>
<div class='content'>
</div>
</div>
</body>

我知道内容后来以某种方式加载,但无法弄清楚它是如何完成的。有什么想法,建议吗?谢谢!!!

打开一个浏览器,同时打开开发工具。单击网络选项卡,然后转到 twitch.tv 并深入了解所有请求,以查看哪些请求提供了内容的哪些部分,并将其缩小到您想要的内容(给定下面的示例,请求 url 很可能是对某种形式的 https://api.twitch.tv/{端点路径}/{端点名称}?{端点参数=值})。例如:

如果您想在主页上获取特色内容的所有数据,您可能会发现,与其在 twitch.tv 开始抓取,不如转到 https://api.twitch.tv/kraken/streams/featured?limit=6&geo=US&lang=en&on_site=1,它提供了很好的 JSON 格式数据,如下所示:

{"_links":
{"self":"https://api.twitch.tv/kraken/streams/featured?geo=US&lang=en&limit=6&offset=0",
"next":"https://api.twitch.tv/kraken/streams/featured?geo=US&lang=en&limit=6&offset=6"},
"featured":[
{"text":"<p>SNES Super Stars is a 11-day speedrun marathon devoted to the Super Nintendo Entertainment System. From March 10th-20th, watch over 200 games being beaten amazingly fast and races between some of the top speedrunners in the world!</p>nn<br>nnn<p><a href="/speedgaming">Click here</a> to watch and chat!</p>nn<p><a href="communitysuccess,speedrun"></a></p>n",
"title":"SNES Super Stars Marathon",
"sponsored":false,
"priority":5,
"scheduled":true,
...

你可以从那里点击链接。您还必须模拟该请求的标头。因此,除非您在请求标头中指定客户端 ID,否则上面的示例将不起作用,您可能可以从原始请求的标头中提取该 ID。网站的每个部分或功能可能都有自己的api端点,你可以访问它,在twitch服务器上也更容易一些,因为它们不必提供所有这些图片和视频,这是一种双赢。此外,如果您注意到 url 末尾的一些查询参数,您可能可以操纵您返回的项目数 (limit=6)。

这应该得到你想要的,尽管你将不得不四处挖掘端点。但是,如果出于某种原因,您真的需要动态处理javascript,并且不想在保持刮擦生态系统的同时使用硒自动化浏览器,那么还有刮板hub的飞溅项目,它与刮擦很好地集成在一起。

最新更新