Сканирование сайта с помощью PHP, но на сайте запускается JS для генерации разметки - PullRequest
0 голосов
/ 29 апреля 2018

Я занимаюсь веб-сканированием последние пару недель. Используя библиотеку PHP (PHP Simple DOM), я запускаю сценарий php (используя терминал), чтобы извлечь некоторые URL-адреса и JSON некоторые данные из него. Пока это работает очень хорошо.

Недавно я хотел расширить сканирование для определенного сайта и столкнулся со следующей проблемой:

В отличие от любого другого сайта, пока что этот, он использует только серверную сторону разметки barebones и вместо этого опирается на один JS-скрипт для создания соответствующей нагрузки разметки.

Очевидно, что мой PHP-скрипт не может с этим справиться (поскольку он не выполняет JS, и, следовательно, сайт остается в основном пустым от того, что я могу сказать), и поэтому я не могу сканировать сайт, так как контент еще не создан.

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

В настоящее время я думаю, что мне нужно создать сайт html / js, который открывает URL-адрес в iFrame, и таким образом я мог бы вручную запустить функцию JS через консоль для извлечения данных. Однако я надеюсь, что есть более реальный путь.

спасибо,

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Когда мне нужно записать веб-сайт, я обычно:

1 - перемещаться по веб-сайту target в обычном браузере (ff, chrome и т. Д.), при мониторинге / ведении журнала любых POST / GET запросов, содержащих соответствующую информацию. через Developer Tools -> Network Tab.
Обратите особое внимание на запросы XHR, так как они обычно содержат данные json.
Вот небольшое видео, которое я сделал в качестве примера:

https://www.youtube.com/watch?v=JbiZBGt8cos

Вы можете имитировать request headers, сделанный ранее (объяснено в видео), и использовать его по запросу curl, т.е.:

$headers = [
    "Connection: keep-alive",
    "Accept: application/json, text/javascript, */*; q=0.01",
    "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
    "DNT: 1",
    "Accept-Language: pt,en-US;q=0.9,en;q=0.8,pt-PT;q=0.7,pt-BR;q=0.6",
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"http://s1te.com/json_rand.php");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$server_output = curl_exec ($ch);
curl_close ($ch);
print  $server_output ;

2 - В некоторых случаях невозможно сканировать определенные URL-адреса без клиента с поддержкой JavaScript , когда это происходит, я обычно использую Selenium с Chrome или Firefox. Вы также можете использовать PhantomJS , браузер без головы. Последние версии GeckoDriver (используемые Selenium) также поддерживают просмотр без заголовка.


Я знаю, что вопрос о PHP, но если ОП нужно использовать Selenium, Python гораздо более интуитивно понятен, я бы сказал. Исходя из этого, вот пример Selenium в Python:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox()
driver.get("http://www.python.org")
assert "Python" in driver.title
elem = driver.find_element_by_name("q")
elem.clear()
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
assert "No results found." not in driver.page_source
driver.close()

Пример Src

0 голосов
/ 29 апреля 2018

Я вижу два возможных пути:

  • В случае, если JavaScript, который создает DOM, извлекает данные через один или несколько вызовов AJAX, вы можете также соскрести эти URL напрямую (и в любом случае это проще, например, если он обращается к JSON). API).

  • Имитация браузера, например, используя селен. Например, эта статья обсуждает конкретную проблему, о которой вы упомянули, и предоставляет решение с использованием Selenium и Python.

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