Соскоб экрана php с cURL и xpath - PullRequest
1 голос
/ 23 марта 2011

Я пытаюсь использовать xpath для очистки сайта, но первоначальный сайт - это виджет, а не необработанный HTML, поэтому мне нужно каким-то образом выполнить код виджета, чтобы получить HTML.

URL, который я хочу очистить: https://www.dealcurrent.com/customwidget.php?publisherID=36&widget=largewidget

если я повторяю $ html, который возвращает curl_exec, он дает мне правильный html-файл, но если я просто распечатаю $ html напрямую, он дает мне что-то вроде:

<br />[ ]<br>[ try {if(window.top.location==document.URL) document.write('<meta http-equiv=refresh content="0;url=\'http://www.sweetfind.com/\'"/>'); } catch(e) {}Sweet Findif(34>=10000) window.location.href="https://www.dealcurrent.com/customwidget.php?widget=largewidget_soldout&publisherID=36"; #nav a:link { color:#666666; font-family:Arial, Helvetica, sans-serif; font-size:12px; text-decoration:none; } #nav a:visited { font-family:Arial, Helvetica, sans-serif; color:#666666; text-decoration:none; font-size:12px; text-decoration:none; } #nav a:hover { font-family:Arial, Helvetica, 

и т.д ...

Есть ли способ, которым я могу "выполнить" код выше, чтобы получить вывод html, чтобы я мог использовать его с xpath?

Ответы [ 3 ]

1 голос
/ 23 марта 2011

Короткий ответ на ваш вопрос - «Нет»; cURL не поддерживает JavaScript (и, вероятно, никогда не будет, поскольку это не то, для чего он создан), а также не поддерживает библиотеки для PHP. Ниже приведен список опций:

Обратный инжиниринг JavaScript

Если вам нужно сделать это только один раз, то переключение инструментов, вероятно, не лучшее решение (с совместимостью с кодовой базой и всем этим). В этом случае вы можете попробовать вручную эмулировать эффекты JavaScript в вашем коде; если он говорит window.location="example.com", вы выбираете example.com; если он заполняет и отправляет форму, вы отправляете запрос POST. Тем не менее, вы, вероятно, устали от этого довольно быстро - я знаю, что сделал.

В этом конкретном случае, если вы пытаетесь захватить страницу, на которую вы перенаправлены, вы можете попытаться использовать strpos и substr для разделения мета-перенаправления, вставляемого JavaScript , чтобы добраться до URL, и просто следуйте этому.

Альтернативы PHP / cURL

Для PHP в настоящее время нет никаких инструментов (насколько я знаю), которые позволили бы вам выполнять JavaScipt (или Flash), с чем вы в конечном итоге столкнетесь при очистке; и я долго искал решение. (Если вы найдете что-нибудь, пожалуйста, дайте мне знать.) Итак, когда вы в конце концов устанете «эмулировать» нужные сценарии на странице.

Обратите внимание, что в основном вы будете использовать инструменты для веб-приложений тестирование ; они просто пригодны для чистки.

  • Watir : лучший инструмент для полного выполнения JavaScript и Flash, который я нашел на данный момент, - Watir , который позволяет вам управлять экземпляром любого крупного браузера от Ruby; Я знаю, что он был перенесен на Java и .Net, но я никогда не использовал ни одну из этих реализаций. Обратите внимание, что Watir также имеет очень доступную реализацию для XPath:

  • Механизация : веб-библиотека, имеющая реализации на самых популярных языках (те, о которых я знаю, по крайней мере, на Ruby, Python и (я полагаю, оригинал) на Perl.

  • Селен : как упоминает Хисока, Селен также является уважаемым инструментом.

  • HtmlUnit : еще один хороший инструмент (который иногда ломается в JavaScript, и, насколько я знаю, не реализует выполнение Flash) - HtmlUnit , как библиотека Java. Я использовал это некоторое время, и это произвело на меня впечатление «громоздкости», и этот инструмент является инструментом тестирования веб-приложений. (Что плохо, так как вам, вероятно, не нужны отчеты об ошибках HTML и CSS.)

(Обратите внимание, что это ни в коем случае не полный список.)

Примеры кода

Пример использования Watir:

browser = Watir::Browser.new
browser.goto("example.com")
browser.h1(:xpath, "//h1[@id='header']").click
1 голос
/ 23 марта 2011

Curl дает только вывод HTML и не может выполнить javascript, так как это не браузер.Лучше всего найти другой инструмент для очистки, такой как Selenium, для захвата содержимого страницы после выполнения Javascript.Керл, наверное, тебе здесь не поможет.

0 голосов
/ 23 марта 2011

Я не уверен, что это то, что вы ищете?

Однако вы должны быть осторожны с путями, определенными в коде.

echo file_get_contents($url);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...