https://github.com/REMitchell/python-scraping.
За редким исключением, если данные доступны в браузере, то доступны и через скрипт Python.
API предназначены для построения удобного потока хорошо отформатированных данных из одной компьютерной программы в другую.
веб-скраперы гораздо лучше справляются с быстрым сбором и обработкой больших объемов данных. Вместо того чтобы просматривать страницу за страницей на экране монитора, можно читать сразу целые базы данных, в которых хранятся тысячи и даже миллионы страниц.
веб-скрапинг — это сбор данных с использованием любых средств, за исключением программ, взаимодействующих с API.
Как говорится в старой шутке по информатике, «допустим, есть некая проблема, которую мы хотим решить с помощью регулярных выражений. Теперь у нас две проблемы».
Аргумент attribute принимает Python-словарь атрибутов и ищет теги, которые содержат любой из этих атрибутов.
Найдите ссылку Print This Page (Распечатать эту страницу) или, возможно, мобильную версию сайта с более удачным HTML-форматированием (подробнее о том, как выдать себя за мобильное устройство и получить мобильную версию сайта, см. в главе 14).
• Поищите информацию в файле JavaScript. Учтите, что для этого вам может понадобиться исследовать импортированные файлы JavaScript. Например, однажды я получила с сайта адреса улиц (вместе с широтой и долготой) в виде аккуратно отформатированного массива, заглянув в JavaScript-код встроенной карты Google, на которой были точно отмечены все адреса.
• Это больше касается заголовков, однако информация может находиться в URL самой страницы.
• Если информация, которую вы ищете, по какой-либо причине является уникальной для данного сайта, — вам не повезло. В противном случае попробуйте найти другие источники, из которых можно было бы получить эту информацию. Нет ли другого сайта с теми же данными? Возможно, на нем приводятся данные, скопированные или агрегированные с другого сайта?
print(bs.nonExistentTag)
Этот объект вполне доступен для обработки и проверки. Проблема возникает в том случае, если продолжать его использовать без проверки и попытаться вызвать для объекта None другую функцию:
print(bs.nonExistentTag.someTag)
Эта функция вернет исключение:
AttributeError: 'NoneType' object has no attribute 'someTag'
Как же застраховаться от этих ситуаций? Проще всего — явно проверить обе ситуации:
try:
badContent = bs.nonExistingTag.anotherTag
except AttributeError as e:
print('Tag was not found')
else:
if badContent == None:
print ('Tag was not found')
else:
print(badContent)
Проблема в том, что попытка обратиться к тегу самого объекта None приводит к возникновению ошибки AttributeError.