Scrapy отправляет запрос с использованием указанной сетевой карты python 3 - PullRequest
0 голосов
/ 03 декабря 2018

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

Сервер: Windows 10
Python: 3.6
Scrapy: 1.5

Я искал решение и нашел это Python отправляет HTTP-запрос с использованием указанной сетевой карты в Интернете, но на самом деле я не понял, как это может бытьused.

Пожалуйста, помогите мне решить это решение, например, назначьте сетевую карту python или назначьте сетевую карту сокету или основной библиотеке, которую scrapy использовал для запроса веб-сайта.

1 Ответ

0 голосов
/ 11 января 2019

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

Но, похоже, документация scrapy не показываеткак его использовать, но я предложил промежуточное ПО для загрузки, которое модифицирует запрос и решает мою проблему, и я назвал его BindAddressMiddleware.

Что делает промежуточное ПО? Используются настройки

IS_MORE_NETWORK_CARDS = True определенная сетевая карта будет использоваться, если False, тогда она не будет

BIND_ADDRESS = 127.0.0.1 IP-адрес используемой сетевой карты

useзагружаемое промежуточное ПО для проекта scrapy в settings.py

DOWNLOADER_MIDDLEWARES = {
    # Bindaddress
    'scrapers22.middlewares.BindAddressMiddleware': 400,
}

промежуточное ПО BindAddressMiddleware

class BindAddressMiddleware(object):
    def __init__(self, settings):
        self.is_bindaddress = settings.get('IS_MORE_NETWORK_CARDS')
        if self.is_bindaddress:
            self.bindaddress = settings.get('BIND_ADDRESS')

    @classmethod
    def from_crawler(cls, crawler):
        return cls(crawler.settings)

    def process_request(self, request, spider):
        if self.is_bindaddress:
            if self.bindaddress:
                request.meta['bindaddress'] = (self.bindaddress, 0)
        return None

    def spider_opened(self, spider):
        spider.logger.info('Using: %s as bindaddress' % self.bindaddress)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...