在决定走哪条路线之前,我想检查一下我是否考虑了所有的选择。
我目前已经将一个小型网站部署到免费的Azure AppService(.NET Core+SQL Server,在他们会给你的免费小型SQL数据库上)
我希望这个网站能够在需要浏览器模拟的幕后获取一些数据。
- 我的浏览器模拟最终是从浏览器屏幕上抓取一些信息,下载并保存文件,但我必须模拟登录和复杂的导航,所以我认为它需要是一个完整的浏览器模拟,而不仅仅是手动发送HTTP请求,这样才能在没有目标网站大量反向工程的情况下工作
- 我正在抓取的网站不希望被抓取,也没有任何我可以使用的API。
- 为了避免任何疑问,我所做的刮擦绝对不违法或不道德。可以想象,它打破了一些T&Cs,但我已经在单独检查了
- 这是一个个人项目,所以我必须让它适合免费托管的内容
我觉得这很简单——我只需要在我的网站上运行Selenium。
遗憾的是,我发现AppServices不支持安装Chrome或类似程序,而且Selenium可能无论如何都不起作用。(引文)
有什么方法可以解决这个问题我想我可以:
- 将我的Azure设置为VM
- 让我完全控制主机环境
- 更多的DevOps工作
- 我在Azure中看不到明显的免费虚拟机选项
- "在容器中进行"。
- 我发现一个消息来源建议容器允许安装浏览器,但保持较低的DevOps开销
- 我认为Azure确实免费支持Kubernetes
-
重新设计我的代码,这样它就不会试图模拟浏览器,只会猜测正确的HTTP请求- (我认为这是难以置信的大量开发工作)
- 使用其他一些纯C#浏览器模拟?头孢夏普?
- 我认为当前的症结在于Selenium要求Chrome与我正在运行的C#应用程序分开存在。如果我能让"浏览器"成为C#的直接组成部分,也许效果会更好
- 看起来
CefSharp
可以在不安装单独的Chrome实例的情况下模拟Chromium,所以这是一个可行的选择吗 - AppServices可能会遇到同样的"不受支持"问题
- 我认为这种方法可能会失去使用IWebDriver界面的乐趣,不过:(
- 不要在Azure上托管。
- 可能涉及某种自我托管,通过这种方式,我设置我的个人计算机来托管该网站,并通过适当的IP映射、防火墙打开和其他DevOps faff将该网站暴露在世界面前
还有其他我不知道的选项吗(尤其是Azure内置的!)
我上面列出的选项中还有其他考虑因素吗
我已经使用:
-
CefSharp(您可以设置用户代理来模拟chrome版本)(无头模式)。
-
。NET核心控制台应用程序,该应用程序位于docker容器(代理)中,用于处理来自Azure服务队列的请求。这将使您能够扩展您的代理并获得更多可用性。没有虚拟机,我不认为你不能仅仅因为无服务器的图形支持限制。
这里有一个docker示例,用于在构建时下载并安装.net框架
FROM microsoft/windowsservercore
ADD . /ScrapingService
WORKDIR /ScrapingService
ADD https://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x64.exe /vc_redist.x64.exe
RUN C:vc_redist.x64.exe /quiet /install
ENTRYPOINT ["cmd.exe", "/k", "Scraper.exe"]
- 含铬的硒
当一切正常时,在本地测试(无头模式)构建一个docker映像并将其部署到Azure。
您可以创建一个容器化的.net控制台应用程序,在本地运行它,然后部署它。对于你的方法,一个警告是,如果网站改变了结构,你将不得不重新制定你的抓取规则,如果网站使用Captcha,你就无法抓取它,如果你发送了很多请求,它可能会在网站上引发警报,可能会受到攻击。