Средство загрузки, запросы и ответы - PullRequest
0 голосов
/ 04 июля 2018

Я знаю, что Middleware передает запросы в Downloader и ответы на Spider, но ничто не объясняет, для чего следует использовать Middleware Downloader, и я нигде не могу найти достойного объяснения.

Какова его цель? Каким образом Downloader Middleware используется для изменения запросов и ответов? Используется ли промежуточное программное обеспечение Downloader для обработки исключений, управления прокси и строками пользовательских агентов и т. Д.?

1 Ответ

0 голосов
/ 04 июля 2018

Давайте возьмем пример, приведенный в документации Scrapy

import scrapy


class QuotesSpider(scrapy.Spider):
    name = "quotes"

    start_urls = [
        'http://quotes.toscrape.com/page/1/',
        'http://quotes.toscrape.com/page/2/',
    ]

    def parse(self, response):
        for quote in response.css('div.quote'):
            yield {
                'text': quote.css('span.text::text').extract_first(),
                'author': quote.css('small.author::text').extract_first(),
                'tags': quote.css('div.tags a.tag::text').extract(),
            }

Ну, это хорошо работает, но, как вы уже знаете, это не так для всех веб-сайтов, таких как amazon.com

Вам необходимо отправить пользовательский агент, такой как (Mozilla или Chrome) в заголовке запроса, и таким образом он узнает, что запрос поступает из браузера. Вы можете легко изменить его в настройках, заменив USER_AGENT = "Mozilla / 5.0 (X11; Linux x86_64) AppleWebKit / 537.36 (KHTML, как Gecko) Chrome / 51.0.2704.103 Safari / 537.36".

Теперь вы изменили пользовательский агент, и сервер Amazon будет чувствовать, что запрос поступает из браузера Chrome. На шаг вперед вы увеличиваете параллелизм до некоторого большого числа, например 100. Теперь, что происходит, amazon может легко отследить вашего бота, и вы получите бан, потому что это означает, что одно устройство обращается к серверу 100 раз в секунду , что невозможно человеку.

Итак, здесь происходит ротация прокси и пользовательского агента. Вопрос в том, как мы их вращаем.

Допустим, у вас есть набор USER_AGENTS = [...] в настройках

middlewares.py из .settings import USER_AGENT_LIST импортировать случайный из журнала импорта скрапа

class UserAgentRotationMiddleware(object):

    def process_request(self, request, spider):
        agent  = random.choice(USER_AGENT_LIST)
        if agent:
            request.headers.setdefault('User-Agent', agent)

И вы должны сказать, что проект Scrapy, как,

DOWNLOADER_MIDDLEWARES = {
   "yourproject.middlewares.UserAgentRotationMiddleware": 500
}

Что на самом деле происходит, когда вы запускаете паука?

Пояснение:

  1. Запрос графиков терапии.
  2. URL поступает в промежуточное ПО загрузчика до того, как запрос достигает сервера

Технически это вызовет класс промежуточного программного обеспечения загрузчика. Он вызывает метод process_request с предоставлением текущего объекта запроса и объекта паука

def process_request(self, request, spider):

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

поэтому по нашему алгоритму мы изменим пользовательский агент,

# Choosing random user agent from a list
agent  = random.choice(USER_AGENT_LIST)
    if agent:
        request.headers.setdefault('User-Agent', agent)

Опять новый запрос получает расписание для этого промежуточного ПО, оно изменит пользовательский агент и передаст объект запроса вперед.

DOWNLOADER_MIDDLEWARES = {
   "yourproject.middlewares.UserAgentRotationMiddleware": 500
}

При регистрации нашего проекта мы должны указать некоторое число от 100 до 900, какие 500 это указывает? (в качестве значения пространства имен промежуточного программного обеспечения)

Существует множество различных промежуточных программ, уже существующих в scrapy, и мы можем определить их так, как мы хотим сейчас, в таком случае. как их расставить по приоритетам? какой будет порядок их исполнения?

Выполняется в порядке возрастания, например, 100, 200, 230, 500, 650, 900.

Такая же методология применяется для ротации прокси.

Запрос:

Если вы использовали urllib более низкого уровня или модуль запросов, что он делает? Он принимает URL в качестве аргумента (куки, прокси, заголовки, необязательные аргументы полезной нагрузки)

Когда вы запускаете его, что он делает? Это делает http запрос к URL "http://quotes.toscrape.com"

Как обычно в браузере:

  1. Откройте браузер.
  2. Введите "http://quotes.toscrape.com" в строке URL
  3. Ваш браузер показывает этот сайт

Но многое происходит между шагами 2 и 3. Ваш браузер принимает URL-запросы к серверу, используя HTTP-запрос более низкого уровня. принимает ответ, затем компилирует его и отображает в браузере.

Псевдокод, который делает то же самое,

import requests

response = requests.get('http://quotes.toscrape.com')

print response.status_code
print response.content

reports.get на URL "http://quotes.toscrape.com" отправьте HTTP-запрос GET на "http://quotes.toscrape.com", который возвращает вам ответ. вы можете выполнить его и проверить его, он вернет нам некоторый html , который является ничем иным, как ответом .

То, что делает scrapy, чтобы просто обеспечить свою функциональность, оборачивает этот модуль запросов в scrapy.Request и модуль ответа HttpResponse.

HttpResponse предлагает xpath & css селектор.

def parse(self, response):
    response.xpath('....')

ответ, предоставленный платформой scrapy в этом методе синтаксического анализа, является экземпляром HttpResponse, который является оболочкой объекта ответа более низкого уровня urllib.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...