Я пытаюсь почистить страницу, и я не очень знаком с фреймворками 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
// ));
}
}
Я не уверен, что слышал о «хороших практиках», но вы можете найти некоторые из них в книге. Руководство архитектора PHP по веб-скреплингу с помощью PHP.
Вот некоторые рекомендации, которые я использовал в своих собственных проектах:
php app/console scraper:run example.com --env=prod --no-debug
Где app / console — это то место, где живет консольное приложение Symfony2, scraper: run — это имя вашей команды, example.com — аргумент, указывающий страницу, которую вы хотите очистить, а —env = prod —no-debug флаги, которые вы должны использовать для запуска в производство. см. код ниже, например. 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();
}
}
Вы должны взять Symfony-Controller, если хотите вернуть ответ, например, вывод html.
если вам нужна только функция для расчета или хранения вещей в базе данных,
Вы должны создать обслуживание класс, который представляет функциональность вашего Crawler, например
class CrawlerService
{
function getText($url){
$client = new Client();
$crawler = $client->request('GET', $url);
return $crawler->text();
}
и для его выполнения я бы использовал Консольная команда
Если вы хотите вернуть ответ, используйте контроллер