我有一个关于在 PHP 中抓取网页的小问题。我必须在一个大型 eshop 上抓取大约 90 000 种产品。我在 PHP 中尝试过,但一个产品大约需要 2-3 秒,这很糟糕。任何提示,如何更快地做到这一点?也许是 C++ 多线程版本?但是 HTTP 请求的时间呢?我的意思是,它是否是 PHP 的限制?感谢您的小费。
4 回答
这是一个非常模糊的问题。当你对你的代码进行基准测试时,最慢的部分是什么?是网络传输时间吗?使用不同的语言(或多个线程)不会改变这一点。
是花时间解析页面吗?你是怎么做到的?如果您使用 XML 库来解析整个 DOM,您是否可以只查找关键字(甚至是正则表达式)而摆脱困境?这不太精确(在某种意义上也不太正确),但也许更快。
您使用什么算法进行分析?其他数据结构会提供更好的性能吗?举一个简单的例子,如果您花费大量时间迭代一个数组,那么哈希映射可能更合适。
PHP 可以在多个进程中运行。如果您一次启动脚本的多个实例(在不同的页面上)会发生什么?总时间会减少吗?
最终,您已经描述了一个非常普遍的问题,因此我无法提供非常具体的解决方案,但是 PHP 不适合此任务并没有内在的原因。当您确定了慢的原因(无论您使用什么语言),您应该能够更准确地解决如何解决它。
我认为这不是 PHP 问题,但可能取决于连接速度/计算机速度。不过,我从来没有遇到过 PHP/cURL 的速度问题。
只需执行多个线程(即一次多个连接),我建议您使用 cURL 但这只是因为我熟悉它。
这是我用于使用 cURL 进行多线程抓取的指南:http: //semlabs.co.uk/journal/object-oriented-curl-class-with-multi-threading
要非常小心,不要意外导致脚本出现拒绝服务的情况。但我敢肯定你已经摆脱了这种可能性。
你有 99% 的可能性PHP 不是问题。它是 eshop 网络服务器或任何其他网络延迟。
我肯定知道这一点,因为我已经这样做了好几个月了,即使你的代码有很多正则表达式,在 PHP 中数据抓取也非常快。
加快速度的解决方案?使用命令行爬虫预先缓存所有网站,因为磁盘空间很便宜。curl 可以做到这一点,httrack也可以。它将比 PHP 进行爬取更快、更稳定。
然后让 PHP 单独进行解析,你会看到 PHP 每分钟吞下几十页,希望这会有所帮助:)
如果您的程序运行缓慢,我的建议是在其上运行分析器,并分析它运行缓慢的原因。
该建议适用于任何语言,但对于 PHP,您需要的分析器软件称为xDebug。
这是一个 PHP 扩展,因此您需要将其安装到您的服务器中。如果您在 ISP 的服务器上运行,那么您可能无权执行此操作,但您始终可以在本地 PC 上使用 PHP 安装它并在那里运行您的测试。
安装 xDebug 后,打开 PHP.ini 中的分析功能(请参阅 xDebug 文档以获取相关说明),然后运行您的程序。然后它将生成分析器文件,可用于分析程序在做什么。
下载KCacheGrind以执行分析。这将生成调用树信息,准确显示程序运行时发生的情况,以及每个函数调用花费了多长时间。
使用此信息,您可以查找运行缓慢的函数调用,并找出正在发生的事情。通常,代码慢的原因是某些东西的编写方式效率低下;xDebug 将帮助您找到它。
希望有帮助。