Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.
Оглавление
2. Пять основных компонентов Scrapy:
4. Scrapy установка и генерация проекта
5. Уровень журнала и хранилище журналов.
6. Экспорт в формат json или scv.
Scrapy, быстрая высокоуровневая платформа для очистки экрана и веб-страниц, разработанная на Python, используется для очистки веб-сайтов и извлечения структурированных данных со страниц. Scrapy широко используется и может использоваться для интеллектуального анализа данных, мониторинга и автоматического тестирования.
Первоначально он был разработан для парсинга страниц (точнее, парсинга веб-страниц), но серверная часть также используется для получения данных, возвращаемых API-интерфейсами (такими как Amazon Associates Web Services) или обычными веб-сканерами.
Привлекательность Scrapy заключается в том, что это структура, которую каждый может легко изменить в соответствии со своими потребностями. Он также предоставляет базовые классы для различных типов сканеров, таких как BaseSpider, сканеры карты сайта и т. д. Последняя версия также обеспечивает поддержку сканеров web2.0.
Фреймворк Scrapy в основном состоит из пяти основных компонентов: Scheduler, Downloader, Spider, Item Pipeline и Scrapy Engine. Ниже мы представим функции каждого компонента соответственно.
(1), Планировщик:
Грубо говоря, планировщик представляет собой приоритетную очередь URL-адресов (адресов веб-сайтов или ссылок для сканирования). Он определяет следующий URL-адрес, который необходимо сканировать, и удаляет повторяющиеся URL-адреса (не выполняя при этом бесполезную работу). Пользователи могут настроить планировщик в соответствии со своими потребностями.
(2), Загрузчик:
Загрузчик – самый обременительный из всех компонентов. Он используется для загрузки ресурсов в сети на высокой скорости. Код загрузчика Scrapy не слишком сложен, но очень эффективен. Основная причина в том, что загрузчик Scrapy построен на эффективной асинхронной модели (фактически, вся платформа построена на этой модели).
(3), Паук:
Краулеры — это та часть, которая волнует пользователей больше всего. Пользователи настраивают свои собственные сканеры (путем настройки регулярных выражений и другого синтаксиса) для извлечения необходимой им информации с определенных веб-страниц, которые представляют собой так называемые сущности (элементы). Пользователи также могут извлекать из него ссылки и позволить Scrapy продолжить сканирование следующей страницы.
(4).
Конвейер сущностей, используемый для обработки сущностей, извлеченных пауками. Основная функция — сохранение сущностей, проверка достоверности сущностей и удаление ненужной информации.
(5), Scrapy Engine:
Движок 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.
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.
from scrapy import cmdline
cmdline.execute('scrapy crawl baidu'.split())
Возможен вывод в редакторе
В файле settings.py вы можете установить уровень журнала и путь хранения журнала.
связанные переменные
LOG_LEVEL= “”
LOG_FILE="Имя журнала.log"
Уровни журналов делятся на
1.DEBUG отладочная информация
2. ИНФО, общая информация
3. ПРЕДУПРЕЖДЕНИЕ!
4.ОШИБКА Общая ошибка
5.КРИТИЧЕСКАЯ серьезная ошибка
Если установлено
LOG_LEVEL="ПРЕДУПРЕЖДЕНИЕ", только ОШИБКИ и КРИТИЧЕСКИЕ ниже уровня ПРЕДУПРЕЖДЕНИЯ
Уровень по умолчанию – 1.
Просто добавьте параметр -o при выполнении файла искателя.
имя проекта Scrapy Craw -o *.csv
имя проекта Scrapy Craw -o *.json
Для файла json добавьте его в файл settings.js и установите формат кодировки, иначе он будет искажен:
FEED_EXPORT_ENCODING=’utf-8′
Пример:
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’:”}.
# -*- 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()
# -*- 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. Выдать на выход конвейера
Конвейеры могут обрабатывать извлеченные данные, например сохранять их в базе данных. Мы выводим только здесь.
# -*- 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.запустить, выполнить проект
from scrapy import cmdline
cmdline.execute('scrapy crawl txms'.split())
7.Результаты испытаний
Результаты вывода канала отображаются белым цветом, а отладочная информация — красным.
8. Сортировка процесса
Создать новый проект-"Войти в проект-"Создать новый файл искателя-"Очистить просканированный контент, написать элемент-"Написать программу-сканер, просканировать данные-"Оставить это конвейеру для обработки данных-"Настроить глобальная настройка конфигурации - «Выполнить программу-обходчик», можно написать программу запуска через терминал или в программе
9. Ускорение: многопоточное сканирование
Если реализовать описанный выше эксперимент, нетрудно обнаружить, что скорость сканирования очень низкая. Основная причина в том, что оно выполняется последовательно. Из результатов видно, что содержимое предыдущей страницы всегда выводится, а затем. выводится содержимое предыдущей страницы. Следующее содержимое. Он не подходит для обработки больших объемов данных. Хороший способ — использовать многопоточность. Здесь многопоточность не реализуется путем создания объекта Thread. метод сразу передается планировщику.
Реализуем нашу идею, переписав метод start_requests (исходный код этого метода находится ниже __init__.py, если интересно, можете посмотреть)
# -*- 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