我使用Guzzle和Goutte在PHP中开发了一个网络抓取工具,用于从bet365网站读取数据。它在我的本地环境中运行没有任何问题,但在互联网网络主机上它只能在第一次或第二次工作,然后连接开始被拒绝(我在我托管我的应用程序的每个服务器中收到了不同的消息)。 / p>
1)为什么它在我的本地机器上工作而不在互联网网络主机上?
2)我听说代理可能是另一种选择,但我怎样才能在我的应用程序中找到代理服务器?我只需要一个或多个服务器地址吗?
3)是否还有其他尝试来使其有效?
在另一台我没有收到打印件的服务器上
403 - 禁止
我在我的应用中使用的标题:
$headers = array(
'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Accept-Encoding' => 'gzip, deflate, br',
'Accept-Language' => 'pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4',
'Cache-Control' => 'no-cache',
'Pragma' => 'no-cache',
'Upgrade-Insecure-Requests' => '1',
'Connection' => 'keep-alive',
'User-Agent' => 'Mozilla/' . rand(0, 9) . '.' . rand(0, 9) . ' (Windows NT 10.0; WOW64) AppleWebKit/' . rand(100, 900) . '.' . rand(10, 90) . ' (KHTML, like Gecko) Chrome/' . rand(10, 90) . '.' . rand(0, 9) . '.' . rand(1000, 9000) . '.' . rand(100, 900) . ' Safari/' . rand(100, 900) . '.' . rand(10, 90) . ' OPR/' . rand(10, 90) . '.' . rand(0, 9) . '.' . rand(1000, 9000) . '.' . rand(10, 90)
);
//SET Client Request
$client = new Goutte\Client();
$guzzleClient = new GuzzleHttp\Client(
array(
'timeout' => 90,
'verify' => false,
));
$client->setClient($guzzleClient);
$client->followRedirects(true);
if (@$headers['User-Agent'])
$client->setServerParameter('HTTP_USER_AGENT', $headers['User-Agent']);
foreach ($headers as $k => $v)
$client->setHeader($k, $v);
非常感谢提前!
答案 0 :(得分:1)
1)为什么它可以在我的本地计算机上运行而不是在互联网网络主机上运行?
在互联网网络主机上它只能在第一次或第二次使用 然后连接开始被拒绝
它适用于您的本地计算机,因为它来自您的IP地址,这是一个真实的住宅IP地址。他们很容易确定网络主机IP,这就是它快速停止工作的原因。如果您使用(或从其他公司重新购买)来自AWS / Google /等主要Web主机的服务,则尤其如此。
2)我听说代理可能是另一种选择,但我怎样才能找到在我的应用程序中实现的代理服务器?我只需要一个或多个服务器地址吗?
它可以工作。但是,如果代理IP也开始被阻止,你可能需要很多IP地址。
3)是否还有其他尝试来使其有效?
你正在与一家非常大的公司展开竞争,我想这会花费大量的时间和金钱来保护其最有价值的资源(其网站)。我认为你不会赢得这场战斗。
如果您需要抓取一些数据,我建议您将其保留在本地计算机上(或在本地网络上设置一个小型服务器)。