Intereting Posts
Фильтровать коллекцию продуктов по двум категориям Magento 1.7 PHP `DateTime :: days` возвращает корзину? Как передать значение vue.js в качестве параметра для маршрута в лезвии Многомерный массив PHP сортирует по другому массиву Doctrine2 Migration Использование DBAL вместо $ this-> addSql htaccess запрещает доступ к каталогу, если выйдет из системы (проверено с помощью php) Как получить список сообщений и связанные теги с наименьшим количеством запросов Получение данных из базы данных sql и отображение в таблицах. Отображение определенных данных в соответствии с установленными флажками. Как следует распространять изменения в объектах MVC? Как реализовать иерархические сайты cms? Сохранить позицию JQuery DragGable DIVs, используя php переходить от предупреждения без сохранения изменений mysql_query (): как проверить, обновлены ли какие-либо строки в случае UPDATE SQL Ошибка PHP session_start ()? Несколько запросов SQL не выполняются в CakePHP

cURL Scrape then Parse / Find Specific Content

Я использую php и cURL для очистки веб-страницы, но эта веб-страница плохо спроектирована (как и в классах или идентификаторах на тегах), поэтому мне нужно найти конкретный текст, затем перейдите к тегу, удерживающему его (т.е. <p> ), затем перейдите к следующему дочернему элементу (или следующему <p> ) и получите текст.

Есть разные вещи, которые мне нужно получить со страницы, некоторые из которых также являются текстом внутри <a onclick="get this stuff here"> . Так что в основном я чувствую, что мне нужно использовать cURL, чтобы очистить исходный код до переменной php, а затем я могу использовать php для разбора и поиска нужного материала.

Это звучит как лучший способ сделать это? Кто-нибудь имеет какие-либо указатели или может продемонстрировать, как я могу поместить исходный код из cURL в переменную?

Благодаря!

EDIT (рабочий / текущий код) ———–

 <?php class Scrape { public $cookies = 'cookies.txt'; private $user = null; private $pass = null; /*Data generated from cURL*/ public $content = null; public $response = null; /* Links */ private $url = array( 'login' => 'https://website.com/login.jsp', 'submit' => 'https://website.com/LoginServlet', 'page1' => 'https://website.com/page1', 'page2' => 'https://website.com/page2', 'page3' => 'https://website.com/page3' ); /* Fields */ public $data = array(); public function __construct ($user, $pass) { $this->user = $user; $this->pass = $pass; } public function login() { $this->cURL($this->url['login']); if($form = $this->getFormFields($this->content, 'login')) { $form['login'] = $this->user; $form['password'] =$this->pass; // echo "<pre>".print_r($form,true);exit; $this->cURL($this->url['submit'], $form); //echo $this->content;//exit; } //echo $this->content;//exit; } // NEW TESTING public function loadPage($page) { $this->cURL($this->url[$page]); echo $this->content;//exit; } /* Scan for form */ private function getFormFields($data, $id) { if (preg_match('/(<form.*?name=.?'.$id.'.*?<\/form>)/is', $data, $matches)) { $inputs = $this->getInputs($matches[1]); return $inputs; } else { return false; } } /* Get Inputs in form */ private function getInputs($form) { $inputs = array(); $elements = preg_match_all('/(<input[^>]+>)/is', $form, $matches); if ($elements > 0) { for($i = 0; $i < $elements; $i++) { $el = preg_replace('/\s{2,}/', ' ', $matches[1][$i]); if (preg_match('/name=(?:["\'])?([^"\'\s]*)/i', $el, $name)) { $name = $name[1]; $value = ''; if (preg_match('/value=(?:["\'])?([^"\']*)/i', $el, $value)) { $value = $value[1]; } $inputs[$name] = $value; } } } return $inputs; } /* Perform curl function to specific URL provided */ public function cURL($url, $post = false) { $ch = curl_init(); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13"); // "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_VERBOSE, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_COOKIEJAR, $this->cookies); curl_setopt($ch, CURLOPT_COOKIEFILE, $this->cookies); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120); curl_setopt($ch, CURLOPT_TIMEOUT, 120); if($post) //if post is needed { curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post)); } curl_setopt($ch, CURLOPT_URL, $url); $this->content = curl_exec($ch); $this->response = curl_getinfo( $ch ); $this->url['last_url'] = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); curl_close($ch); } } $sc = new Scrape('user','pass'); $sc->login(); $sc->loadPage('page1'); echo "<h1>TESTTESTEST</h1>"; $sc->loadPage('page2'); echo "<h1>TESTTESTEST</h1>"; $sc->loadPage('page3'); echo "<h1>TESTTESTEST</h1>"; 

(примечание: кредит @Ramz очистить сайт с защищенным входом)

Вы можете разделить проблему на несколько частей.

  1. Извлечение данных из источника данных. Для этого вы можете использовать CURL или file_get_contents () в зависимости от ваших требований. Примеры кода повсюду. http://php.net/manual/en/function.file-get-contents.php и http://php.net/manual/en/curl.examples-basic.php

  2. Разбор полученных данных. Для этого я бы начал с изучения «PHP Simple HTML DOM Parser». Вы можете использовать его для извлечения данных из строки HTML. http://simplehtmldom.sourceforge.net/

  3. Создание и производство продукции. Это просто вопрос о том, что вы хотите сделать с данными, которые вы извлекли. Например, вы можете распечатать его, переформатировать или сохранить в базе данных / файле.

Я предлагаю вам использовать уже сделанный скот. Я использую Goutte ( https://github.com/FriendsOfPHP/Goutte ), который позволяет загружать содержимое веб-сайта и проходить его так же, как с jQuery. т.е. если я хочу содержимое <div id="content"> я использую $client->filter('#content')->text()

Это даже позволяет мне находить и «нажимать» на ссылки и отправлять формы для восстановления и обработки содержимого.

Это делает жизнь soooooooo mucn проще, чем использование cURL или file_get_contentsa (), и прокладывает себе путь через html вручную