Рубрики
Без рубрики

Как запустить Scraphy Spider из сценария Python

SCRAPY – это каркас для строительства веб-скалы и включает в себя API, который можно использовать непосредственно из сценария Python. Рамка включает в себя множество компонентов и вариантов, которые управляют деталями запроса страниц с веб-сайтов и собирают и хранения желаемых данных. Типичный способ запуска SCRAPY – использовать … Как запустить Scrapy Spider из сценария Python Подробнее »

Автор оригинала: Mark Sausville.

SCRAPY – это каркас для строительства веб-скалы и включает в себя API, который можно использовать непосредственно из сценария Python. Рамка включает в себя множество компонентов и вариантов, которые управляют деталями запроса страниц с веб-сайтов и собирают и хранения желаемых данных.

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

Это минимальные соскобы паука http://quotes.toscrape.com Отказ Этот сайт специально для практики веб-соскоба.

Струпкие рамки

В обычном стипельном процессе мы начинаем с начала проекта с помощью Scrapy’s startproject команда.

(scrapy_new) saus@megux:~/scrapy_new/article$ cd projects
(scrapy_new) saus@megux:~/scrapy_new/article/projects$ scrapy startproject spiderdemo
New Scrapy project 'spiderdemo', using template directory '/home/saus/anaconda3/envs/scrapy_new/lib/python3.8/site-packages/scrapy/templates/project', created in:
    /home/saus/scrapy_new/article/projects/spiderdemo

You can start your first spider with:
    cd spiderdemo
    scrapy genspider example example.com

Это создаст следующую структуру в новом каталоге с тем же именем, что и проект.

.
└── spiderdemo
    ├── scrapy.cfg
    └── spiderdemo
        ├── __init__.py
        ├── items.py
        ├── middlewares.py
        ├── pipelines.py
        ├── settings.py
        └── spiders
            └── __init__.py

Затем вы будете использовать Scrapy’s Genspider Команда для создания шаблона паука для редактирования следующим образом:

...
(scrapy_new) saus@megux:~/scrapy_new/article/projects/spiderdemo$ scrapy genspider funny quotes.scrape.com
Created spider 'funny' using template 'basic' in module:
  Spiderdemo.spiders.funny

Это создает следующий код паука в каталоге пауков.

import scrapy

class FunnySpider(scrapy.Spider):
    name = 'funny'
    allowed_domains = ['quotes.scrape.com']
    start_urls = ['http://quotes.scrape.com/']

    def parse(self, response):
        pass

Это определяет класс Funnyspider который наследует от Scrapy.spider , базовый класс паука, предоставленный Scrapy API и устанавливает несколько важных Переменные экземпляра Отказ

Теперь мы редактируем паук, чтобы создать свое поведение. Вот отредактированный паук с объяснением изменений.

import scrapy

class FunnySpider(scrapy.Spider):
    name = 'funny'
    start_urls = ['http://quotes.toscrape.com/tag/humor/']

    def parse(self, response):
        for quote in response.css('div.quote'):
            yield {
                'author': quote.xpath('span/small/text()').get(),
                'text': quote.css('span.text::text').get(),
            }

        next_page = response.css('li.next a::attr("href")').get()
        if next_page is not None:
            yield response.follow(next_page, self.parse)

Модификации

  1. Я изменил первый элемент start_urls « » http://quotes.toscrape.com/tag/humor/ ‘. Это ограничивает паук, чтобы соскрести только цитаты, которые имеют тег «юмор», а не все цитаты.
  2. Я заполнил метод анализа. Именно здесь выполняется работа http с веб-страницы. Много происходит за кулисами здесь. Ниже приведен очередь основных действий.
    1. SCRAPY делает HTTP запрос на quotes.toscrape.com.
    2. Это отражает ответ как Scrapy.http.response.html.htmlresponse Отказ
    3. Он передает объект ответа к методу обратного вызова у дефолта (анализ)
    4. Разбор () Функция использует селекторы CSS и XPath, чтобы найти нужную информацию и записать их для возврата.
    5. Разбор ищет следующую страницу (используя селектор CSS). Если это найдет это, это называет Следуйте ( ), что создает объект запроса.
    6. Parse возвращает контроль к Scrapy, который получает Scraped информацию и новый запрос, который затем включен в очередь для передачи планировщиком Scrapy
    7. Процесс повторяется до тех пор, пока больше не будет следующей страницы.

