PHP Scraping данные компании с помощью Guzzle

Я пытаюсь провести аудит огромного количества данных компании из companycheck.co.uk. Мой текущий скрипт, похоже, зацикливает первые 10 результатов только с первой страницы. У меня был сценарий, который собирал более 10 результатов за один раз, но это вызвало фатальную ошибку после примерно 600 результатов (не ошибка тайм-аута, а какая-то ошибка подключения), мне нужен сценарий, чтобы быть более надежным, так как я получение более 40000 результатов.

Мой код до сих пор:

<?php
set_time_limit(0);
ini_set('max_execution_time', 0);

require 'vendor/autoload.php';
require "Guzzle/guzzle.phar";// Add this to allow your app to use Guzzle and the Cookie Plugin.
use Guzzle\Http\Client as GuzzleClient;
use Guzzle\Plugin\Cookie\Cookie;
use Guzzle\Plugin\Cookie\CookiePlugin;
use Guzzle\Plugin\Cookie\CookieJar\ArrayCookieJar;
use Guzzle\Plugin\Cookie\CookieJar\CookieJarInterface;$Pagesurl  = 'http://companycheck.co.uk/search/UpdateSearchCompany?searchTerm=cars&type=name';
$pagesData = json_decode(file_get_contents($Pagesurl), true);$resultsFound = $pagesData["hits"]["found"];
$pages        = ceil($resultsFound / 10);
//echo $pages;

echo "<br>";

for ($p = 0; $p < $pages; $p++) {

$url  = 'http://companycheck.co.uk/search/UpdateSearchCompany?searchTerm=cars&type=name&companyPage=' . $p . '';
$data = json_decode(file_get_contents($url), true);
for ($i = 0; $i < 11; $i++) {
$id             = $data["hits"]["hit"][$i]["id"];
$TradingAddress = $data["hits"]["hit"][$i]["data"]["address"][0];
$companyName    = $data["hits"]["hit"][$i]["data"]["companyname"][0];
$companyNumber  = $data["hits"]["hit"][$i]["data"]["companynumber"][0];

$finalURL = "http://companycheck.co.uk/company/" . $id . "";$httpClient = new GuzzleClient($finalURL);
$httpClient->setSslVerification(FALSE);

$cookieJar    = new ArrayCookieJar();
// Create a new cookie plugin
$cookiePlugin = new CookiePlugin($cookieJar);
// Add the cookie plugin to the client
$httpClient->addSubscriber($cookiePlugin);
$httpClient->setUserAgent("Opera/9.23 (Windows NT 5.1; U; en-US)");

$request  = $httpClient->get($finalURL);
$response = $request->send();

$body    = $response->getBody(true);
$matches = array();

preg_match_all('/<table.*?>(.*?)<\/table>/si', $body, $table);
preg_match('/<meta name=\"keywords\" content=\"(.*?)\"\/>/si', $body, $metaName);
preg_match('/<p itemprop="streetAddress".*?>(.*?)<\/p>/si', $body, $regOffice);echo "<table><tbody>";

echo "<tr><th>Company Name</th><td>";
echo $companyName;
echo "</td></tr>";

echo "<tr><th>Company Number</th><td>";
echo $companyNumber;
echo "</td></tr>";

echo "<tr><th>Registar Address</th><td>";
echo str_replace("<br>", " ", $regOffice[0]);
echo "</td></tr>

<tr><th>Trading Address</th><td>";
echo $TradingAddress;
echo "</td></tr>
<tr>
<th>Director Name</th>
<td>";
$name = explode(',', $metaName[1]);
echo $name[2];
echo "</td>

</tr></tbody></table>";
echo $table[0][1];
echo "<br><br><br>";}

}

Чтобы получить каждую страницу, я использую http://companycheck.co.uk/search/UpdateSearchCompany?searchTerm=cars&тип = имя&companyPage = 1 который возвращает JSON для каждой страницы из http://companycheck.co.uk/search/results?SearchCompaniesForm[name]=cars&yt1 = и некоторые данные, но не все.

