如何使用PHP自动化网页抓取?

时间:2013-05-03 03:37:59

标签: php mysql curl cron web-scraping

让我解释一下我的情况。

我有一个1000万页面网址列表。我希望这些页面被抓取并以原始html格式保存在数据库中。

截至目前,我正在使用CURL来删除这些页面。每次访问index.php时,它都会丢弃一个页面URL并将其保存在数据库中。

现在我认为自己无法使用浏览器访问index.php 1000万次。

我可以使用do while loop。但我认为它将花费一些时间完成任务。还有记忆问题。

所以有人能指出我正确的方向让这项任务变得无痛。

我拥有一个带有1GB RAM和WHM / cPanel的Linux VPS服务器。

PS:我考虑过CRON。但我必须在cron中定义时间。即使我使用cron每1分钟运行一次脚本,我也只能完成1440 urls in 24 hours。那么有人可以给我一些想法,使用cron在一天内完成atleast 100,000网址。

2 个答案:

答案 0 :(得分:4)

您需要的是一些高速抓取库,例如wgetcurl来为您完成繁重的工作。 PHP可以创建这些程序要处理的工作列表,wget尤其可以选择从文件中给出的列表中获取和保存URL的内容。

从浏览器运行的PHP脚本必须在合理的时间内完成,否则它将超时。它通常不用于这样的后台进程。

您可以使用crontab检查新工作并启动新的wget流程。您没有理由一次只需要获取一个URL。您可以在列出的文件中执行尽可能多的操作。

例如,一个cron作业可以启动这样的脚本:

#!/bin/sh

for list in "/tmp/*.urls"
do
  wget -i $list -b
end

当然,wget有很多可以调整的选项。

如果您确定您的PHP应用程序是安全的,您甚至可以在后台编写由cron运行的shell脚本。这样您就可以指定每个文件的确切目标。

答案 1 :(得分:3)

我希望你有一个很好的宽带计划! =)

使用cron的简单答案是运行一个擦除至少70个URL的shell脚本。这符合你每天至少10万的目标(如果cron每分钟发射一次)。

wget命令可能就是你想要的,用于检索页面。

我还建议你有另一个进程可以在不太频繁的时间范围内解析IP地址。每次访问页面时,您都不希望进行名称查找。如果你给它一个IP地址,wget会更开心。

[编辑]然而,只是一个想法。如果按顺序执行,不太可能在不到一秒的时间内刮掉每一页。因此,您可能希望为每个URL分叉一个新进程。这可能就像使用&咒语上的wget来完成工作一样简单。为了提供某种理智,可以一次产生10批,然后再睡5秒钟。