Logo of Scrapy.

Как очистить сайт с помощью Python + Scrapy за 5 простых шагов

Мы можем очистить сайт за вас по фиксированной цене! Пожалуйста, свяжитесь со мной , если вы заинтересованы.

В этом уроке Python Scrapy вы узнаете, как написать простой webscraper в Python с использованием Scrapy framework. Веб-сайт Data Blogger будет использоваться в качестве примера в этой статье.

Scrapy: An open source and collaborative framework for extracting the data you need from websites. In a fast, simple, yet extensible way.

Введение

В этом уроке мы создадим webscraper, используя только Scrapy + Python 3 (или Python 2) и не более! Учебник поддерживает как Python 2, так и Python 3. Возможности безграничны. Остерегайтесь, что некоторые веб-камеры не являются законными! Например, хотя это возможно, не разрешено использовать Scrapy или любой другой webscraper для очистки LinkedIn (https://www.linkedin.com/). Однако LinkedIn проиграл в одном случае в 2017 году.

Content + Link extractor

Цель Scrapy – извлечь контент и ссылки с веб-сайта. Это делается рекурсивно, следуя всем ссылкам на данном веб-сайте.

Шаг 1: Установка Scrapy

Согласно сайту Scrapy, нам просто нужно выполнить следующую команду для установки Scrapy:

pip install scrapy

Шаг 2. Создание проекта

Теперь мы создадим структуру папок для вашего проекта. Для скребка Data Blogger используется следующая команда. Вы можете изменить datablogger_scraper на имя вашего проекта.

scrapy startproject datablogger_scraper

Шаг 3: Создание объекта

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

Внедрение объекта Scrape

Объект определен в items.py, и для этого проекта items.py имеет следующее содержимое:

import scrapy

class DatabloggerScraperItem(scrapy.Item):
    # The source URL
    url_from = scrapy.Field()
    # The destination URL
    url_to = scrapy.Field()

Обратите внимание, что вы можете определить любой объект, который хотите просканировать! Например, вы можете указать объект Game Console (со свойствами «поставщик», «цена» и «дата выпуска»), когда вы очищаете веб-сайт об игровых консолях. Если вы очищаете информацию о музыке с нескольких веб-сайтов, вы можете определить объект со свойствами типа «художник», «дата выпуска» и «жанр». На LinkedIn вы можете очистить «Лицо» со свойствами «образование», «работа» и «возраст».

Шаг 4: Создание паука

Теперь мы инкапсулировали данные в объект, мы можем начать создавать паука. Сначала мы перейдем к папке проекта. Затем мы создадим следующую команду для создания паука (который затем можно найти в каталоге spiders /):

scrapy genspider datablogger data-blogger.com 

Реализация паук

Теперь создается паук (spiders / datablogger.py). Вы можете настроить этот файл столько, сколько хотите. Я получил следующий код:

# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractor import LinkExtractor
from scrapy.spiders import Rule, CrawlSpider
from datablogger_scraper.items import DatabloggerScraperItem


class DatabloggerSpider(CrawlSpider):
    # The name of the spider
    name = "datablogger"

    # The domains that are allowed (links to other domains are skipped)
    allowed_domains = ["data-blogger.com"]

    # The URLs to start with
    start_urls = ["https://www.data-blogger.com/"]

    # This spider has one rule: extract all (unique and canonicalized) links, follow them and parse them using the parse_items method
    rules = [
        Rule(
            LinkExtractor(
                canonicalize=True,
                unique=True
            ),
            follow=True,
            callback="parse_items"
        )
    ]

    # Method which starts the requests by visiting all URLs specified in start_urls
    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(url, callback=self.parse, dont_filter=True)

    # Method for parsing items
    def parse_items(self, response):
        # The list of items that are found on the particular page
        items = []
        # Only extract canonicalized and unique links (with respect to the current page)
        links = LinkExtractor(canonicalize=True, unique=True).extract_links(response)
        # Now go through all the found links
        for link in links:
            # Check whether the domain of the URL of the link is allowed; so whether it is in one of the allowed domains
            is_allowed = False
            for allowed_domain in self.allowed_domains:
                if allowed_domain in link.url:
                    is_allowed = True
            # If it is allowed, create a new item and add it to the list of found items
            if is_allowed:
                item = DatabloggerScraperItem()
                item['url_from'] = response.url
                item['url_to'] = link.url
                items.append(item)
        # Return all the found items
        return items

Несколько вещей стоит упомянуть. Искатель расширяет объект CrawlSpider, который имеет метод анализа для рекурсивного поиска веб-сайта. В коде определено одно правило. Это правило сообщает поисковику следовать всем связанным с ним ссылкам. Правило также указывает, что анализируются только уникальные ссылки, поэтому ни одна из ссылок не будет анализироваться дважды! Кроме того, свойство canonicalize гарантирует, что ссылки не анализируются дважды.

LinkExtractor

LinkExtractor – это модуль с целью извлечения ссылок с веб-страниц.

Шаг 5: Выполнение паука

Перейдите в корневую папку вашего проекта. Затем выполните следующую команду:

scrapy crawl datablogger -o links.csv -t csv

Затем эта команда запускается через ваш сайт и генерирует CSV-файл для хранения данных. В моем случае я получил CSV-файл с именем links.csv со следующим содержимым:

url_from,url_to
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/category/cern/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,http://www.data-blogger.com/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/category/data-science/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/category/software-science/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/category/mathematics/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/category/projects/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/category/competition/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/about-me/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/contact/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/hire-me/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/author/admin/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.facebook.com/sharer/sharer.php?t=Monitoring+your+cluster+in+just+a+few+minutes+using+ISA&u=https%3A%2F%2Fwww.data-blogger.com%2F2016%2F07%2F18%2Fmonitoring-your-cluster-in-just-a-few-minutes%2F
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://twitter.com/intent/tweet?text=Monitoring+your+cluster+in+just+a+few+minutes+using+ISA&url=https%3A%2F%2Fwww.data-blogger.com%2F2016%2F07%2F18%2Fmonitoring-your-cluster-in-just-a-few-minutes%2F
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://plus.google.com/share?url=https%3A%2F%2Fwww.data-blogger.com%2F2016%2F07%2F18%2Fmonitoring-your-cluster-in-just-a-few-minutes%2F
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/tag/cluster/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/tag/isa/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/tag/monitoring/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/tag/software/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/2016/07/17/cern-deel-3-trip-naar-zurich/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/2016/07/19/project-euler-using-scala-problem-1/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/2016/08/13/apache-flink-the-next-distributed-data-processing-revolution/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/2016/07/24/summing-the-fibonacci-sequence/
https://www.data-blogger.com/2016/07/17/why-scala/,https://www.data-blogger.com/2016/07/17/why-scala/
https://www.data-blogger.com/2016/07/17/why-scala/,https://www.data-blogger.com/
...

Вывод

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