Запуск паука из шнуровой структуры

Теперь, когда паук готов, мы можем запустить его из таковых рамок, как это.

(scrapy_new) saus@megux:~/scrapy_new/article/projects/spiderdemo$ scrapy crawl funny --logfile=spiderlog

Если мы уйдем из '--logfile' Он будет распечатать журнал на терминале. После запуска команды файл SPIDERLOG покажет все журнальные сообщения SCRAPY (есть много и дают вам некоторое представление о всех элементах управления и настроек, которые составляют Scraphy). Чтобы сохранить вывод как JSON, используйте -O флаг, как это.

(scrapy_new) saus@megux:~/scrapy_new/article/projects/spiderdemo$ scrapy crawl funny -o out.json

Если мы посмотрим на выходной файл, мы видим следующее.

[
{"author": "Jane Austen", "text": "\u201cThe person, be it gentleman or lady, who has not pleasure 
in a good novel, must be intolerably stupid.\u201d"},
{"author": "Steve Martin", "text": "\u201cA day without sunshine is like, you know, night.\u201d"},
{"author": "Garrison Keillor", "text": "\u201cAnyone who thinks sitting in church can make you a Ch
ristian must also think that sitting in a garage can make you a car.\u201d"},
{"author": "Jim Henson", "text": "\u201cBeauty is in the eye of the beholder and it may be necessar
y from time to time to give a stupid or misinformed beholder a black eye.\u201d"},
{"author": "Charles M. Schulz", "text": "\u201cAll you need is love. But a little chocolate now and
 then doesn't hurt.\u201d"},
{"author": "Suzanne Collins", "text": "\u201cRemember, we're madly in love, so it's all right to ki
ss me anytime you feel like it.\u201d"},
{"author": "Charles Bukowski", "text": "\u201cSome people never go crazy. What truly horrible lives
 they must lead.\u201d"},
{"author": "Terry Pratchett", "text": "\u201cThe trouble with having an open mind, of course, is th
at people will insist on coming along and trying to put things in it.\u201d"},
{"author": "Dr. Seuss", "text": "\u201cThink left and think right and think low and think high. Oh,
 the thinks you can think up if only you try!\u201d"},
{"author": "George Carlin", "text": "\u201cThe reason I talk to myself is because I\u2019m the only
 one whose answers I accept.\u201d"},
{"author": "W.C. Fields", "text": "\u201cI am free of all prejudice. I hate everyone equally. \u201
d"},
{"author": "Jane Austen", "text": "\u201cA lady's imagination is very rapid; it jumps from admirati
on to love, from love to matrimony in a moment.\u201d"}
]

Итак, паук захватывает цитаты по желанию.

Как запустить паук прямо из скрипта оболочки

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

import scrapy
from scrapy.crawler import CrawlerProcess

# define spider
class QuotesSpider(scrapy.Spider):
    name = 'quotes'
    start_urls = ['http://quotes.toscrape.com/tag/humor/']

    def parse(self, response):
        print(type(response))
        for quote in response.css('div.quote'):
            yield {
                'author': quote.xpath('span/small/text()').get(),
                'text': quote.css('span.text::text').get(),
            }
        next_page = response.css('li.next a::attr("href")').get()
        if next_page is not None:
            yield response.follow(next_page, self.parse)

process = CrawlerProcess(settings={
    "FEEDS": {
        "out.json": {"format": "json"},
    },
})

process.crawl(QuotesSpider)
process.start()

Определение класса паука здесь точно так же, как показано. Что отличается то, что мы импортируем CrawlerProcess Из и мстится затем использовать его, чтобы вызвать наш паук с помощью метода сканирования CrawlerProcess объект. Выходной файл указан в аргументе настроек для CrawlerProcess Отказ

Заключение

Следует понимать, что структура обеспечивает поддержку различных видов вывода, уровней регистрации, ограничивающих скорость и так далее. Если вы хотите воспользоваться этими возможностями, используя стандартные хорошо документированные файлы конфигурации, то каркас доступен, если вы создаете сцепное проект. Смотрите это ссылка Для получения дополнительной информации. Вы также найдете отличную документацию и табачный учебник на docs.scrapy.org Отказ