Где сканировать фактический проект pyspider

искусственный интеллект рептилия CSS pyspider

Чтение текста занимает около 13 минут.

После введения в предыдущую статью у вас должно быть определенное представление о pyspider. Если вам все еще не ясно, вы можете просмотреть предыдущую статью еще раз"pyspider для эффективного краулера". Убедитесь, что у вас есть общее представление о pysdpier, чтобы эффективность вашего обучения была высокой.
Теперь мы используем практический проект, чтобы еще больше освоить использование фреймворка pyspider. Целью сканирования этого проекта является «Qunar.com». Я хочу сохранить автора, название, дату отправления, стоимость на душу населения и текст всех руководств и сохранить их в MongoDB.

1 Подготовка

Убедитесь, что у вас установлены pyspider и PhantomJS, установлена ​​MongoDB и запущена служба, а также необходимо установить библиотеку PyMongo. Эти учебники имеют подробную информацию в Интернете, вы можете поискать самостоятельно.

2 Запустить паук

Выполните следующую команду, чтобы запустить pyspider:

pyspider all

текущий результат:

Это запускает все компоненты pyspider, включая PhantomJS, ResultWorker, Processer, Fetcher, Scheduler, WebUI, которые являются необходимыми компонентами для запуска pysipder. Последняя строка вывода WebUI работает на порту 5000. Мы можем открыть браузер, ввести ссылку http://localhost:5000, и мы увидим страницу.

Эта страница представляет собой веб-интерфейс pyspider, мы можем использовать его для управления проектами, написания кода, отладки в Интернете, мониторинга задач и т. д.

3 Создать проект

Создайте новый проект, нажмите кнопку «Создать» справа, введите имя проекта и ссылку для сканирования во всплывающем окне, а затем нажмите кнопку «Создать», чтобы проект был успешно создан.

Далее вы увидите страницу редактирования и отладки проекта pyspider.

Слева находится страница отладки кода. Нажмите «Выполнить» в правом верхнем углу слева, чтобы пройти через сканер. Вы можете просмотреть текущую страницу сканирования в нижней части слева. Справа находится страница редактирования кода, мы можем редактировать код и сохранять код напрямую, не прибегая к IDE.
Обратите внимание, что pyspider уже сгенерировал для нас фрагмент кода. Код выглядит следующим образом:

from pyspider.libs.base_handler import *


class Handler(BaseHandler):
    crawl_config = {
    }

    @every(minutes=24 * 60)
    def on_start(self):
        self.crawl('http://travel.qunar.com/travelbook/list.htm', callback=self.index_page)

    @config(age=10 * 24 * 60 * 60)
    def index_page(self, response):
        for each in response.doc('a[href^="http"]').items():
            self.crawl(each.attr.href, callback=self.detail_page)

    @config(priority=2)
    def detail_page(self, response):
        return {
            "url": response.url,
            "title": response.doc('title').text(),
        }

Здесь Handler — это основной класс сканера pyspider, в котором мы можем определить логику сканирования, анализа и хранения. Для выполнения функции всего поискового робота требуется только один обработчик.

Далее мы видим свойство crawl_config. Здесь мы можем единообразно определить все конфигурации сканирования этого проекта, такие как определение заголовков, настройка прокси и т. д. После настройки она вступит в силу глобально.

Затем метод on_start() является записью сканирования. Здесь будет сгенерирован первоначальный запрос на сканирование. Этот метод может создать новый запрос на сканирование, вызвав метод обхода(). Первым параметром является URL-адрес сканирования, который здесь автоматически заменяется. . в URL-адрес, который мы определили. В методе crawl() также есть обратный вызов, который указывает, какой метод использовать для разбора после успешного обхода страницы, в коде указывается метод index_page(), то есть, если страница, соответствующая этому URL, успешно просканирована, будет передан методу index_page().

