4.Scrapy
Введение:
Scrapy также является структурой сканера и является структурой приложения, написанной для захвата данных веб-страницы и извлечения структурных данных.Среда инкапсулирована, включая запрос (асинхронное планирование и обработка), загрузчик (многопоточный загрузчик), селектор синтаксического анализа (селектор) и скрученный (асинхронная обработка) и др. Для сканирования содержимого веб-сайта его скорость очень высока.
Установите фреймворк scrapy:
- Установить
scrapy
:пройти черезpip install scrapy
установить. - Если вы находитесь под Windows, вам также необходимо установить
pypiwin32
, если он не установлен, будет сообщено об ошибке при запуске проекта scrapy в будущем. Способ установки:pip install pypiwin32
. - Если он под ubuntu, то также необходимо установить некоторые сторонние библиотеки:
sudo apt-get install python-dev python-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev
.
Создайте проект и сканер:
- Создать проект:
scrapy startproject [爬虫的名字]
. - Создайте сканер: введите путь, по которому находится проект, и выполните команду:
scrapy genspider [爬虫名字] [爬虫的域名]
. Обратите внимание, что имя искателя не может совпадать с именем проекта.
Структура каталога проекта:
- items.py: модель, используемая для хранения данных, просканированных сканером.
- middlewares.py: файл, используемый для хранения различного промежуточного программного обеспечения.
- конвейеры.py: используется для хранения моделей элементов на локальном диске.
- settings.py: некоторая информация о конфигурации этого поискового робота (например, заголовки запросов, как часто отправлять запросы, пул IP-прокси и т. д.).
- scrapy.cfg: конфигурационный файл проекта.
- пакет spiders: все сканеры в будущем будут храниться в нем.
Смущающая энциклопедия Scrapy отмечает:
-
ответ представляет собой
scrapy.http.response.html.HtmlResponse
объект. может быть выполненxpath
иcss
синтаксис для извлечения данных. -
Извлеченные данные представляют собой
Selector
илиSelectorList
объект. Если вы хотите получить строку в нем. тогда это должно быть выполненоgetall
илиget
метод. -
метод getall: получить
Selector
Весь текст в . Что возвращается, так это список. -
метод получения: получить
Selector
первый текст в . Возврат является типом str. -
Если данные анализируются обратно, они должны быть переданы в конвейер для обработки. тогда вы можете использовать
yield
возвращаться. Или собрать все предметы. Наконец, используйте return для возврата. -
пункт: предложено в
items.py
Определить модель в . Не используйте словари в будущем. -
конвейер: специально используется для сохранения данных. Часто используются три из этих методов.
-
open_spider(self,spider)
: Выполняется при открытии сканера. -
process_item(self,item,spider)
: он будет вызываться, когда краулер передаст элемент. -
close_spider(self,spider)
: будет вызываться при закрытии сканера. Чтобы активировать пипллин, он должен быть вsettings.py
в, наборITEM_PIPELINES
. Пример выглядит следующим образом:
ITEM_PIPELINES = { 'qsbk.pipelines.QsbkPipeline': 300, }
-
JsonItemExporter и JsonLinesItemExporter:
При сохранении данных json вы можете использовать эти два класса, чтобы упростить операцию.
-
JsonItemExporter
: Это для добавления данных в память каждый раз. Наконец, он равномерно записывается на диск. Хорошо, что сохраненные данные — это данные, удовлетворяющие правилам json. Недостатком является то, что если объем данных относительно велик, он будет потреблять больше памяти. Пример кода выглядит следующим образом:from scrapy.exporters import JsonItemExporter class QsbkPipeline(object): def __init__(self): self.fp = open("duanzi.json",'wb') self.exporter = JsonItemExporter(self.fp,ensure_ascii=False,encoding='utf-8') self.exporter.start_exporting() def open_spider(self,spider): print('爬虫开始了...') def process_item(self, item, spider): self.exporter.export_item(item) return item def close_spider(self,spider): self.exporter.finish_exporting() self.fp.close() print('爬虫结束了...')
-
JsonLinesItemExporter
: это каждый звонокexport_item
сохранить этот элемент на жесткий диск. Минус в том, что каждый словарь — это строка, а весь файл — это не файл, удовлетворяющий формату json. Преимущество заключается в том, что каждый раз, когда данные обрабатываются, они сохраняются непосредственно на жестком диске, который не потребляет памяти, и данные относительно безопасны. Пример кода выглядит следующим образом:from scrapy.exporters import JsonLinesItemExporter class QsbkPipeline(object): def __init__(self): self.fp = open("duanzi.json",'wb') self.exporter = JsonLinesItemExporter(self.fp,ensure_ascii=False,encoding='utf-8') def open_spider(self,spider): print('爬虫开始了...') def process_item(self, item, spider): self.exporter.export_item(item) return item def close_spider(self,spider): self.fp.close() print('爬虫结束了...')
CrawlSpider:
Нужно использоватьLinkExtractor
иRule
. Эти две вещи определяют конкретное направление рептилии.
- Метод разрешения установки правил: чтобы иметь возможность ограничить URL-адрес, который мы хотим. Не создавайте то же регулярное выражение, что и другие URL-адреса.
- Когда использовать отслеживание: если вам нужно следить за URL-адресом, который соответствует текущим условиям при сканировании страницы, установите для него значение True. В противном случае установите Fasle.
- При каких обстоятельствах следует указать обратный вызов: Если страница, соответствующая этому URL-адресу, предназначена только для получения дополнительных URL-адресов и не нуждается в данных, содержащихся в ней, то обратный вызов не может быть указан. Если вы хотите получить данные на странице, соответствующей URL-адресу, вам необходимо указать обратный вызов.
Скребковая оболочка:
- Нам удобно сделать тестовый код извлечения данных.
- Если вы хотите выполнить команду scrapy, нет сомнений, что вы должны сначала войти в среду, в которой находится scrapy.
- Если вы хотите прочитать информацию о конфигурации проекта, вы должны сначала войти в проект. повторно выполнить
scrapy shell
Заказ.
Имитация входа в Renren.com:
- Если вы хотите отправить почтовый запрос, рекомендуется использовать
scrapy.FormRequest
метод. Данные формы могут быть легко указаны. - Если вы хотите отправлять почтовые запросы в начале краулера, вам следует переписать
start_requests
метод. В этом методе отправьте почтовый запрос.
\