如何抓取twitch.tv,其中html正文在初始http请求时为空,并且内容由各种脚本加载
我试图使用Scrapy通过抽搐的流式页面进行爬网。问题是,html请求返回没有有用的网址。例如,wget来twitch.tv主网页,我得到一个空的身体标记:如何抓取twitch.tv,其中html正文在初始http请求时为空,并且内容由各种脚本加载
<body>
//some stuff
<div id='flyout'>
<div class='point'>
</div>
<div class='content'>
</div>
</div>
</body>
我了解的内容在某种程度上加载之后,但无法弄清楚是如何完成它。任何想法,建议?谢谢!!!
打开浏览器并打开开发工具。点击网络选项卡,然后转到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,
...
而且你可以只关注那里的链接。您还必须模拟该请求的标头。所以上面的例子不会工作,除非你在你的请求头中指定了一个client-id,你可以从原始请求的头部获取。网站的每个部分或功能可能都有自己的api端点,您可以访问它,并且在twitch服务器上也更容易一些,因为它们不必提供所有这些图片和视频,这是一种双赢。另外,如果您注意到网址末尾的一些查询参数,您可能可以操纵返回的项目数(限制= 6)。
这应该得到你想要的,尽管你将不得不挖掘端点。但是,如果出于某种原因,您确实需要动态处理JavaScript,并且不希望在scrapy生态系统中使用selenium自动执行浏览器,那么也会有scrapinghub的splash项目与scrapy很好地集成。
你需要使用硒+ scrapy –
@ whale_steward不知道如果硒/ scrapy组合是要走的路,你将失去硒的异步请求处理的优势,更不用说根据你的设置它可能不方便需要一个完整的浏览器 –
selenium呈现Web浏览器抓取页面的方式,所以它是一种获取它的方法。但是,如果抽搐提供了一个API,那么访问该API就足够了,而不需要使用硒。 –