И почему XPaths упростил код по сравнению с селекторами CSS
Код среднего скребка недействителен:
Код парсера для части Medium не работает, потому что используемые селекторы CSS недостаточно точны / не нацелены на нужные нужные узлы HTML. Действительно, извлеченные заголовки статей Medium не соответствуют ссылкам на связанные статьи Medium.
Его можно легко протестировать и проверить прямо в консоли предпочитаемого вами веб-браузера, введя и выполнив соответствующий код Javascript:
Уловка здесь заключается в том, чтобы запросить DOM для правильного селектора, сопоставляя только те узлы, которые мы хотим, и в конечном итоге отфильтровать узлы HTML, полученные путем применения критерия node.querySelector ('. Graf - title') (что означает, что нам нужен только «a» узлы, имеющие дочерний узел с классом graf - title.
Array.from(document.querySelectorAll(‘div.postArticle-content a:first-child[data-action-value]’)) .filter( node => node.querySelector(‘.graf — title’)) .map( link => ( { title: link.querySelector(‘.graf — title’).textContent, link: link.getAttribute(‘data-action-value’) } )) );
У нас не было бы этой проблемы, если бы вместо использования селекторов CSS мы использовали селекторы XPath, такие как:
//div[@class=’postArticle-content’]/a[1][@data-action-value][.//*[contains(@class, ‘graf — title’)]]
Теперь у нас есть желаемые результаты:
Улучшить код парсера:
Декларативное программирование - это когда вы говорите, что хотите, а императивный язык - это когда вы говорите, как получить то, что хотите.
Код, используемый для написания парсера (шаг извлечения данных), в основном выполнен в стиле императивного программирования. Вместо того, чтобы сообщать, чего мы хотим достичь, этот код говорит только о том, как мы хотим это сделать.
Но должно быть наоборот: говорите, чего вы хотите достичь, а не как это делать.
Вместо использования сложной логики с сочетанием вызовов .forEach () и .map () мы могли бы просто сделать следующее:
Кроме того, безголовый браузер можно открыть только один раз, нет необходимости создавать новый экземпляр каждый раз, когда наш экспресс-сервер получает новый запрос.
Таким образом, мы экономим накладные расходы на запуск веб-браузера и всегда используем один и тот же экземпляр. Открытие новой веб-страницы / вкладки браузера занимает меньше времени. ‹
Надеюсь, это поможет :)