CoderCastrov logo
CoderCastrov
Питон

Основы Scrapy: Как парсить названия животных

Основы Scrapy: Как парсить названия животных
просмотров
3 мин чтение
#Питон
Table Of Content

    Привет, сегодня я расскажу вам о Scrapy. Scrapy - это бесплатный фреймворк для веб-парсинга, написанный на Python. Изначально разработанный для скрапинга веб-сайтов, он также может использоваться для извлечения данных с помощью API или в качестве универсального веб-сканера. В настоящее время он поддерживается компанией Scrapinghub Ltd, занимающейся разработкой и обслуживанием веб-скрапинга.

    Изображение src="/blogs/f749da38d0.jpg" width="355" height="142" alt="" sizes="100vw"

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

    На этот раз я хочу объяснить, как сделать простой веб-парсинг. Мы будем получать данные о названиях аэропортов на https://a-z-animals.com/animals/

    Сначала откройте PyCharm и создайте новый проект с виртуальной средой, как показано на рисунке.

    Изображение src="/blogs/bb82c52583.jpg" width="700" height="394" alt="" sizes="100vw"

    Перед установкой Scrapy вам нужно установить Twisted, вы можете скачать его по адресу https://www.lfd.uci.edu/~gohlke/pythonlibs/, найти Twisted и скачать соответствующую версию для вашей версии Python и вашей версии Windows. Моя версия Python была 3.6, а моя версия Windows была 64-битной, поэтому я выбрал https://download.lfd.uci.edu/pythonlibs/t4jqbe6o/Twisted-19.2.1-cp36-cp36m-win_amd64.whl.

    Откройте файл в проводнике Windows, щелкните правой кнопкой мыши, выберите "Копировать", откройте PyCharm, щелкните правой кнопкой мыши на каталоге "scrapy_for_beginner" и выберите "Вставить". Затем выполните следующие команды:

    pip install Twisted-19.2.1-cp36-cp36m-win_amd64.whlpip install scrapy

    Теперь мы можем начать парсить. Сначала мы должны назвать этот проект парсинга, выполните следующую команду в терминале:

    scrapy startproject animal_namescd animal_namesscrapy genspider animal www.a-z-animals.com

    После этого появится новый файл на Python с именем animal.py. Мы будем писать код парсинга там. Затем нам нужно установить Pywin32 и изменить код в формат .json, выполните следующую команду в терминале:

    pip install pywin32scrapy crawl animal -o codes.json

    Затем введите следующий код в animal.py:

    name = 'animal'allowed_domains = ['www.a-z-animals.com']
    start_urls = ['http://a-z-animals.com/animals']
    
    def parse(self, response):
        data = []
        table = response.css('.az-leftbox.az-animal-index')
        row_selector = ".//li[@class='az-phobia-link-990']|.//li[@class='az-phobia-link-322']|" \
                       ".//li[@class='az-phobia-link-451']|.//li[@class='az-phobia-link-204']|" \
                       ".//li[@class='az-phobia-link-225']"

    Allowed domains - это основной URL, с которого мы хотим получить данные. Start_urls - это конкретный URL, с которого мы хотим получить данные, в данном случае мы хотим получить 5 названий животных с буквой A последовательно. Где я могу получить исходный код? Вы можете открыть URL https://a-z-animals.com/animals/, щелкнуть правой кнопкой мыши и выбрать "Инспектировать".

    Изображение src="/blogs/aaf2f54605.jpg" width="700" height="394" alt="" sizes="100vw"

    Это основной класс, из которого мы хотим получить данные. Запишите его в коде:

    table = response.css('.az-leftbox.az-animal-index')

    Изображение src="/blogs/19fba0213e.jpg" width="700" height="394" alt="" sizes="100vw"

    Это подкласс, из которого мы хотим получить данные, в данном случае мы хотим получить 5 названий животных с буквой A последовательно, поэтому просто запишите первые пять подклассов в animal.py.

    row_selector = ".//li[@class='az-phobia-link-990']|.//li[@class='az-phobia-link-322']|" \
                       ".//li[@class='az-phobia-link-451']|.//li[@class='az-phobia-link-204']|" \
                       ".//li[@class='az-phobia-link-225']"

    Затем вам нужно выбрать строку.

    Изображение src="/blogs/2e2477d4ee.jpg" width="700" height="394" alt="" sizes="100vw"

    Мы хотим получить тексты Aardvark, Abyssinian, Adelie Penguin, Affenpinscher, Afgan Hound, их местоположение в HTML находится в ./a/b, затем мы пишем текст, поэтому это будет ./a/b/text(), и добавляем это в наш код следующим образом:

    for row in table.xpath(row_selector):
        name = row.xpath('./a/b/text()').extract_first()
        print(name)
    
        data.append({
            "name": name
        })

    Я также добавил текст "name", чтобы результат был более аккуратным. Если вы хотите добавить какой-то текст или функцию, вы можете написать data.append, а затем текст. Вот и весь ваш код в animal.py будет выглядеть так:

    import scrapy
    
    class AnimalSpider(scrapy.Spider):
        name = 'animal'allowed_domains = ['https://www.a-z-animals.com']
        start_urls = ['https://www.a-z-animals.com/animals']
    
        def parse(self, response):
            data = []
            table = response.css('.az-left-box.az-animals-index')
            row_selector = ".//li[@class='az-phobia-link-990']|.//li[@class='az-phobia-link-322']|" \
                           ".//li[@class='az-phobia-link-451']|.//li[@class='az-phobia-link-204']|" \
                           ".//li[@class='az-phobia-link-225']"
            for row in table.xpath(row_selector):
                name = row.xpath('./a/b/text()').extract_first()
                print(name)
    
                data.append({
                    "name": name
                })
    
            return data

    Затем перейдите в терминал и введите scrapy crawl animal -o codes.json. Проверьте файл codes.json и вы получите следующий результат:

    Изображение src="/blogs/aa37d76805.jpg" width="700" height="394" alt="" sizes="100vw"

    Поскольку в коде мы написали print(name), результат также будет добавлен в терминал.

    Изображение src="/blogs/b1ad128242.jpg" width="700" height="279" alt="" sizes="100vw"

    Вот пример того, как парсить веб-сайт. В данном случае мы парсили 5 названий животных с буквой A последовательно. В следующей статье я расскажу больше о Python, JavaScript или HTML.

    Оставайтесь на связи для моих следующих статей!!