Метод index_page() просто получает этот параметр Response, а Response состыковывается с pyquery. Мы напрямую вызываем метод doc() и передаем соответствующий селектор CSS, и мы можем анализировать эту страницу, как pyquery. По умолчанию в коде используется a[href^="http"], что означает, что этот метод анализирует все ссылки Затем перейдите по ссылке, снова вызовите метод crawl(), чтобы сгенерировать новый запрос на сканирование, и укажите обратный вызов как detail_page, что означает, что метод detail_page() вызывается для анализа этих страниц, если они успешно просканированы. Здесь index_page() реализует две функции: одна предназначена для анализа результатов сканирования, а другая — для создания нового запроса на сканирование.

detail_page() также принимает Response в качестве параметра. detail_page() захватывает информацию страницы сведений, поэтому новый запрос не будет сгенерирован, будет проанализирован только объект Response, а результат будет возвращен в виде словаря после синтаксического анализа. Конечно, мы также можем выполнить последующую обработку, например, сохранить результаты в базу данных.

Далее перепишем код для реализации обхода стратегии.

4 Сканировать домашнюю страницу

Нажмите кнопку запуска в правом верхнем углу левого столбца, и вы увидите метку, следующую за следующей внизу страницы, которая содержит число 1, что означает, что создается новый запрос на сканирование.

Статья конфигурации текущего запуска появится в верхнем левом углу левого столбца.Существует обратный вызов, называемый on_start, что означает, что метод on_start() фактически выполняется после нажатия кнопки «Выполнить». В методе on_start() мы используем метод обхода() для создания запроса на сканирование, и номер 1 в следующем разделе ниже представляет этот запрос на сканирование.

Нажмите кнопку «Подписаться» ниже, чтобы увидеть ссылку на сгенерированный запрос на сканирование. Также справа от каждой ссылки есть кнопка со стрелкой.

Нажмите на стрелку, мы можем просканировать эту ссылку, то есть содержимое домашней страницы руководства по обходу.

Обратный вызов выше стал index_page, что означает, что метод index_page() в настоящее время выполняется. Параметр ответа, полученный функцией index_page(), представляет собой объект Response первого только что сгенерированного запроса сканирования. Метод index_page() вызывает метод doc(), передает селектор CSS, который извлекает все узлы a, а затем получает атрибут href узлов a, который фактически получает все ссылки на первой просканированной странице. Затем в методе index_page() просматриваются все ссылки, одновременно вызывается метод обхода(), и ссылки создаются в новых запросах обхода. Таким образом, в нижней части кнопки «Подписаться» есть цифра 231, что означает, что был сгенерирован 231 новый запрос на сканирование, и все URL-адреса этих запросов отображаются на текущей странице.

Затем нажмите веб-кнопку ниже, чтобы просмотреть страницу текущего результата сканирования.

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

Нажмите кнопку html, чтобы просмотреть исходный код текущей страницы.

Мы только что извлекли все ссылки и сгенерировали новый запрос на сканирование в методе index_page(). Но, очевидно, не все ссылки нужно сканировать, достаточно только ссылки на страницу с деталями стратегии, поэтому нам нужно изменить селектор CSS при извлечении ссылок в текущей index_page().

Выберите область, которую нужно изменить, в коде справа, щелкните стрелку вправо в левом столбце, и селектор CSS заголовка, который отображается выше, будет заменен в коде справа.

На этом замена селекторов CSS успешно завершается, что очень удобно.
Повторно щелкните кнопку запуска в правом верхнем углу левого столбца, чтобы повторно выполнить метод index_page(). В это время количество подписок становится равным 10, что означает, что теперь мы извлекаем только 10 стратегий текущей страницы.

То, что мы сканируем сейчас, — это только содержимое первой страницы, и нам также нужно сканировать последующие страницы, поэтому нам также нужна ссылка для сканирования, то есть сканирование страницы списка стратегий следующей страницы. Затем мы используем метод обхода(), чтобы добавить запрос обхода следующей страницы, добавляем следующий код в метод index_page(), а затем нажимаем сохранить() для сохранения.

next = response.doc('.next').attr.href
self.crawl(next, callback=self.index_page)

Используйте селектор CSS, чтобы выбрать ссылку на следующей странице, получить ее атрибут href и получить URL-адрес страницы. Затем передайте URL-адрес методу обхода() и укажите функцию обратного вызова.Обратите внимание, что функция обратного вызова по-прежнему указана как метод index_page(), поскольку структура следующей страницы такая же, как у этой страницы.

