Пожалуйста, не перебирайте строки для веб-очистки таблиц с помощью приложения Python Scrapy.

Я уже некоторое время оттачиваю свои навыки парсинга. Я использовал красивый суп, запросы и Scrapy. Недавно я решил еще раз взглянуть на приложение Scrapy. Я хотел посмотреть, было ли более эффективно очищать сайт истории котировок акций Yahoo Finance с помощью Scrapy по сравнению с запросами с использованием многопоточности.

Сначала меня раздражал ответ, когда я пытался очистить таблицу. Я исследовал в Интернете, как другие программисты подходят к таблицам с помощью приложения Scrapy. Я обнаружил, что основная рекомендация - очистить каждую отдельную строку из таблицы до элемента с помощью приложения Scrapy.

Это нормально, если в таблице всего несколько строк. Но что, если есть 100 или более строк, как на странице истории курсов акций Yahoo Finance? Для меня было непрактично даже пытаться это сделать.

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

data = response.xpath('//table//text()').extract()

Таблица истории курсов акций Yahoo Finance содержит семь столбцов. Таким образом, каждый восьмой элемент в списке начинается с новой строки в таблице из семи столбцов Yahoo Finance. Чтобы разделить список, я использовал одну строку кода:

#The first list is the column names and each remaining list represents a row of data
output = [data[i:i + num_cols] for i in range(0, len(data), num_cols)]

Затем я создал из него фрейм данных pandas и преобразовал его в словарь. На этом этапе данные были готовы для хранения в файле JSON или в базе данных SQL.

dictionary = pandas.DataFrame(output[1:], columns=output[0]).set_index('Date').to_dict()

Все это сработало. Тем не менее я был разочарован скоростью, с которой он запускал код. На очистку 27 URL ушло почти 7 секунд!

Хотя это, вероятно, намного быстрее, чем очистка каждой строки таблицы по отдельности с помощью итерации, существуют более быстрые способы выполнить ту же задачу. Раньше я пробовал использовать многопоточность и запросы для очистки истории курсов акций с веб-сайта Yahoo Finance. Когда я скопировал 27 URL-адресов с помощью этого проекта, программе потребовалось всего 4,7 секунды, чтобы очистить 27 URL-адресов.

На самом деле Scrapy был медленнее, чем использование запросов и многопоточность. Я связываю более низкую скорость Scrapy с объемом статистики, собираемой программой, работающей в фоновом режиме. Тем не менее мне также не хватало гибкости, которую я обычно имею при написании программы с нуля.

Хотя Scrapy может быть отличным приложением для использования в некоторых контекстах, я предпочитаю гибкость и скорость создания моих собственных приложений для очистки веб-страниц с помощью пакета запросов. При необходимости могу использовать многопоточность или asyncio для ускорения работы.