这只是一个示例页面。这个页面只发送很少的HTML,似乎以客户浏览器组合的方式构建了大部分页面信息。
https://www.resto-in.fr/plandusite
Scrapy显然无法像浏览器那样看到任何东西。我想知道如何让scrapy看看浏览器看到了什么。
感谢您的时间和建议。
答案 0 :(得分:0)
您在这里遇到的问题称为AJAX。这基本上意味着javascript在幕后下载一些东西。 Scrapy蜘蛛不执行javascript,因此您需要自己对这些调用进行逆向工程。
要做到这一点:
如果您在自己喜欢的浏览器检查器(即firebug)中打开network
选项卡
您会注意到,当您加载网站时,幕后的JavaScript会打开一些页面并下载一些内容。在这种情况下,此页面将从以下网址下载整个站点地图:https://api.resto-in.com/api/v2/sitemap/1.json
因此,此请求会返回json内容,其中包含您要查找的所有数据。
更懒的替代方案是 - 拥有像splash这样的浏览器模拟器来检索和执行javascript来加载页面,然后将源代码传递给scrapy进行抓取。
答案 1 :(得分:-1)
你尝试过像Selenium或PhantomJS这样的东西吗?这些将允许您以可编程方式运行Web浏览器,然后Javascript /客户端部分将全部运行,就像您手动浏览时一样。例如,如果您只是将HTML和Javascript拉入Python的内存中,Python就无法像浏览器那样执行Javascript,并且根据网站的不同,99%的交互可能会在Javascript中发生。
虽然转到“开发人员工具”中的网络选项卡或Firebug可能会提示您正在发出哪些请求,但它可能并不是最佳解决方案。例如,一些网站发布了数十个小的AJAX请求,以便在他们的网站上进行微小的交互(因为他们正在进行日志记录,分析,广告,实时通知等),并且请求URL可以(有时是故意的)神秘或复杂。您可能无法弄清楚每个URL和参数实际上做了什么,但是您可能会意识到向下滚动一点并点击“下一步”箭头会获得您想要显示在屏幕。
有些网站还试图阻止非浏览器的抓取(试图限制对其数据的公然收获并保持对人类的更多使用)。它们会在客户端代码中嵌入一些“信标”,如果这些信标最终没有与您的其他请求相关联,它们将阻止您的IP。应该总是有办法解决这些问题,但这会让事情变得更加困难。
其他问题,如Cookie或HTML-5存储是另一个问题。