Фреймворк Scrapy Crawer, вводный кейс (очень подробный) «Рекомендуемая коллекция»
Фреймворк Scrapy Crawer, вводный кейс (очень подробный) «Рекомендуемая коллекция»

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

Оглавление

1. Обзор

2. Пять основных компонентов Scrapy:

3. Общая схема архитектуры

4. Scrapy установка и генерация проекта

5. Уровень журнала и хранилище журналов.

6. Экспорт в формат json или scv.

7. Полное дело


1. Обзор

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

Первоначально он был разработан для парсинга страниц (точнее, парсинга веб-страниц), но серверная часть также используется для получения данных, возвращаемых API-интерфейсами (такими как Amazon Associates Web Services) или обычными веб-сканерами.

Привлекательность Scrapy заключается в том, что это структура, которую каждый может легко изменить в соответствии со своими потребностями. Он также предоставляет базовые классы для различных типов сканеров, таких как BaseSpider, сканеры карты сайта и т. д. Последняя версия также обеспечивает поддержку сканеров web2.0.

2. Пять основных компонентов Scrapy:

Фреймворк Scrapy в основном состоит из пяти основных компонентов: Scheduler, Downloader, Spider, Item Pipeline и Scrapy Engine. Ниже мы представим функции каждого компонента соответственно.

(1), Планировщик:

Грубо говоря, планировщик представляет собой приоритетную очередь URL-адресов (адресов веб-сайтов или ссылок для сканирования). Он определяет следующий URL-адрес, который необходимо сканировать, и удаляет повторяющиеся URL-адреса (не выполняя при этом бесполезную работу). Пользователи могут настроить планировщик в соответствии со своими потребностями.

(2), Загрузчик:

Загрузчик – самый обременительный из всех компонентов. Он используется для загрузки ресурсов в сети на высокой скорости. Код загрузчика Scrapy не слишком сложен, но очень эффективен. Основная причина в том, что загрузчик Scrapy построен на эффективной асинхронной модели (фактически, вся платформа построена на этой модели).

(3), Паук:

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

(4).

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

(5), Scrapy Engine:

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

3. Общая схема архитектуры

Этот рисунок иллюстрирует последовательность действий, которая происходит при выполнении всей программы.

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

Схема архитектуры официального сайта

4. Scrapy установка и генерация проекта

Создайте новый проект со следующей структурой:

Формат выполнения команды для Windows и Ubuntu одинаков:

Способ загрузки

Ubuntu, откройте терминал и введите pip install Scrapy (или pip3 install Scrapy)

Вдовы, откройте cmd и введите pip install Scrapy, при условии, что у вас установлен pip.

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

название проекта Scrapy StartProject Scrapy genspider имя сканера доменное имя имя сканера Scrapy Crowl

Я использую версию для Windows. Вот пример создания проекта.

Открыть cmd,входить(По умолчанию находится вC:\Users\Administrator>этот Оглавление Вниз,Вы можете переключиться самостоятельно)

scrapy startproject myfirstPj cd my firstPj scrapy genspider baidu www.baidu.com

После создания примерная страница Оглавления выглядит следующим образом

|-ProjectName #Папка проекта

|-ProjectName #проект Оглавление

|-items.py #Определить структуру данных

|-middlewares.py #Промежуточное ПО

|-pipelines.py #Обработка данных

|-settings.py #Глобальная конфигурация

|-spiders

|-__init__.py #файл сканера

|-baidu.py

|-scrapy.cfg #Базовый файл конфигурации проекта

baidu.py под пауками автоматически генерируется для нас Scrapy

Давайте еще раз взглянем на файл конфигурации проекта spdier и откроем файл settings.py.

BOT_NAME: название проекта

USER_AGENT: по умолчанию это комментарий. Это очень важно. Если вы его не напишете, его легко можно будет принять за компьютер. Просто щелкните и очистите Mozilla/5.0.

ROBOTSTXT_OBEY: следует ли следовать протоколу робота, значение по умолчанию — true, его необходимо изменить на false, иначе многие вещи невозможно будет просканировать.

CONCURRENT_REQUESTS: максимальное количество параллелизма, которое легко понять, означает, сколько потоков сканера разрешено открывать одновременно.

DOWNLOAD_DELAY: время задержки загрузки, единица измерения — секунды, контролирует частоту сканирования, настраивайте в соответствии с вашим проектом, не слишком быстро и не слишком медленно, по умолчанию — 3 секунды, то есть сканирование остановится на 3 секунды, установите значение 1 секунда более рентабельно: если нужно сканировать много файлов, просто пишите в течение нескольких десятых секунды.

COOKIES_ENABLED: сохранять ли файлы cookie. По умолчанию файлы COKIES могут записываться при включении компьютера.

DEFAULT_REQUEST_HEADERS: заголовок запроса по умолчанию с записанным в нем USER_AGENT. Фактически, этот параметр помещается в заголовок запроса. Этот параметр можно настроить в соответствии с контентом, который вы сканируете.

