Недавно я изучал Python и погружаюсь в создание веб-скребка. Ничего особенного; его единственная цель - получить данные с веб-сайта для ставок и поместить их в Excel.
Большинство проблем решаемы, и у меня есть хороший маленький беспорядок вокруг. Однако я столкнулся с огромным препятствием из-за одной проблемы. Если сайт загружает таблицу лошадей и перечисляет текущие цены на ставки, этой информации нет ни в одном исходном файле. Подсказка заключается в том, что эти данные иногда бывают живыми, причем цифры, очевидно, обновляются с какого-то удаленного сервера. В HTML на моем ПК просто есть дыра, где их серверы проталкивают все интересные данные, которые мне нужны.
Теперь мой опыт работы с динамическим веб-контентом невелик, поэтому у меня возникли проблемы с тем, как мне разобраться.
Я думаю, что Java или Javascript - это ключ, который часто появляется.
Скребок - это просто механизм сравнения шансов. У некоторых сайтов есть API, но мне это нужно для тех, кто этого не делает. Я использую библиотеку Scrapy с Python 2.7
Я извиняюсь, если этот вопрос слишком открытый. Короче говоря, мой вопрос: как можно использовать скрап для очистки этих динамических данных, чтобы я мог их использовать? Чтобы я мог в реальном времени проверить эти данные о коэффициентах ставок?
Firefox
расширения, такие какhttpFox
или,liveHttpHeaders
и загрузите страницу, которая использует ajax-запрос. Scrapy не идентифицирует автоматически запросы ajax, вам нужно вручную найти соответствующий URL-адрес ajax, а затем выполнить запрос с ним.Ответы:
Браузеры на основе Webkit (например, Google Chrome или Safari) имеют встроенные инструменты разработчика. В Chrome вы можете открыть его
Menu->Tools->Developer Tools
.Network
Вкладка позволяет увидеть всю информацию о каждом запросе и ответе:Внизу рисунка вы можете видеть, что я отфильтровал запрос до
XHR
- это запросы, сделанные с помощью кода javascript.Совет: журнал очищается каждый раз, когда вы загружаете страницу, в нижней части картинки кнопка с черной точкой сохранит журнал.
После анализа запросов и ответов вы можете смоделировать эти запросы от вашего веб-сканера и извлечь ценные данные. Во многих случаях будет проще получить ваши данные, чем анализировать HTML, потому что эти данные не содержат логику представления и отформатированы для доступа к коду JavaScript.
Firefox имеет аналогичное расширение, оно называется firebug . Некоторые утверждают, что firebug еще более мощный, но мне нравится простота webkit.
источник
Вот простой пример
scrapy
с запросом AJAX. Пусть увидят сайт rubin-kazan.ru .Все сообщения загружаются с помощью запроса AJAX. Моя цель - получить эти сообщения со всеми их атрибутами (автор, дата, ...):
Когда я анализирую исходный код страницы, я не вижу все эти сообщения, потому что веб-страница использует технологию AJAX. Но я могу с помощью Firebug от Mozilla Firefox (или аналогичного инструмента в других браузерах) проанализировать HTTP-запрос, который генерирует сообщения на веб-странице:
Он не перезагружает всю страницу, а только части страницы, которые содержат сообщения. Для этого я нажимаю произвольное количество страниц внизу:
И я наблюдаю HTTP-запрос, который отвечает за тело сообщения:
После окончания я анализирую заголовки запроса (я должен процитировать, что этот URL я извлечу из исходной страницы из раздела var, см. Код ниже):
И форма данных содержимого запроса (HTTP-метод «Пост»):
И содержание ответа, который представляет собой файл JSON:
Который представляет всю информацию, которую я ищу.
С сегодняшнего дня я должен применить все эти знания в медицине. Давайте определим паука для этой цели:
В
parse
функции у меня есть ответ на первый запрос. УRubiGuessItem
меня есть файл JSON со всей информацией.источник
re
модуль (регулярные выражения), он ищет строку'url_list_gb_messages="(.*)"'
и изолирует содержимое скобок в переменной с тем же именем. Это хорошее введение: guru99.com/python-regular-expressions-complete-tutorial.htmlМного раз при сканировании мы сталкиваемся с проблемами, когда содержимое, отображаемое на странице, генерируется с помощью Javascript, и поэтому scrapy не может сканировать его (например, запросы ajax, сумасшествие jQuery).
Однако если вы используете Scrapy вместе с фреймворком веб-тестирования Selenium, мы можем сканировать все, что отображается в обычном веб-браузере.
Некоторые вещи, на которые стоит обратить внимание:
Чтобы это работало, у вас должна быть установлена версия Selenium RC на Python, и вы должны правильно настроить Selenium. Также это просто сканер шаблонов. Вы могли бы стать намного более безумным и более продвинутым с вещами, но я просто хотел показать основную идею. Теперь, когда код стоит, вы будете делать два запроса для любого заданного URL. Один запрос сделан Scrapy, а другой - Selenium. Я уверен, что есть способы обойти это, чтобы вы могли просто заставить Selenium выполнять один-единственный запрос, но я не стал реализовывать это, и, выполнив два запроса, вы также можете сканировать страницу с помощью Scrapy.
Это довольно мощно, потому что теперь у вас есть весь DOM, доступный для сканирования, и вы все еще можете использовать все приятные функции сканирования в Scrapy. Конечно, это приведет к медленному сканированию, но в зависимости от того, насколько вам нужен обработанный DOM, это может стоить ожидания.
Ссылка: http://snipplr.com/view/66998/
источник
selenium=3.3.1
иpython=2.7.10
, ошибка при импорте селена из селенаfrom selenium import webdriver
илиchromedriver
или что вы используете. Docs EDIT: Добавление справочной документации и изменить свою ужасную грамматику!Другим решением может быть реализация обработчика загрузки или промежуточного программного обеспечения обработчика загрузки. (см. документацию Scrapy для получения дополнительной информации о промежуточном программном обеспечении загрузчика). Ниже приведен пример класса, использующего селен с веб-драйвером phantomjs без головы:
1) Определите класс в
middlewares.py
скрипте.2) Добавить
JsDownload()
класс к переменнойDOWNLOADER_MIDDLEWARE
внутриsettings.py
:3) Интеграция
HTMLResponse
внутриyour_spider.py
. Расшифровка тела ответа даст вам желаемый результат.Необязательное дополнение:
я хотел сообщить различным паукам, какое промежуточное программное обеспечение использовать, поэтому я реализовал эту оболочку:
для работы оболочки все пауки должны иметь как минимум:
включить промежуточное ПО:
Преимущество:
Основное преимущество такой реализации, а не паука, состоит в том, что вы в конечном итоге делаете только один запрос. Например, в решении AT: обработчик загрузки обрабатывает запрос, а затем передает ответ пауку. Затем паук делает новый запрос в функции parse_page - это два запроса на один и тот же контент.
источник
process_requests
,if spider.name in ['spider1', 'spider2']
чтобы просто использовать вместо декоратораЯ использовал пользовательское промежуточное ПО для загрузчика, но мне это не очень понравилось, так как мне не удалось заставить кеш работать с ним.
Лучшим подходом было реализовать пользовательский обработчик загрузки.
Существует рабочий пример здесь . Это выглядит так:
Предположим, ваш скребок называется «скребок». Если вы поместите упомянутый код в файл с именем handlers.py в корне папки «scraper», то вы можете добавить его в файл settings.py:
И вуаля, JS анализировал DOM с кэш-памятью, повторными попытками и т. Д.
источник
Интересно, почему никто не опубликовал решение, используя только Scrapy.
Проверьте сообщение в блоге от команды Scrapy СКРЕПКА БЕСКОНЕЧНЫХ СТРАНИЦ . Пример записок http://spidyquotes.herokuapp.com/scroll сайт котором используется бесконечная прокрутка.
Идея состоит в том, чтобы использовать Developer Tools вашего браузера и замечать запросы AJAX, а затем на основе этой информации создавать запросы для Scrapy .
источник
да, Scrapy может удалять динамические веб-сайты, веб-сайты, которые отображаются с помощью javaScript.
Существует два подхода к поиску подобных веб-сайтов.
Первый,
Вы можете использовать
splash
для рендеринга кода Javascript, а затем проанализировать визуализированный HTML. вы можете найти документ и проект здесь Scrapy splash, gitВо-вторых,
Как утверждают все, отслеживая
network calls
, да, вы можете найти вызов API, который извлекает данные, и имитация вызова в вашем пауке-скрапе может помочь вам получить нужные данные.источник
Я обрабатываю запрос ajax с помощью Selenium и веб-драйвера Firefox. Это не так быстро, если вам нужен сканер как демон, но намного лучше, чем любое ручное решение. Я написал короткий учебник здесь для справки
источник