Comments 32
Но для решения задач по парсингу одной-двух ссылок, а не многопоточного скачивания всего сайта это не подходило.
А зачем скачивать весь сайт если можно скачать только контент этих одной-двух ссылок?
В вашем случае самым "правильным" решением будет как раз селениум с безголовым браузером. По крайней мере домофонду защититься от него будет куда сложнее чем от вашего итогового решения.
Не хотелось лишнего ПО.
Так что вы написали ещё ПО. Л - логика.
Скрипт уже был и прекрасно работает.
Потребовалось лишь минимально модернизировать.
Но вы же не хотели лишнего ПО, но вместо этого написали ещё ПО!
Скрипт не лишнее ПО, а работающий под задачу функционал.
А всё остальное ПО, которое решало поставленную задачу классом лучше, лишнее?
Поздравляю, у вас NIH-синдром. Гуглябельно.
Микроскопом тоже можно гвозди заколачивать)))
Да. Но вместо этого это изобретаете микроскоп из трубочки для туалетной бумаги и двух полиэтиленовых пакетиков с водой.
А потом всё равно им забиваете гвозди.
Не хотелось лишнего ПО.
В роботс.тхт действительно стоит много запретов для ботов, но не на новостные статьи.
По имени и по айпи хоста - отдается одинаковый контент.
Например, какие проблемы? С другими сайтами проблем по сбору нет.
Хотел дополнить в статье, но напишу в комменте, что с авито - примерно та же ситуация возникла. Решено этим же подходом - успешно.
Дичь лютейшую прочитал сейчас я.
Коллега, для ваших целей замечательно зайдёт вот такая штука:
https://splash.readthedocs.io/en/stable/
Он очень просто ставится. У него даже docker image готовый есть.
А дальше вы делаете к нему http запрос хоть тем же курлом с указанием урла сайта, который нужно спарсить - и он возвращает вам html.
Более того, можно писать свои скрипты парсинга на Lua, если нужно парсить по какому-то сценарию. Например, если сайты с AJAX подгрузкой контента, постраничником и т.п.
Из минусов:
- разработчики на него немного подзабили, походу
- падает на сложных Angular приложениях
В решении дополнил скрипт методом gethostbyname, чтобы получать IPv4-адрес, соответствующий переданному имени хоста.
Плохая идея, т.к., начиная с HTTP/1.1, на одном IP может висеть несколько сайтов. Соответственно, скачиваться будет что-нибудь не то.
В этом случае (домофонд, авито) было как раз наоборот (изначально использовал gethostbynamel - для списка айпи). Думаю, что для крупных сайтов так и будет.
Но спасибо за коммент.
Я тут намедни столкнулся с дригой забавной ситуацией.
cURL из под PHP на двух "одинаковых" версиях PHP на разных машинах при запросе одного и того же урла выдавал на одной машине заголовки как есть, а на другой в нижнем регистре. Так и не понял почему, тупо добавил в regexp case independed.
а зачем вебсерверу отдавать заголовки то в нормальном виде, то в нижнем регистре?
Тем более страница одна и таже, и по факту оно проявлялось именно на разных машинах, которые делают запрос. Я подозреваю, что "проблема" в версии cURL extension/OpenSSL. Ибо хоть версия php7.4 и там и там одна, но одна тачка Debian 10, другая Debian 11
О чём статья вообще? За 5 минут накидал скрипт, никакой защиты на веб-сервере нет.
$wc = New-Object system.Net.WebClient;
($wc.downloadString("https://www.domofond.ru/statya/kolichestvo_dolgostroev_uvelichilos_v_vosemnadtsati_regionah_rf_za_2021_god/102082") -split '\r?\n')[60].Replace('</script>','').Replace(' <script>window.__INITIAL_DATA__ = ', '') | ConvertFrom-Json
На выходе готовый JSON, дёргайте оттуда любые данные. В чём проблема-то? )
Как получить контент веб-страницы, если по ссылке с именем хоста не получилось