Обновить

Комментарии 12

Парсинг сайтов на Python

Иногда удобней скачать сайты, для их последующего парсинга, с помощью расширений Хром. Например, иностранно-русские словари (или наоборот), защищенных капчей. Однако, если капчи нет, а только контроль интенсивности запросов, то годится и Питон. Но, всё равно, «разбор полётов», то бишь, извлечение собственно текстов словарных статей из html-страниц, лучше делать у себя на компьютере, а не «на лету». Хотя бы потому, что не известна хорошая структура для хранения словарных статей для языковых словарей. Да и, часто, это весьма не тривиальная задача, хотя, ИИ заметно помогают.

вы написали "с помощью расширений хром". Можете описать чуть подробнее (возможно я не знаком с этим) или кинуть название расширения? Ведь чтобы скачать сайт, вам всё равно придется посетить все страницы. И если это делать обычным браузером, то всё равно будут вылезать капчи.

Можете описать чуть подробнее (возможно я не знаком с этим) или кинуть название расширения? Ведь чтобы скачать сайт, вам всё равно придется посетить все страницы. И если это делать обычным браузером, то всё равно будут вылезать капчи.

Веб-скрапинг вполне можно делать с помощью расширений на старых версиях Хрома, (у меня версия 109), для того, чтобы сохранить возможность работы со второй версией манифеста. Поскольку, в последних выпусках Хрома доступен только третий манифест (насколько я знаю), а он уже имеет ограничения в работе, которых не было во втором манифесте. Это касается и блокировщика рекламы сайтов и работы с файлами. А Хром нужен для (ручного) обхода капчи – «дешево и сердито».

При этом, начальную капчу мы проходим вручную (на примере сайтов с онлайн-словарями), потом это дает нам какое-то количество времени (обычно, минут 5 – 30) до появления следующей капчи. Во время этого интервала мы запускаем свой небольшой скрипт расширения, который с небольшой задержкой, скажем, секунд пять, делает запросы на загрузку необходимых html-страниц, которые мы просто тупо сохраняем в своем каталоге. Их обработкой мы можем заняться потом, когда уже все скачаем, Это могут быть сотни тысяч страниц.

При этом, в процессе скачивания страниц мы можем отследить начало сбоя. В Хроме это хорошо видно. Останавливаем скрипт, переинициализируем его, при необходимости, снова вручную набираем соответствующий url в Хроме, опять проходим капчу (при подозрении сервера, он может запрашивать ее несколько раз). Для профилактики подозрений, периодически меняем ай-пи, например, посредством вэпээна.

Поскольку я достаточно много экспериментировал с подобными расширениями, то какой-то стабильной версии у меня нет. Всегда нужно было подстраиваться под каждый сайт индивидуально. Я вам дам код, благо он короткий, но гарантировать работу не буду, кое-что уже подзабыл, вникать и разбираться вам, по любому придется. Кстати, все прототипы я находил на Гитхабе.

Файл: manifest.json :
{
"name": "Загрузка выбранных слов",
"description": "Создание ссылок и загрузка их",
"version": "0.1",
"minimum_chrome_version": "16.0.884",
"permissions": ["downloads", "<all_urls>"],
"browser_action": {"default_popup": "Popup.html"},
"manifest_version": 2
}

Файл: Popup.html (замените квадратные скобки на угловые, иначе он не грузиться здесь):
[!DOCTYPE html]
[head]
[script src='Popup.js'][/script]
[/head]
[body]
[input type=number id=filter value=128242]

[table id=links]
[tr]
[th align=left]URL[/th]
[/tr]
[/table]

[button id=download0]Download Words![/button]
[/body]
[/html]

Файл Popup.js :
//==================================================
// Это расширение демонстрирует использование chrome.downloads.download() чтобы загузить URLs
//==================================================
//==================================================
// DownloadLinks() - Загрузить все ссылки
//==================================================
function DownloadLinks() {
var Step = Number(document.getElementById('filter').value); // Текущий номер итерации (храниться в html-файле)
//const MainUrl = 'https://1554.slovaronline.com/';
const MainUrl = 'https://big-fr-rus-fr-dict.slovaronline.com/';
var links = [];
const Count = 1; // Количество ссылок на один запрос
const Offset = 0; // Начальное смещение
var Start = Step*Count + Offset;
document.getElementById('filter').value = Step + 1;

for(var i = Start; i < Start + Count; ++i) {
var ii = '' + i;
var Suffix = ii.padStart(6, '0');
var Link = MainUrl + Suffix;

chrome.downloads.download(
  {
    filename: Suffix + ".htm",
    url: Link
  },
  function(id) {}
);

} // for(var i = Start; i < Start + Count; ++i)

//window.close();
} // function DownloadLinks()

