0

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

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

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

4

1 回答 1

0

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

如果您想获取主页上特色内容的所有数据,您可能会发现与其开始在 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>\n\n<br>\n\n\n<p><a href=\"/speedgaming\">Click here</a> to watch and chat!</p>\n\n<p><a href=\"communitysuccess,speedrun\"></a></p>\n",
        "title":"SNES Super Stars Marathon",
        "sponsored":false,
        "priority":5,
        "scheduled":true,
...

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

尽管您必须四处寻找端点,但这应该会得到您想要的。但是,如果出于某种原因,您确实需要动态处理 javascript 并且不想使用 selenium 使浏览器自动化,同时停留在 scrapy 生态系统中,那么还有 scrapinghub 的 splash 项目,它与 scrapy 集成得非常好。

于 2017-03-16T02:24:34.110 回答