ITEM_PIPELINES: конвейер проекта, приоритет 300, чем ниже приоритет, тем выше приоритет сканирования.

Например, я написал в Pipelines.py два конвейера: один для сканирования веб-страниц и один для хранения баз данных. Я настроил их приоритеты. Если есть данные сканера, операция хранения будет выполняться первой.

ITEM_PIPELINES = { 'scrapyP1.pipelines.BaiduPipeline': 300, 'scrapyP1.pipelines.BaiduMysqlPipeline': 200, }

Здесь мы пытаемся использовать Scrapy для сканирования, открываем baidu.py под Spider.py (зависит от имени сканера, которое вы ввели при Scrapy genspider, имя сканера, имя домена)

Введите код, и мы воспользуемся XPath, чтобы извлечь заголовок домашней страницы Baidu.

Язык кода:javascript
копировать
import scrapy


class BaiduSpider(scrapy.Spider):
    name = 'baidu'
    allowed_domains = ['www.baidu.com']
    start_urls = ['http://www.baidu.com/']

    def parse(self, response):
        tile=response.xpath('//html/head/title/text()')
        print(tile)

Откройте cmd терминала и введите Scrapy Craw Baidu (имя сканера), и вы увидите много выходной информации, включая нужный нам контент.

Запускать с помощью терминала слишком затруднительно, и данные не могут быть извлечены. Мы пишем файл запуска, так как необходимо записать Splite для преобразования строки в форму списка. второй параметр — сканирование, третий — Baidu.

Язык кода:javascript
копировать
from scrapy import cmdline

cmdline.execute('scrapy crawl baidu'.split())

Возможен вывод в редакторе

5. Уровень журнала и хранилище журналов.

В файле settings.py вы можете установить уровень журнала и путь хранения журнала.

связанные переменные

LOG_LEVEL= “”

LOG_FILE="Имя журнала.log"

Уровни журналов делятся на

1.DEBUG отладочная информация

2. ИНФО, общая информация

3. ПРЕДУПРЕЖДЕНИЕ!

4.ОШИБКА Общая ошибка

5.КРИТИЧЕСКАЯ серьезная ошибка

Если установлено

LOG_LEVEL="ПРЕДУПРЕЖДЕНИЕ", только ОШИБКИ и КРИТИЧЕСКИЕ ниже уровня ПРЕДУПРЕЖДЕНИЯ

Уровень по умолчанию – 1.

6. Экспорт в формат json или scv.

Просто добавьте параметр -o при выполнении файла искателя.

имя проекта Scrapy Craw -o *.csv

имя проекта Scrapy Craw -o *.json

Для файла json добавьте его в файл settings.js и установите формат кодировки, иначе он будет искажен:

FEED_EXPORT_ENCODING=’utf-8′

Пример:

Язык кода:javascript
копировать
from scrapy import cmdline

cmdline.execute('scrapy crawl baidu -o baidu.csv'.split())

Семь、полныйСлучай

Наша тема для этого проекта — сканирование информации о фильмах из Tencent Video, включая названия и описания фильмов.

1.Создать проект

Откройте терминал и введите (рекомендуется поместить его в соответствующий путь, по умолчанию — диск C)

scrapy startproject TXmovies cd TXmovies scrapy genspider txms v.qq.com

2. Изменить настройки

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

ROBOTSTXT_OBEY = False DOWNLOAD_DELAY = 1 DEFAULT_REQUEST_HEADERS = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en', 'User-Agent':'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36' } ITEM_PIPELINES = { 'TXmovies.pipelines.TxmoviesPipeline': 300, }

3. Подтвердите данные для извлечения, пункт

Элемент определяет содержимое, которое вы хотите извлечь (определите структуру данных). Например, я извлек содержимое — это название и описание фильма, поэтому я создал две переменные. Фактический метод метода Field состоит в том, чтобы создать словарь, добавить в словарь конструктор, пока не присваивать значение и ждать извлечения данных перед присвоением значения. Структура следующего элемента может быть выражена как: {’name’:»,’description’:”}.

Язык кода:javascript
копировать
# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html

import scrapy


class TxmoviesItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    name = scrapy.Field()
    description = scrapy.Field()

4. Напишите программу-сканер

Часть, которую мы хотим написать, — это содержимое метода синтаксического анализа.,Основное внимание уделяется тому, как писать xpath,Я не буду много говорить о xpath,Если вам интересно, вы можете прочитать другую мою статью.,Учебное пособие по XPATH

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

Давайте вкратце поговорим об идее этого фрагмента кода.,Прежде всего, Tencent Videourlдляhttps://v.qq.com/x/bu/pagesheet/list?append=1&channel=cartoon&iarea=1&listpage=2&offset=0&pagesize=30

Мы заметили, что элемент смещения: смещение первой страницы равно 0, смещение второй страницы — 30 и так далее. Этот пункт в программе используется для управления захватом первой страницы, но ему также необходимо задать диапазон. Он не может быть бесконечным, иначе будет выдано сообщение об ошибке. Вы можете проверить, сколько всего страниц видео у Tencent. или вы можете написать механизм перехвата исключений. Выход, если обнаружена ошибка запроса. Я здесь просто демонстрирую, поэтому дал только 120, то есть 4 страницы.