Благодаря этому я могу получить идентификатор каждой компании, чтобы перейти к каждой ссылке и почерпнуть некоторые данные из внешнего интерфейса сайта.

Например, первый результат:

"hits":{"found":42842,"start":0,"hit":[{"id":"08958547","data":{"address":["THE ALEXANDER SUITE SILK POINT, QUEENS AVENUE, MACCLESFIELD, SK10 2BB"],"assets":[],"assetsnegative":[],"cashatbank":[],"cashatbanknegative":[],"companyname":["CAR2CARS LIMITED"],"companynumber":["08958547"],"dissolved":["0"],"liabilities":[],"liabilitiesnegative":[],"networth":[],"networthnegative":[],"postcode":["SK10 2BB"],"siccode":[]}}

Итак, первая ссылка: http://companycheck.co.uk/company/08958547

Затем из этого я могу получить данные таблицы, такие как:

Registered Office

THE ALEXANDER SUITE SILK POINT
QUEENS AVENUE
MACCLESFIELD
SK10 2BB

И информация из мета-тегов, таких как:

<meta name="keywords" content="CAR2CARS LIMITED, 08958547,INCWISE COMPANY SECRETARIES LIMITED,MR ROBERT CARTER"/>

Пример одного из возвращенных результатов:

Company Name    CAR2CARS LIMITED
Company Number  08958547
Registar Address
THE ALEXANDER SUITE SILK POINT QUEENS AVENUE MACCLESFIELD SK10 2BB

Trading Address THE ALEXANDER SUITE SILK POINT, QUEENS AVENUE, MACCLESFIELD, SK10 2BB
Director Name   INCWISE COMPANY SECRETARIES LIMITED
Telephone   No telephone number available.
Email Address   No email address available.
Contact Person  No contact person available.
Business Activity   No Business Activity on record.

На каждой странице json содержится 10 идентификаторов компаний, которые нужно вставить в URL-адрес, чтобы найти компанию. Каждой из этих компаний мне нужно соскоблить данные с полного URL-адреса, а затем, после этих 10, перейти на следующую страницу и получить следующие 10 и зациклить их. до последней страницы.

-1

Решение

Это почти наверняка блокирует вас намеренно из-за чрезмерного количества запросов. Попробуйте поставить паузу между запросами — это может помочь вам летать под их радаром.

Веб-сайт, который вы намереваетесь очистить, похоже, является частной компанией, которая переформатирует и публикует данные из Регистрационной палаты, официальной записи информации о компании в Великобритании. Эта компания предлагает API что позволяет 10 000 запросов в месяц, и это либо бесплатно, либо стоит 200 фунтов в месяц, в зависимости от того, какие данные вам нужны. Поскольку вы хотите сразу получить результаты 40K, неудивительно, что они работают с IP-блоками.

Права и ошибки в очистке сложны, но есть важный момент для понимания: копируя чужие данные, вы пытаетесь избежать затрат на сопоставление данных самостоятельно. Взяв их с чужого сервера, вы также увеличиваете их эксплуатационные расходы, не возмещая их, экономическое явление, известное как внешность.

В некоторых случаях я сочувствую распределению затрат таким образом, например, когда цель очистки связана с потенциальным злоупотреблением на рынке (например, монопольными практиками), а очистка оказывает смягчающее воздействие. Я слышал, что некоторые авиакомпании эксплуатируют устройства против соскабливания, потому что они не хотят, чтобы ценовые скребки снижали цены. Поскольку снижение цен отвечает интересам потребителя, можно утверждать, что внешние факторы могут быть оправданы (на моральных, если не на законных основаниях).

В вашем случае я бы предложил получить эти данные непосредственно из Регистрационной палаты, где они могут быть доступны по гораздо более низкой цене. В любом случае, если вы опубликуете ценные данные, полученные в результате проверки, уклонившись от технических попыток заблокировать вас, вы все равно можете столкнуться с юридическими проблемами. Если вы сомневаетесь (и если нет защиты моральных или общественных интересов, как я описал ранее), свяжитесь с оператором сайта и спросите, все ли в порядке.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]