Использование Goutte с Symfony2 в контроллере

Я пытаюсь почистить страницу, и я не очень знаком с фреймворками php, поэтому я пытался изучить Symfony2. У меня все работает, и теперь я пытаюсь использовать Гутта. Он установлен в папке vendor, и у меня есть пакет, который я использую для своего проекта очистки.

Вопрос в том, является ли хорошей практикой чистка с Controller? И как? Я искал вечно и не могу понять, как использовать Goutte из пакета, так как он похоронен глубоко внутри структуры файла.

<?php

namespace ontf\scraperBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Goutte\Client;

class ThingController extends Controller
{
public function somethingAction($something)
{

$client = new Client();
$crawler = $client->request('GET', 'http://www.symfony.com/blog/');
echo $crawler->text();return $this->render('scraperBundle:Thing:index.html.twig');

// return $this->render('scraperBundle:Thing:index.html.twig', array(
//     'something' => $something
//     ));
}

}

2

Решение

Я не уверен, что слышал о «хороших практиках», но вы можете найти некоторые из них в книге. Руководство архитектора PHP по веб-скреплингу с помощью PHP.

Вот некоторые рекомендации, которые я использовал в своих собственных проектах:

  1. Очистка — это медленный процесс, рассмотрите возможность делегирования этой задачи фоновому процессу.
  2. Фоновый процесс обычно выполняется как задание cron, выполняющее приложение CLI или работника, который постоянно работает.
  3. Используйте систему управления процессом для управления своими работниками. Взгляни на supervisord
  4. Сохраните каждый очищенный файл («сырая» версия) и зарегистрируйте каждую ошибку. Это позволит вам обнаружить проблемы. Используйте Rackspace Cloud Files или AWS S3 для архивирования этих файлов.
  5. Использовать Консольный инструмент Symfony2 создать команды для запуска вашего скребка. Вы можете сохранить команды в вашем комплекте в каталоге команд.
  6. Запустите ваши команды Symfony2, используя следующие флаги, чтобы предотвратить нехватку памяти: php app/console scraper:run example.com --env=prod --no-debug Где app / console — это то место, где живет консольное приложение Symfony2, scraper: run — это имя вашей команды, example.com — аргумент, указывающий страницу, которую вы хотите очистить, а —env = prod —no-debug флаги, которые вы должны использовать для запуска в производство. см. код ниже, например.
  7. Вставьте Goutte Client в вашу команду следующим образом:

Ontf / ScraperBundle / Ресурсы / services.yml

services:
goutte_client:
class: Goutte\Client

scraperCommand:
class:  Ontf\ScraperBundle\Command\ScraperCommand
arguments: ["@goutte_client"]
tags:
- { name: console.command }

И ваша команда должна выглядеть примерно так:

<?php
// Ontf/ScraperBundle/Command/ScraperCommand.php
namespace Ontf\ScraperBundle\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Goutte\Client;

abstract class ScraperCommand extends Command
{
private $client;

public function __construct(Client $client)
{
$this->client = $client;
parent::__construct();
}

protected function configure()
{
->setName('scraper:run')
->setDescription('Run Goutte Scraper.')
->addArgument(
'url',
InputArgument::REQUIRED,
'URL you want to scrape.'
);
}

protected function execute(InputInterface $input, OutputInterface $output)
{
$url = $input->getArgument('url');
$crawler = $this->client->request('GET', $url);
echo $crawler->text();
}
}
4

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

Вы должны взять Symfony-Controller, если хотите вернуть ответ, например, вывод html.

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

class CrawlerService
{
function getText($url){
$client = new Client();
$crawler = $client->request('GET', $url);
return $crawler->text();
}

и для его выполнения я бы использовал Консольная команда

Если вы хотите вернуть ответ, используйте контроллер

0

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