Нажмите кнопку запуска еще раз, и вы увидите 11 запросов на сканирование. Кнопка «Подписки» будет отображать 11, что означает, что мы успешно добавили запрос на сканирование для следующей страницы.

Теперь мы закончили синтаксический анализ страницы со списком индексов.

5 Просканируйте страницу сведений

Выберите любую страницу сведений для входа, щелкните стрелку вправо любого из первых 10 запросов сканирования и выполните сканирование страницы сведений.

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

Глядя на исходный код, мы не видим узел img.

Причина такого явления в том, что pyspider по умолчанию отправляет HTTP-запросы, а сам запрошенный HTML-документ не содержит узлов img. Но в браузере мы видим картинку, это потому что эта картинка появилась позже через JavaScript. Итак, как нам это получить?

К счастью, pyspider внутренне подключен к PhatomJS, поэтому нам нужно изменить только один параметр.

Мы добавляем параметр fetch_type в метод запроса для создания страницы сведений о выборке в index_page(), и переписанный index_page() становится следующим:

def index_page(self, response):
        for each in response.doc('li > .tit > a').items():
            self.crawl(each.attr.href, callback=self.detail_page, fetch_type='js')
        next = response.doc('.next').attr.href
        self.crawl(next, callback=self.index_page)

Далее, давайте попробуем эффект захвата.

Щелкните стрелку влево в верхней части левого столбца, чтобы вернуться, и снова вызовите метод index_page(), чтобы сгенерировать новый запрос на сканирование страницы сведений.

Затем нажмите кнопку сканирования Запросить вновь созданную страницу сведений, и тогда мы увидим, что страница стала такой.

Изображение успешно визуализируется, как это выглядит с включенным PhantomJS. Просто добавьте параметр fetch_type, что очень удобно.
Последним шагом является извлечение и обработка информации, необходимой на странице сведений. Окончательный метод detail_page() переписан следующим образом:

  def detail_page(self, response):
        return {
            "url": response.url,
            "title": response.doc('#booktitle').text(),
            "date": response.doc('.when .data').text(),
            "day": response.doc('.howlong .data').text(),
            "who": response.doc('.who .data').text(),
            "text": response.doc('#b_panel_schedule').text(),
            "image": response.doc('.cover_img').attr.src,
        }

Мы извлекли ссылку, заголовок, дату поездки, количество дней, символы, текст стратегии и информацию заголовка страницы соответственно и встроили эту информацию в словарь.
Повторно запустив, вы можете найти результаты вывода.

Окончательная информация о построенном словаре выводится в левом столбце, что является результатом руководства.

6 Запустите сканер

Вернитесь на главную страницу сканера, установите статус сканера на DEBUG или RUNNING и нажмите кнопку «Выполнить» справа, чтобы начать сканирование.

В крайнем левом углу мы можем определить группировку элементов для удобного управления. rate/burst представляет текущую скорость сканирования. Скорость показывает, сколько запросов выдается за 1 секунду. Всплеск эквивалентен количеству токенов в алгоритме корзины маркеров в управлении потоком. Чем выше параметры скорости и всплеска, тем быстрее будет скорость сканирования. Конечно, скорость должна учитывать локальную производительность и сканирование. Вскоре будет заблокирована. 5m, 1h и 1d в процессе относятся к запросам за последние 5 минут, 1 час и 1 день, а all представляет все запросы. Запросы представлены разными цветами: синим цветом обозначены запросы, ожидающие выполнения, зеленым — успешные запросы, желтым — запросы, ожидающие повторной попытки после сбоя запроса, а красным — запросы, которые слишком много раз терпели неудачу и игнорируются. и запросить статус сканирования.

Щелкните Активные задачи, чтобы просмотреть сведения о последних запросах.

Щелкните Результат, чтобы просмотреть все результаты сканирования.

Нажмите кнопку в правом верхнем углу, чтобы получить данные в формате JSON, CSV.

Эта статья была впервые опубликована в общедоступном аккаунте «Chihai», где каждый день делились галантереей питона и отвечали на «1024», как вы знаете.