CoderCastrov logo
CoderCastrov
Питон

Еще один очень базовый учебник по Scrapy: Парсинг последних землетрясений в Турции

Еще один очень базовый учебник по Scrapy: Парсинг последних землетрясений в Турции
просмотров
4 мин чтение
#Питон

Время от времени мне нужен парсинг. Мне очень нравится парсинг, так как я разработчик мобильных приложений, и многие разработчики мобильных приложений любят парсинг, потому что таким образом можно реализовать самые простые хобби-проекты. Есть много инструментов и фреймворков для этого: раньше я очень наслаждался Yahoo’s YQL, RoR-mechanize, но я все еще предпочитаю найти бэкэнд-разработчика в качестве друга, чтобы он написал парсинговые штуки бесплатно :P

Я всегда верю, что есть более простой способ, и на этот раз я попробую библиотеку на Python - Scrapy. Я не знаю, является ли она лучшей, но она достаточно хороша, чтобы полюбить ее :) В конце мы получим обработанные данные о "последних землетрясениях в Турции" в формате json.

Пожалуйста, используйте этот учебник только в образовательных целях и уважайте права и конфиденциальность.

Что касается данных, то существует известный обсерваторный сайт на турецком языке, и когда происходит землетрясение, люди быстро ищут в Google "Последние землетрясения" и первым результатом находят этот сайт. http://www.koeri.boun.edu.tr/scripts/lst9.asp

I guess, a lonely script reads a source plain text input, and renders page for years.

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

http://m.koeri.boun.edu.tr/dbs/deprem-listesi.asp

Итак, у нас есть цель, я здесь и буду ждать, пока вы выполните некоторые скучные вещи:


0- Вам следует быть знакомым с инструментами инспектора вашего браузера.

1- Если вы используете Mac, найдите способ установить pip. Это своего рода менеджер пакетов для Python, который отсутствует в стандартной установке системного Python. Если вы не используете Mac, проверьте, установлены ли Python и pip в вашей системе. (Я использовал brew и изменил переменную PATH, или вы можете использовать anaconda)

2- Установите VsCode. Он действительно хорош и бесплатен. Установите расширения для Python. Достаточно. Или просто используйте любую избранную среду разработки, я не разработчик Python, если честно, я обычно пишу его неправильно, то есть я думаю дважды перед тем, как написать "python", так как я не носитель языка :D (всегда сомневаюсь, было ли всегда phyton, pyhton, python..)

3- Установите scrapy


и давайте начнем!

Быстро ознакомьтесь с официальной документацией.

Напишите команду для создания каркаса проекта и создайте файл py в папке spiders.

scrapy startproject tutorial
Я бы умер, если бы не показал вам, как создать файл.

Вы когда-нибудь слышали о конвенции перед конфигурацией? Это то, что люди любят в RoR. Немного того же есть и в Scrapy. Вы помещаете ссылки сюда, логику разбора туда, и Scrapy делает волшебную часть. У них также есть отличные учебники, которые отлично подходят, так как они сделали бы написание этого поста бессмысленным. Но в этот уик-энд мне хватило скуки, чтобы закончить. Так что с небольшой помощью официальных учебников и знания правильных слов для xpath я мог бы легко написать это левой рукой.

Давайте начнем с основных частей. Разберем только магнитуду и местоположение.


Давайте спарсим

scrapy crawl LatestEarthquakes -o latest_earthquakes.json
_“Выполнено_,_но с ошибками на странице_.”

Хм, что-то странное. Ничего не работает с первой попытки. Давайте попробуем scrapy shell. Напишите view(response), чтобы узнать, как Scrapy видит страницу.

scrapy shell [http://m.koeri.boun.edu.tr/dbs/deprem-listesi.asp](http://m.koeri.boun.edu.tr/dbs/deprem-listesi.asp)
In [1]: view(response)
Совет: Перед началом парсинга всегда рассмотрите страницу с отключенным JavaScript.

Ага! Проблема связана с Ajax. Когда Scrapy получает нашу страницу, нет контента для парсинга. Кроме того, я не уверен, способен ли Scrapy выполнять JavaScript, может быть, стоит использовать некоторый безголовый браузер с Scrapy для достижения цели (например, Selenium webdriver webkit). Но мне повезло попробовать другой вариант: получить ajax-запрос и распарсить ответ.

Вы можете получить URL ajax из вкладки 'Сеть' инструментов разработчика.

Проверим результаты с новым URL:

http://m.koeri.boun.edu.tr/dbs/deprem-listesi-touch.asp?sort=tarih&sira=desc

scrapy shell [http://m.koeri.boun.edu.tr/dbs/deprem-listesi-touch.asp](http://m.koeri.boun.edu.tr/dbs/deprem-listesi-touch.asp)
>> first_row = response.xpath('//tr')[0]
>> first_row.xpath('.//span[@id="namediv"]/text()').extract_first()-->  u'\r\n AKDENIZ\r\n'

Хорошо, теперь scrapy shell показывает нам красивый портрет. Это отличный инструмент, который дает нам возможность интерактивно тестировать xpath перед написанием кода. Давайте обновим наш код:

^_^Поздравляю. Все еще требуется форматирование, но наполняет наши сердца надеждой ❤

Ура! Давайте закончим эту работу. Если вы посмотрите внимательнее и найдете другие хорошие данные для строки, вы увидите, что все лежит в ссылке на детальную страницу:

Да здравствуют _GET параметры

Просто используйте стандартную библиотеку для разбора параметров URL:

Хорошо, последний парсинг, пожалуйста:

scrapy crawl LatestEarthquakes -o latest_earthquakes.json
Мне кажется, что вы уже видели этот скриншот, дежа вю?

Вот и все. Спасибо, что уделили этому посту свое драгоценное время.