2011-04-01 103 views
0

我做了一个屏幕抓取模块,它工作得很好,但有一定的局限性。现在我想删除这些边界,但我得到如此不可预知和不同的错误。在你脑子里有什么事情之前,让我wat实际上是在发作。最初我使用屏幕抓取来检索一组关键字(搜索内容)的搜索结果,谷歌的所有搜索引擎如co.in/co.uk/nl/de/com。在PHP问题屏幕抓取

但是现在我不得不在一个循环中搜刮多个搜索引擎和多个关键字的逻辑。

让我们看看这个用一个例子:

keyword  se   company   rank 
telephony google.co.in airtel   01 
telephony google.co.in bsnl   04 
telephony google.co.in aircel   06 
telephony google.co.in idea   03 
mobile op google.co.uk airtel   09 
mobile op google.co.uk bsnl   04 

等.. 超过6个关键字和所有显示的搜索引擎,并为所有的公司。

最初我是为一个关键字,se和所有company.reporting它现在我必须列出所有关键字,se,公司。简单地我用循环做that.But我面临这些错误:

  1. 存储器分配343322111个字节溢出(... [移除此我使用的ini_set(“存储器”)FUNC]
  2. 总和请求后谷歌使用capcha。 删除capcha我使用sleep或usleep()但它不能解决purpose.atlast错误:连接重置 我无法在usleep中使用30sec或更长func.it需要几小时才能恢复info.My代码搜索数据为5页的谷歌,这意味着50 responses.Lib使用simple_html_dom.php

它工作正常1页页面但不超过3页。我该怎么做/使用?

+0

您是否尝试将时间限制设置为0? “参数或者set_time_limit(0);”。对于文档:http://php.net/manual/en/function.set-time-limit.php(默认是30秒,我猜) – frail 2011-04-01 12:09:16

+0

是的,它被使用。因为只有我能够执行一个页面。因为可能会出现带宽有限的情况。 – 2011-04-01 12:11:26

回答

0

sleep()功能与&num=100查询解决问题。使用& num = 100可减少向Google 10次请求的次数。并在每次请求之间使用5秒的延迟,这似乎是一个有效的,真实的,人性化的请求。

2

的验证码是谷歌的方式来表达你自己发现你使用它商业化,并希望您在http://code.google.com/intl/en/apis/customsearch/v1/overview.html

使用他们的付费服务从现在至于内存问题,我们不能帮你没有一些代码概述。 (但为了节省一些,至少分割出关键字而不是保留完整的页面或DOM解析树。)

+0

如何在这里发现这样一个大代码......内存不是问题,因为它是通过ini_set()func解决的。但现在问题是我怎么能告诉谷歌或如何暂停代码excution特定的时间和连接也没有得到重置? – 2011-04-01 12:17:25

+0

如果您使用建议的JSON API,则您的连接不会重置或停止。 – mario 2011-04-01 12:18:46

+0

usleep工作,但不知道wats happenign ...我的代码不complete.i有两个问题。连接重置/或capcha.wat现在做 – 2011-04-01 12:19:04

0

无论您要使用什么时间限制 - 它都不会解决您的问题。你需要做的是使用他们的API,这与你看到的真实结果不一致,或者注册100个代理,并以循环方式遍历它们。你可以很容易地用100代理左右Google 24/7,而它只需要100美元。确保您在每次请求后清除cookie,并设置好用户代理(没有什么愚蠢的做法让Google认为您是一个糟糕的机器人)。

我宁愿这样做,而不是支付他们的API,它会给你X次的通话量和浪费你的钱。是的,我知道这在技术上违背了他们的服务条款,但看起来你正在做的是无害的。

0

而不是选择10个结果的前5页选择1页的50结果!

确保您使用典型的用户代理,因此您看起来不像机器人。 为了让自己看起来不那么可疑,也可以使用Google的重定向网址偶尔遵循一些结果链接,就像真实用户一样。

您也可以租用代理服务器,但上述技术应该足以满足大多数情况。