Еще один очень базовый учебник по Scrapy: Парсинг последних землетрясений в Турции
Table Of Content
Время от времени мне нужен парсинг. Мне очень нравится парсинг, так как я разработчик мобильных приложений, и многие разработчики мобильных приложений любят парсинг, потому что таким образом можно реализовать самые простые хобби-проекты. Есть много инструментов и фреймворков для этого: раньше я очень наслаждался Yahoo’s YQL, RoR-mechanize, но я все еще предпочитаю найти бэкэнд-разработчика в качестве друга, чтобы он написал парсинговые штуки бесплатно :P
Я всегда верю, что есть более простой способ, и на этот раз я попробую библиотеку на Python - Scrapy. Я не знаю, является ли она лучшей, но она достаточно хороша, чтобы полюбить ее :) В конце мы получим обработанные данные о "последних землетрясениях в Турции" в формате json.
Пожалуйста, используйте этот учебник только в образовательных целях и уважайте права и конфиденциальность.
Что касается данных, то существует известный обсерваторный сайт на турецком языке, и когда происходит землетрясение, люди быстро ищут в Google "Последние землетрясения" и первым результатом находят этот сайт. http://www.koeri.boun.edu.tr/scripts/lst9.asp
Проблема с этим сайтом, как вы можете видеть выше, заключается в том, что он очень старомодный и содержит очень неструктурированное представление данных (без 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)
Ага! Проблема связана с Ajax. Когда Scrapy получает нашу страницу, нет контента для парсинга. Кроме того, я не уверен, способен ли Scrapy выполнять JavaScript, может быть, стоит использовать некоторый безголовый браузер с Scrapy для достижения цели (например, Selenium webdriver webkit). Но мне повезло попробовать другой вариант: получить 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 перед написанием кода. Давайте обновим наш код:
Ура! Давайте закончим эту работу. Если вы посмотрите внимательнее и найдете другие хорошие данные для строки, вы увидите, что все лежит в ссылке на детальную страницу:
Просто используйте стандартную библиотеку для разбора параметров URL:
Хорошо, последний парсинг, пожалуйста:
scrapy crawl LatestEarthquakes -o latest_earthquakes.json
Вот и все. Спасибо, что уделили этому посту свое драгоценное время.