//==================================================
// DownloadLinks() - Загрузите все ссылки для каждого множества запросов
//==================================================
function DownloadLinksSets() {
setInterval(DownloadLinks, 5000);
} // function DownloadLinksSets()

//==================================================
// Настроивваем обработчик событий
//==================================================
window.onload = function() {
document.getElementById('download0').onclick = DownloadLinksSets;
}; // window.onload = function()

//==================================================
//==================================================

В Хроме 109-й версии, выбираете меню «Настройки / Расширения / Загрузить расширения», выбираете папку с этими тремя файлами. Вылезет ошибка манифеста, что вторая версия устарела, используйте третью. Игнорируйте ее. Ради второго манифеста мы и используем старый Хром.

Текущий номер файла, с которого начинается загрузка, прописан в «Popup.html». У меня там стоит число 128242. Это, по-моему, последняя загруженная страница из используемого оглайн-словаря. Вам, естественно, нужно начинать с 10-й страницы, по-моему, ибо это, по факту, первая существующая страница на данном сайте словаря.

Для других сайтов будут свои нюансы. Если страницы не номерные, а по именам слова, как на GUFO, то там я скачивал сначала страницы с индексами, извлекал оттуда ссылки на слова, а потом загружал их. В общем, повозиться придется. Но, как зацепка, эта информация мне бы сильно помогла, в начале. Плюс, штудируете Гитхаб на эту тему и ИИ, от которых я тоже получал нужные мне шаблоны кода.

Мда, Хабр нынче не тот, что раньше. Принимает статьи от всех, кто вчера освоил requests и beautifulsoup. Зачем эта статья? На том же Хабре наверное сотни таких статей про эти библиотеки.

import requests from bs4 import BeautifulSoup response = requests.get('http://parsingme.ru/beautifulsoup/1.html') tree = response.text soup = BeautifulSoup(tree, 'lxml')

Зачем вы повторяете этот кусок кода из раза в раз. Почти вся статья только из этих строк и состоит.

И уже "1 февраля стартует мой курс по парсингу..." Вы серьезно?!

для того, чтобы можно было скопировать кусок кода в редактор и сразу запустить. например, если вы возвращаетесь к статье спустя время, дабы заново не искать импорты. А так соглашусь, что можно было и опустить это. Не думал, что это для некоторых это проблема (здесь должен быть смайл "рука лицо")

Что-то нового узнал. Спасибо.

чем selectolax лучше, не пойму? Вы можете дать конкретные кейсы, где soup не справился ,а selectolax справился, без абстрактного "он быстрее и типа лучше справляется с грязным html"?

Кто сказал, что суп не справляется, конечно справляется, он молодец, только делает он это со скоростью улитки, что не позволяет его нормально использовать в асинк сценариях.
Чем скорость работы вам не аргумент? Чем быстрее выполняется скрипт парсера - тем лучше, или вы привыкли "запускать парсер и пойти варить кофе"?
Во всех сценариях где я занимался парсерами была важна скорость парсинга и дальнейшей обработки данных. С супом это занимало в разы больше времени.

спасибо за развернутый ответ. я изучу этот вопрос глубже.

Вытащить нужную информацию из текстового контента (html, json или др.) очень простая задача. Еще раз, ОЧЕНЬ простая задача.
При парсинге сайтов основная проблема - это получение контента с сайта, а не его разбор.
Раз уж вы запускаете "курс по парсингу сайтов", то наверняка хорошо разбираетесь в данной теме. Рассказали бы нам о действительно насущной проблеме - как получать контент с сайтов надежно, быстро и стабильно.
Покажите на реальных сайтах, а не на демонстрационных статичных страничках.
Начните хотя бы со среднего уровня сложности - как получать контент с таких сайтов как озон, домклик, золотое яблоко. И не просто как его получать, а самым лучшим и оптимальным способом.
Дайте реальные кейсы, а не то, что грубо говоря, знает каждый первоклассник. Вот это будет ценная и полезная информация - которую интересно будет почитать. А вы алфавит нам предлагаете, который ну просто на каждом шагу.

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

Во-вторых, вы ведь не ждете парсинг с помощью Selenium, не так ли? Это не ваш уровень, это каждый школьник знает. И плевать, что даже в компаниях им активно пользуются (см. видео Максима Кульгина). Тогда чего вы ждете? Реверс JS скриптов? И много людей осилят эту статью (среди тех, кто интересуется парсингом)? Или мне начинать опять с алфавита "изучаем JS с нуля".

P.S. Ладно, сообщение получилось чуть эмоциональным, прошу простить, надеюсь сильно не задел. В целом я с вами согласен, спасибо за приведенные сайты, я их поизучаю. Было бы неплохо также скинуть и "сложный" уровень.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации