Превосходный пакет для веб-сканирования

Scrapy — это быстрый и мощный фреймворк для парсинга веб-страниц для Python. Он разработан, чтобы быть простым в использовании и позволять разработчикам быстро и эффективно очищать веб-сайты.

Вот несколько примеров общих функций Scrapy:

  1. scrapy.Request: эта функция создает запрос к веб-сайту и возвращает объект Response.
import scrapy

def scrape_website(self):
    yield scrapy.Request(url='http://www.example.com', callback=self.parse)
def parse(self, response):
    # Code to parse the response goes here
    pass

response.xpath: Эта функция позволяет извлекать данные с веб-сайта с помощью селекторов XPath.

import scrapy

def parse(self, response):
    title = response.xpath('//title/text()').get()
    print(title)  # Output: "Example Website"

scrapy.Item: этот класс используется для определения структуры данных, которые вы хотите извлечь с веб-сайта.

import scrapy
class ExampleItem(scrapy.Item):
    title = scrapy.Field()
    author = scrapy.Field()
    date_published = scrapy.Field()
def parse(self, response):
    item = ExampleItem()
    item['title'] = response.xpath('//title/text()').get()
    item['author'] = response.xpath('//div[@class="author"]/text()').get()
    item['date_published'] = response.xpath('//div[@class="date"]/text()').get()
    yield item

Это всего лишь несколько примеров функций и классов, доступных в Scrapy. Есть много других инструментов, которые вы можете использовать для парсинга веб-сайтов и извлечения с них данных. Scrapy также предоставляет ряд встроенных функций для обработки файлов cookie, перенаправлений и других задач, связанных с Интернетом, что делает его мощным инструментом для просмотра веб-страниц.

Вот еще несколько примеров функций Scrapy:

response.css: Эта функция позволяет извлекать данные с веб-сайта с помощью селекторов CSS.

import scrapy
def parse(self, response):
    title = response.css('title::text').get()
    print(title)  # Output: "Example Website"

scrapy.Spider: этот класс используется для определения паука, который является основным компонентом проекта Scrapy. Паук отвечает за выполнение запросов к веб-сайтам и обработку ответов.

import scrapy

class ExampleSpider(scrapy.Spider):
    name = "example"
    start_urls = [
        "http://www.example.com",
    ]
    def parse(self, response):
        # Code to parse the response goes here
        pass
  1. scrapy.crawler.CrawlerProcess: этот класс используется для запуска проекта Scrapy.
import scrapy
from scrapy.crawler import CrawlerProcess

process = CrawlerProcess()
process.crawl(ExampleSpider)
process.start()

response.follow: эта функция создает новый запрос к URL-адресу, указанному в ответе, и возвращает объект Response.

import scrapy

def parse(self, response):
    next_page = response.xpath('//a[@class="next"]/@href').get()
    if next_page is not None:
        yield response.follow(next_page, callback=self.parse)

scrapy.Selector: Этот класс используется для выбора элементов из документа HTML или XML и извлечения из них данных.

import scrapy

def parse(self, response):
    selector = scrapy.Selector(response)
    titles = selector.xpath('//title/text()').getall()
    print(titles)  # Output: ["Example Website"]

scrapy.pipelines.Pipeline: этот класс используется для определения конвейера, который представляет собой набор действий, выполняемых с данными, извлеченными с веб-сайта.

import scrapy

class ExamplePipeline(scrapy.pipelines.Pipeline):
    def process_item(self, item, spider):
        # Code to process the item goes here
        return item

Чтобы использовать конвейер в вашем проекте Scrapy, вам нужно добавить его в параметр ITEM_PIPELINES в файле settings.py.

ITEM_PIPELINES = {
    'myproject.pipelines.ExamplePipeline': 300,
}

response.meta: Этот словарь позволяет передавать данные между различными функциями обратного вызова в проекте Scrapy.

import scrapy

def parse(self, response):
    next_page = response.xpath('//a[@class="next"]/@href').get()
    if next_page is not None:
        yield response.follow(next_page, callback=self.parse_page, meta={'page_number': 1})
def parse_page(self, response):
    page_number = response.meta['page_number']
    # Code to parse the page goes here

scrapy.utils.response.open_in_browser: Эта функция позволяет открыть ответ в веб-браузере для целей отладки.

import scrapy

def parse(self, response):
    scrapy.utils.response.open_in_browser(response)
    # Code to parse the response goes here
  1. scrapy.linkextractors.LinkExtractor: Этот класс используется для извлечения ссылок с веб-сайта.
import scrapy
from scrapy.linkextractors import LinkExtractor

def parse(self, response):
    le = LinkExtractor(restrict_css='div.links')
    links = le.extract_links(response)
    for link in links:
        print(link.url)

scrapy.http.FormRequest: этот класс используется для отправки формы на веб-сайте и возврата объекта Response.

import scrapy

def parse(self, response):
    return scrapy.http.FormRequest.from_response(
        response,
        formdata={'username': 'john', 'password': 'secret'},
        callback=self.after_login
    )
def after_login(self, response):
    # Code to parse the response goes here
    pass

response.json: Эта функция позволяет анализировать ответ JSON с веб-сайта.

import scrapy

def parse(self, response):
    data = response.json()
    print(data)  # Output: {"key": "value"}

scrapy.downloadermiddlewares.retry.RetryMiddleware: это промежуточное ПО используется для повторения неудачных запросов.

import scrapy

RETRY_TIMES = 3
RETRY_HTTP_CODES = [500, 502, 503, 504, 522, 524, 408]
DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.retry.RetryMiddleware': 90,
    'scrapy_proxies.RandomProxy': 100,
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110,
}
PROXY_LIST = '/path/to/proxy/list.txt'
PROXY_MODE = 0

scrapy.extensions.closespider.CloseSpider: Это расширение используется для закрытия паука при выполнении определенного условия.

import scrapy

class ExampleSpider(scrapy.Spider):
    name = 'example'
    start_urls = ['http://www.example.com']
    def __init__(self, *args, **kwargs):
        super(ExampleSpider, self).__init__(*args, **kwargs)
        self.page_number = 0
    def parse(self, response):
        self.page_number += 1
        if self.page_number > 5:
            raise CloseSpider('Reached maximum page limit')
        # Code to parse the response goes here

scrapy.utils.log.LogFormatter: Этот класс используется для настройки форматирования сообщений журнала.

import scrapy

LOG_FORMATTER = 'myproject.logformatter.LogFormatter'
class LogFormatter(scrapy.utils.log.LogFormatter):
    def dropped(self, item, exception, response, spider):
        return {
            'level': self.ERROR,
            'exception': exception,
            'item': item,
        }

scrapy.utils.response.get_base_url: эта функция возвращает базовый URL-адрес ответа.

import scrapy

def parse(self, response):
    base_url = scrapy.utils.response.get_base_url(response)
    print(base_url)  # Output: "http://www.example.com"

scrapy.settings.Settings: этот класс используется для установки и получения настроек Scrapy.

import scrapy

class ExampleSpider(scrapy.Spider):
    name = 'example'
    custom_settings = {
        'DOWNLOAD_DELAY': 1,
        'CONCURRENT_REQUESTS': 2,
    }
    def __init__(self, *args, **kwargs):
        super(ExampleSpider, self).__init__(*args, **kwargs)
        self.settings = scrapy.settings.Settings()
        delay = self.settings.getint('DOWNLOAD_DELAY')
        print(delay)  # Output: 1

scrapy.utils.response.body_or_str: эта функция возвращает тело ответа в виде байтового объекта или строки, в зависимости от атрибута response.encoding.

import scrapy

def parse(self, response):
    body = scrapy.utils.response.body_or_str(response)
    print(type(body))  # Output: <class 'bytes'>

scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware: Это промежуточное ПО используется для добавления поддержки прокси в проект Scrapy.

import scrapy

DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110,
}
HTTP_PROXY = 'http://user:[email protected]:8118'

Я надеюсь, что эти примеры помогут вам понять некоторые из расширенных функций Scrapy и то, как вы можете использовать их для создания сложных проектов парсинга веб-страниц.

Больше контента на PlainEnglish.io.

Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Следите за нами в Twitter, LinkedIn, YouTube и Discord.

Повысьте узнаваемость и принятие вашего технологического стартапа с помощью Circuit.