yield

В программе есть два выхода. Я предпочитаю называть их прерываниями. Конечно, прерывания происходят только в процессоре. Его функция — передача управления. В этой программе после инкапсуляции данных в элементе мы вызываем метод return для передачи. управление к пункту Pipe, после обработки трубы возвращаемся и возвращаемся в программу. Это объяснение первого урожая.

Второй выход немного сложнее. Эта программа использует механизм обратного вызова, то есть обратный вызов. Объектом обратного вызова является текущий метод. При непрерывных обратных вызовах программа попадает в цикл. добавляются в программу, она попадет в бесконечный цикл. Если я удалю if в этой программе, это будет бесконечный цикл.

yield scrapy.Request(url=url,callback=self.parse)

xpath

Еще следует отметить, как извлечь данные в xpathl. Существует четыре способа записи. Первый способ записи — получить селектор, который является исходными данными, и в нем есть некоторые вещи, которые мы не можем использовать. Второй экстракт() преобразует порядковый номер селектора в строку. Третий вариант аналогичен четвертому: он получает первые данные в строке, а именно те данные, которые нам нужны.

items[‘name’]=i.xpath(‘./a/@title’)[0]

items[‘name’]=i.xpath(‘./a/@title’).extract()

items[‘name’]=i.xpath(‘./a/@title’).extract_first()

items[‘name’]=i.xpath(‘./a/@title’).get()

Язык кода:javascript
копировать
# -*- coding: utf-8 -*-
import scrapy
from ..items import TxmoviesItem

class TxmsSpider(scrapy.Spider):
    name = 'txms'
    allowed_domains = ['v.qq.com']
    start_urls = ['https://v.qq.com/x/bu/pagesheet/list?append=1&channel=cartoon&iarea=1&listpage=2&offset=0&pagesize=30']
    offset=0

    def parse(self, response):
        items=TxmoviesItem()
        lists=response.xpath('//div[@class="list_item"]')
        for i in lists:
            items['name']=i.xpath('./a/@title').get()
            items['description']=i.xpath('./div/div/@title').get()

            yield items

        if self.offset < 120:
            self.offset += 30
            url = 'https://v.qq.com/x/bu/pagesheet/list?append=1&channel=cartoon&iarea=1&listpage=2&offset={}&pagesize=30'.format(
                str(self.offset))

            yield scrapy.Request(url=url,callback=self.parse)

5. Выдать на выход конвейера

Конвейеры могут обрабатывать извлеченные данные, например сохранять их в базе данных. Мы выводим только здесь.

Язык кода:javascript
копировать
# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html


class TxmoviesPipeline(object):
    def process_item(self, item, spider):
        print(item)
        return item

6.запустить, выполнить проект

Язык кода:javascript
копировать
from scrapy import cmdline

cmdline.execute('scrapy crawl txms'.split())

7.Результаты испытаний

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

8. Сортировка процесса

Создать новый проект-"Войти в проект-"Создать новый файл искателя-"Очистить просканированный контент, написать элемент-"Написать программу-сканер, просканировать данные-"Оставить это конвейеру для обработки данных-"Настроить глобальная настройка конфигурации - «Выполнить программу-обходчик», можно написать программу запуска через терминал или в программе

9. Ускорение: многопоточное сканирование

Если реализовать описанный выше эксперимент, нетрудно обнаружить, что скорость сканирования очень низкая. Основная причина в том, что оно выполняется последовательно. Из результатов видно, что содержимое предыдущей страницы всегда выводится, а затем. выводится содержимое предыдущей страницы. Следующее содержимое. Он не подходит для обработки больших объемов данных. Хороший способ — использовать многопоточность. Здесь многопоточность не реализуется путем создания объекта Thread. метод сразу передается планировщику.

Реализуем нашу идею, переписав метод start_requests (исходный код этого метода находится ниже __init__.py, если интересно, можете посмотреть)

Язык кода:javascript
копировать
# -*- coding: utf-8 -*-
import scrapy
from ..items import TxmoviesItem

class TxmsSpider(scrapy.Spider):
    name = 'txms'
    allowed_domains = ['v.qq.com']
    url='https://v.qq.com/x/bu/pagesheet/list?append=1&channel=cartoon&iarea=1&listpage=2&offset={}&pagesize=30'
    offset=0

    def start_requests(self):
        for i in range(0,121,30):
            url=self.url.format(i)
            yield scrapy.Request(
                url=url,
                callback=self.parse
            )

    def parse(self, response):
        items=TxmoviesItem()
        lists=response.xpath('//div[@class="list_item"]')
        for i in lists:
            items['name']=i.xpath('./a/@title').get()
            items['description']=i.xpath('./div/div/@title').get()

            yield items

Издатель: Лидер стека программистов полного стека, укажите источник для перепечатки: https://javaforall.cn/153105.html Исходная ссылка: https://javaforall.cn

boy illustration
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода