如何使用 IE/.Net/C# 进行真正的多线程 Web 挖掘?
Posted
技术标签:
【中文标题】如何使用 IE/.Net/C# 进行真正的多线程 Web 挖掘?【英文标题】:How to do really multithreaded web mining with IE/.Net/C#? 【发布时间】:2011-03-29 21:37:34 【问题描述】:我想使用 IE 浏览器从网络上挖掘大量数据。但是,通过 WatiN 生成大量 IE 实例会使系统崩溃。有没有更好的方法来做到这一点?请注意,我不能简单地做WebRequests
- 由于必须与网站上的 JS 驱动行为进行交互,我真的需要浏览器。
【问题讨论】:
为什么你需要浏览器?当提出一些不寻常的请求时,总是值得提供理由。 @Jon 实际上,这并不罕见。每当有一个网站使用 AJAX、cookie、javascript 驱动的交互时,只有一个简单的WebRequest
是不够的。
完全同意德米特里的观点。 WatiN(或类似的东西)对于可靠的网络挖掘是必不可少的。 @Dmitri,当您在 WatiN 中使用 FireFox 时,您是否会遇到同样的崩溃?还有多少“很多”浏览器实例?
我必须同意,如果不需要浏览器并且会因您的用例而导致系统崩溃,那么使用浏览器似乎很奇怪。 Ajax 不是魔法——它也会发出请求。你可以模拟它们。
对于实际的数据挖掘,依赖浏览器似乎是一个非常糟糕的主意。找出如何通过正常的 Web 请求提取数据,然后在没有浏览器的情况下提取数据的效率可能要高得多。
【参考方案1】:
我正在使用 WatiN 挖掘很多页面。这一刻其实30+。当然,这需要大量资源 - 大约 2.5 GB 的 RAM,但使用 WebRequest
几乎不可能做到这一点。我无法想象自己在合理的时间内做这样的事情。使用 WatiN 需要几个小时。
我不知道它是否对你有帮助,但我正在使用 webbrowser 控件来做到这一点。每个实例都是一个单独的进程。但是,我认为对您来说更重要的是,我曾经尝试通过在单个进程中完成所有操作来减少使用的内存量。可以只创建单独的AppDomain
而不是进程,并强制它们使用相同的 dll(尤其是 Microsoft.mshtml.dll),而不是为每个新的应用程序域单独加载相同的 dll。我现在不记得如何做到这一点,但谷歌搜索并不难。我记得的是一切都很好,RAM的使用量大大减少了,所以我认为值得一试。
【讨论】:
我想我有两个问题。首先,假设我对一切(操作系统、WatiN、SQL Server 等)的 RAM 限制为 1Gb。我能做些什么呢?第二 - 您正在运行多少个并发进程?现在的根本问题是我无法生成 100 个 IE 实例。 正如我所说,有 30 多个并发进程需要 2.5 GB 的 RAM。我认为 1 GB 足以在具有共享 dll 的单独应用程序域中运行它们,但我不能说还能运行多少。【参考方案2】:如何在 .NET 应用程序中启动多个 WebBrowser 控件实例(无论如何都是 IE)以异步方式处理数据挖掘作业?
如果性能有问题 - 拆分作业并将其推送到云端也可能会有所帮助。
【讨论】:
是的,我曾考虑将其移至云端,但不知何故,我怀疑生成WebBrowser
控件与生成 IE 的实际实例有什么不同。将需要检查。感谢您的想法!
可能没什么不同。但是您可以更好地控制异常和崩溃。【参考方案3】:
最好的方法是实际为每个 Web 浏览器实例创建一个进程,这是因为 Web 浏览器不是托管代码,它的 COM,并且在某些情况下,托管代码和应用程序中无法处理非托管异常肯定会崩溃。
最好的办法是创建一个进程主机,它会产生多个进程,如果需要,您可以使用命名管道或套接字或 WCF 在每个进程之间进行通信。
最好的办法是创建一个小型 SQL Embedded 数据库,您可以在其中排队您的作业,挖掘过程可以获取新请求,并将请求发布回数据库,并且该数据库可用于同步所有内容。
【讨论】:
同步很痛苦,数据库不能扩展到多台机器(尤其是嵌入式)。我相信一个简单的队列对于这里的多个进程之间的通信会做得更好(MSMQ 用于单机部署,一些云或 AMQP 实现用于分布式情况)。 是的,我只是建议单台机器,多台机器,使用 MSMQ 的某种队列或一些分布式通信就足够了。【参考方案4】:我有一个项目,我在一个扩展的基础上收集了大约 4500 万个请求(带有表单提交)。在持续的基础上,我正在与大约 20 个同时存在的客户进行交流,而我的管道是瓶颈。
在尝试编写自己的 WebClient、WaTiN/WaTiR 并使用 Microsoft 的 UI 自动化 API 后,我使用了 Selinium Remote-Control。
Selenium RC 让您选择浏览器。我用火狐。设置初始抓取脚本大约需要一个小时的实验和调整。 Selenium 比编写我自己的代码要快得多,而且只需很少的投资就更健壮。很棒的工具。
为了扩展该过程,我尝试了几种不同的方法,但最终效果最好的方法是将每个 SRC 实例固定在其自己的精简 VM 中,然后生成尽可能多的工作站有 ram 支持的实例。在主机中运行本机而不是 vm 的同等数量的 SRC 实例不可避免地停顿,因为我获得了 +10 个实例。在抓取运行之前,这需要更多的开销和设置时间,但它会连续几天不间断地运行。
另一个考虑因素 - 调低您的 Firefox 偏好设置,以便不加载主页,关闭所有不必要的东西(欺骗检查、cookie(如果您的抓取、图像、adblock 和 flashblock 不需要)等)。
【讨论】:
以上是关于如何使用 IE/.Net/C# 进行真正的多线程 Web 挖掘?的主要内容,如果未能解决你的问题,请参考以下文章