duanli12176 2019-01-27 08:00
浏览 50

ReactPHP如何访问此(绿色框)数据?

Just some noob-ish question from me, How to get this (green boxed) data from This Image

(sorry i can't post image yet on stackoverflow because my reputation is still under 10. This is my first question on SO.)

I use laravel 5.7 and this packages:

Code

App/MyScraper/Bukalapak.php

<?php
namespace App\MyScraper;

use Clue\React\Buzz\Browser;
use function React\Promise\all;
use React\Promise\PromiseInterface;
use Psr\Http\Message\ResponseInterface;
use Symfony\Component\DomCrawler\Crawler;
use App\MyScraper\Objects\BukalapakObject;


class Bukalapak
{
    private $browser;

    public function __construct(Browser $browser)
    {
        $this->browser = $browser;
    }

    public function scrape(string ...$urls): PromiseInterface
    {
        $promises = array_map(function ($url) {
            return $this->extractFromUrl($url);
        }, $urls);

        return all($promises);
    }

    private function extract(string $responseBody) : BukalapakObject
    {
        $crawler = new Crawler($responseBody);

        $name        = $crawler->filter('.c-product-detail__name')->text();
        $price       = $crawler->filter('.c-product-detail-price')->attr('data-reduced-price');
        $image       = $crawler->filter('.c-product-image-gallery__main img')->attr('src');
        $stock       = preg_replace('/[^0-9]+/', '', $crawler->filter('.qa-pd-stock')->text());
        $weight      = preg_replace('/[^0-9]+/', '', $crawler->filter('.qa-pd-weight-value')->text());
        $condition   = $crawler->filter('.qa-pd-condition-value > span.c-label')->text();
        $description = trim($crawler->filter('.qa-pd-description')->html(), "
");
        $assurance   = 'Tidak';
        $courier     = 'jner|j&tr';

        return new BukalapakObject($name, $price, $image, $stock, $weight, $condition, $assurance, $courier);
    }

    private function extractFromUrl(string $url) : PromiseInterface
    {
        return $this->browser->get($url)->then(function (ResponseInterface $response) {
            return $this->extract((string) $response->getBody());
        });
    }
}

App/MyScraper/Helpers/BukalapakHelper.php

<?php
namespace App\MyScraper\Helpers;

use Goutte;

class BukalapakHelper
{
    public static function fetchAllProductsLink(string $shopUrl)
    {
        $goutte = Goutte::request('GET', $shopUrl);
        $data = $goutte->filter('.product-display')->each(function ($node) {
            return [
                'https://www.bukalapak.com'
                    .explode('?', $node->filter('.js-tracker-product-link')->attr('href'))[0]
            ];
        });
        unset($goutte);
        return array_column($data, 0);
    }

    public static function writeToCSV(string $fileName, array $data = [])
    {
        $handle = fopen($fileName, 'w');
        foreach ($data as $value) {
            fputcsv($handle, [key($data), $value]);
        }
        fclose($handle);
    }
}

App/MyScraper/Objects/BukalapakObject.php

<?php
namespace App\MyScraper\Objects;

final class BukalapakObject
{
    public $name;
    public $price;
    public $image;
    public $stock;
    public $weight;
    public $condition;
    public $assurance;
    public $courier;


    public function __construct(
        string $name,
        string $price,
        string $image,
        string $stock,
        string $weight,
        string $condition,
        string $assurance,
        string $courier
    )
    {
        $this->name = $name;
        $this->price = $price;
        $this->image = $image;
        $this->stock = $stock;
        $this->weight = $weight;
        $this->condition = $condition;
        $this->assurance = $assurance;
        $this->courier   = $courier;
    }
}

App/Http/Controllers/TestController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Clue\React\Buzz\Browser;
use App\MyScraper\Bukalapak;
use App\MyScraper\Helpers\BukalapakHelper;

class TestController extends Controller
{

    public function index()
    {
        $shop = 'https://www.bukalapak.com/u/attiqahijab';
        $urls = BukalapakHelper::fetchAllProductsLink($shop);

        $loop = \React\EventLoop\Factory::create();
        $browser = new Browser($loop);
        $scraper = new Bukalapak($browser);

        $data = $scraper->scrape(...$urls)->then(function($result) {
            return $result;
        });
        $loop->run();

        print_r($data);

        return view('backend.test');
    }

}

Expected Results:

Green boxed data only

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 树莓派5怎么用camera module 3啊
    • ¥20 java在应用程序里获取不到扬声器设备
    • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
    • ¥15 Attention is all you need 的代码运行
    • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
    • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
    • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
    • ¥80 部署运行web自动化项目
    • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
    • ¥30 VMware 云桌面水印如何添加