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

Scrapy 如何爬网twitch.tv,在初始http请求时html正文为空,内容由各种脚本加载,scrapy,web-crawler,twitch,dynamic-pages,Scrapy,Web Crawler,Twitch,Dynamic Pages,我正在尝试使用Scrapy在twitch上的流页面中爬行。问题是html请求没有返回有用的URL。例如,通过wget到twitch.tv主页,我得到一个空的body标签: <body> //some stuff <div id='flyout'> <div class='point'> </div> <div class='content'> </di

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

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

//一些东西

我知道内容是后来加载的,但不知道是怎么加载的。有什么想法和建议吗?谢谢

打开浏览器,同时打开开发工具。单击“网络”选项卡,然后转到twitch.tv并深入查看所有请求,查看哪些请求提供了内容的哪些部分,并将其缩小到所需的内容(给出下面的示例,请求url很可能是对某种形式的{path to endpoint}/{name of endpoint}?{endpointarg=value}的请求)。例如:

如果您想在主页上获取特色内容的所有数据,您可能会发现,与其在twitch.tv上开始爬网,不如转到,它提供了漂亮的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,
...
{“\u链接”:
{“自我”:https://api.twitch.tv/kraken/streams/featured?geo=US&lang=en&limit=6&offset=0",
“下一步”:https://api.twitch.tv/kraken/streams/featured?geo=US&lang=en&limit=6&offset=6"},
“特色”:[
{“text”:“SNES Super Stars是一场为期11天的超级任天堂娱乐系统的速度跑马拉松。从3月10日到20日,观看200多场比赛以惊人的速度被击败,以及世界顶级速度跑选手之间的比赛!

\n\n
\n\n\n观看和聊天!

\n\n, “标题”:“SNES超级明星马拉松”, “赞助”:假, “优先”:5, “预定”:正确, ...
您也可以从那里开始跟踪链接。您还必须模拟该请求的标头。因此,除非您在请求标头中指定一个客户端id,您可能可以从原始请求的标头中提取该id,否则上述示例将不起作用。站点的每个部分或功能可能都有自己的api端点,您可能需要能够访问,而且在twitch服务器上也更容易,因为它们不必提供所有这些图片和视频,这是一种双赢。此外,如果您注意到url末尾的一些查询参数,您可能可以控制返回的项目数(limit=6)


这应该会得到你想要的东西,尽管你必须挖掘端点。但是,如果出于任何原因,你真的需要动态处理javascript,不想在scrapy生态系统中使用selenium自动化浏览器,那么还有scrapinghub的splash项目,它与scrapy集成得相当好。

您需要使用硒scrapy@whale_steward不确定selenium/scrapy combo是否可行,您将失去使用selenium进行异步请求处理的优势,更不用说,根据您的设置,可能不方便使用成熟的浏览器selenium呈现web浏览器获取页面的方式,因此这是一种方法但是,如果twitch提供了api,那么只访问api就足够了,而不需要使用selenium。