PHP使用Guzzle Scraping公司数据

时间:2014-11-09 20:35:39

标签: php guzzle

我试图审核来自companycheck.co.uk的大量公司数据,我当前的脚本似乎只是从第一页开始循环前10个结果。我让脚本在一个点上收集了超过10个结果,但是在大约600个结果之后导致致命错误(不是超时错误,但是某种连接错误),我需要脚本更可靠,因为我&#39 ; m取得超过40,000个结果。

到目前为止我的代码:

<?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&type=name&companyPage=1http://companycheck.co.uk/search/results?SearchCompaniesForm[name]=cars&yt1=中的每个页面返回json和一些数据,但不是全部。

有了这个,我可以获得每个公司的ID导航到每个链接,并从网站的前端抓取一些数据。

例如,第一个结果是:

"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个公司ID,用于放入URL以查找公司,我需要从这些公司中获取完整URL中的数据,然后在这10个公司移动到下一页并获得下一个10和把它循环到最后一页。

1 个答案:

答案 0 :(得分:0)

由于请求数量过多,几乎肯定会故意阻止你。尝试在请求之间暂停 - 这可能有助于您在他们的雷达下飞行。

您打算收集的网站似乎是一家私营公司,正在重新格式化并重新发布英国公司信息官方记录公司大楼的数据。该公司提供an API,每月允许10K请求,这是免费或每月200英镑,具体取决于您需要的数据。由于您需要立即获得40K结果,因此难怪它们会运行IP块。

抓取的权利和错误很复杂,但有一点需要理解:通过复制别人的数据,您试图避免自己整理数据的成本。通过从其他人的服务器上获取它们,您也会增加运营成本而不报销它们,这是一种称为externality的经济现象。

在某些情况下,我同情以这种方式转嫁成本,例如刮痧目标涉及潜在的市场滥用(例如垄断行为),刮痧具有缓解作用。我听说一些航空公司经营防刮设备,因为他们不希望价格刮刀降价。由于降低价格符合消费者的利益,人们可能会认为外部性是合理的(在道德上,如果不是法律上的话)。

在您的情况下,我建议直接从Companies House获取这些数据,这样可以以更低的成本获得。在任何情况下,如果您重新发布从刮擦中获得的有价值的数据,并且躲过了阻止您的技术尝试,您可能会发现自己处于法律麻烦之中。如果有疑问(如果没有我之前概述的道德或公共利益防御)与网站运营商取得联系并询问您想做什么就行。