Scrapy и прокси - PullRequest
       17

Scrapy и прокси

37 голосов
/ 17 января 2011

Как вы используете поддержку прокси с помощью фреймворка Python Scrapy?

Ответы [ 7 ]

44 голосов
/ 17 января 2011

Из FAQ по Scrapy ,

Работает ли Scrapy с HTTP прокси?

Да.Поддержка прокси-серверов HTTP (начиная с версии Scrapy 0.8) обеспечивается через промежуточное ПО загрузчика HTTP-прокси.См. HttpProxyMiddleware.

Самый простой способ использования прокси-сервера - установить переменную окружения http_proxy.Как это сделать, зависит от вашей оболочки.

C:\>set http_proxy=http://proxy:port
csh% setenv http_proxy http://proxy:port
sh$ export http_proxy=http://proxy:port

Если вы хотите использовать https прокси и посещенный веб-сайт https, чтобы установить переменную среды http_proxy, вам следует следовать ниже,

C:\>set https_proxy=https://proxy:port
csh% setenv https_proxy https://proxy:port
sh$ export https_proxy=https://proxy:port
42 голосов
/ 16 декабря 2013

Один прокси

  1. Включить HttpProxyMiddleware в вашем settings.py, например:

    DOWNLOADER_MIDDLEWARES = {
        'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 1
    }
    
  2. передать прокси на запрос через request.meta:

    request = Request(url="http://example.com")
    request.meta['proxy'] = "host:port"
    yield request
    

Вы также можете выбрать адрес прокси случайным образом, если у вас есть пул адресов.Вот так:

Несколько прокси

class MySpider(BaseSpider):
    name = "my_spider"
    def __init__(self, *args, **kwargs):
        super(MySpider, self).__init__(*args, **kwargs)
        self.proxy_pool = ['proxy_address1', 'proxy_address2', ..., 'proxy_addressN']

    def parse(self, response):
        ...parse code...
        if something:
            yield self.get_request(url)

    def get_request(self, url):
        req = Request(url=url)
        if self.proxy_pool:
            req.meta['proxy'] = random.choice(self.proxy_pool)
        return req
25 голосов
/ 18 апреля 2015

1 - Создайте новый файл с именем middlewares.py, сохраните его в своем проекте scrapy и добавьте в него следующий код.

import base64
class ProxyMiddleware(object):
    # overwrite process request
    def process_request(self, request, spider):
        # Set the location of the proxy
        request.meta['proxy'] = "http://YOUR_PROXY_IP:PORT"

        # Use the following lines if your proxy requires authentication
        proxy_user_pass = "USERNAME:PASSWORD"
        # setup basic authentication for the proxy
        encoded_user_pass = base64.encodestring(proxy_user_pass)
        request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass

2 - Откройте файл конфигурации вашего проекта (./project_name/settings.py) и добавьте следующий код

DOWNLOADER_MIDDLEWARES = {
    'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': 110,
    'project_name.middlewares.ProxyMiddleware': 100,
}

Теперь ваши запросы должны передаваться этим прокси. Просто, не правда ли?

9 голосов
/ 18 января 2013

это будет:

export http_proxy = http://user:password@proxy:port

4 голосов
/ 01 декабря 2015

Есть замечательное промежуточное программное обеспечение, написанное кем-то [1]: https://github.com/aivarsk/scrapy-proxies "Промежуточное программное обеспечение прокси Scrapy"

3 голосов
/ 27 октября 2015

В Windows я собрал пару предыдущих ответов, и это сработало. Я просто сделал:

C:>  set http_proxy = http://username:password@proxy:port

и затем я запустил свою программу:

C:/.../RightFolder> scrapy crawl dmoz

где "dmzo" - это имя программы (я пишу его, потому что это то, что вы найдете в учебнике в Интернете, и если вы здесь, вы, вероятно, начали с учебника).

2 голосов
/ 18 ноября 2015

Поскольку у меня возникли проблемы с настройкой среды в / etc / environment, вот что я поместил в свой паук (Python):

os.environ["http_proxy"] = "http://localhost:12345"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...