NTLM-аутентификация с помощью Scrapy для веб-очистки

Я пытаюсь очистить данные с веб-сайта, требующего проверки подлинности.
Мне удалось успешно войти в систему с помощью запросов и HttpNtlmAuth со следующим:

s = requests.session() url = "https://website.com/things" response = s.get(url, auth=HttpNtlmAuth('DOMAIN\\USERNAME','PASSWORD')) 

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

Я наткнулся на следующее промежуточное программное обеспечение, которое, похоже, может работать, но я не думаю, что я его правильно применяю:

https://github.com/reimund/ntlm-middleware/blob/master/ntlmauth.py

В моем settings.py у меня есть

 SPIDER_MIDDLEWARES = { 'test.ntlmauth.NtlmAuthMiddleware': 400, } 

и в моем классе пауков у меня есть

 http_user = 'DOMAIN\\USER' http_pass = 'PASS' 

Я не смог заставить это работать.

Если кто-то успешно удалился с веб-сайта с помощью проверки подлинности NTLM, я могу оценить его в правильном направлении.

2 Solutions collect form web for “NTLM-аутентификация с помощью Scrapy для веб-очистки”

Мне удалось выяснить, что происходит.

1: Это считается «DOWNLOADER_MIDDLEWARE», а не «SPIDER_MIDDLEWARE».

 DOWNLOADER_MIDDLEWARES = { 'test.ntlmauth.NTLM_Middleware': 400, } 

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

 from scrapy.http import Response import requests from requests_ntlm import HttpNtlmAuth class NTLM_Middleware(object): def process_request(self, request, spider): url = request.url pwd = getattr(spider, 'http_pass', '') usr = getattr(spider, 'http_user', '') s = requests.session() response = s.get(url,auth=HttpNtlmAuth(usr,pwd)) return Response(url,response.status_code,{}, response.content) 

Внутри паука все, что вам нужно сделать, это установить следующие переменные:

 http_user = 'DOMAIN\\USER' http_pass = 'PASS' 

Спасибо @SpaceDog за комментарий выше, я столкнулся с аналогичной проблемой, пытаясь обходить сайт интрасети, используя аутентификацию ntlm. Искатель просто увидит первую страницу, потому что LinkExtractor внутри CrawlSpider не запустился.

Вот мое рабочее решение, использующее scrapy 1.0.5

NTLM_Middleware.py

 from scrapy.http import Response, HtmlResponse import requests from requests_ntlm import HttpNtlmAuth class NTLM_Middleware(object): def process_request(self, request, spider): url = request.url usr = getattr(spider, 'http_usr', '') pwd = getattr(spider, 'http_pass','') s = requests.session() response = s.get(url, auth=HttpNtlmAuth(usr,pwd)) return HtmlResponse(url,response.status_code, response.headers.iteritems(), response.content) 

settings.py

 import logging # Crawl responsibly by identifying yourself (and your website) on the user-agent USER_AGENT = 'scrapy intranet' # Configure maximum concurrent requests performed by Scrapy (default: 16) CONCURRENT_REQUESTS=16 # Enable or disable downloader middlewares # See http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html DOWNLOADER_MIDDLEWARES = { 'intranet.NTLM_Middleware.NTLM_Middleware': 200, 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware':None } # Configure item pipelines # See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html ITEM_PIPELINES = { 'scrapyelasticsearch.scrapyelasticsearch.ElasticSearchPipeline', } ELASTICSEARCH_SERVER='localhost' ELASTICSEARCH_PORT=9200 ELASTICSEARCH_USERNAME='' ELASTICSEARCH_PASSWORD='' ELASTICSEARCH_INDEX='intranet' ELASTICSEARCH_TYPE='pages_intranet' ELASTICSEARCH_UNIQ_KEY='url' ELASTICSEARCH_LOG_LEVEL=logging.DEBUG 

пауки / intranetspider.py

 # -*- coding: utf-8 -*- import scrapy #from scrapy import log from scrapy.spiders import CrawlSpider, Rule, Spider from scrapy.linkextractors import LinkExtractor from scrapy.linkextractors.lxmlhtml import LxmlLinkExtractor from scrapy.http import Response import requests import sys from bs4 import BeautifulSoup class PageItem(scrapy.Item): body=scrapy.Field() title=scrapy.Field() url=scrapy.Field() class IntranetspiderSpider(CrawlSpider): http_usr='DOMAIN\\user' http_pass='pass' name = "intranetspider" protocol='https://' allowed_domains = ['intranet.mydomain.ca'] start_urls = ['https://intranet.mydomain.ca/'] rules = (Rule(LinkExtractor(),callback="parse_items",follow=True),) def parse_items(self, response): self.logger.info('Crawl de la page %s',response.url) item = PageItem() soup = BeautifulSoup(response.body) #remove script tags and javascript from content [x.extract() for x in soup.findAll('script')] item['body']=soup.get_text(" ", strip=True) item['url']=response.url return item 
  • Как загрузить и прочитать URL с универсальными символами новой строки?
  • Scrapy. Как изменить настройки паука после начала сканирования?
  • Запросы дросселирования с несколькими прокси-серверами
  • Получить имя автора и URL-адрес тега у google scientar
  • Scrapy, похоже, не делает DFO
  • извлекать текст из Интернета с помощью Angular JS-тэгов, таких как ng-view
  • Готово ли Pylons?
  • Как отправить данные сообщения в start_urls scrapy spider
  •  
    Interesting Posts for Van-Lav

    читать подпроцесс stdout по очереди

    Python 256bit Хэш-функция с выводом номера

    Python: дождитесь ввода пользователем, а если вход через 10 минут не будет продолжен,

    Как я могу избежать проверки типа объекта python, если его атрибуты не используются?

    TypeError: требуется целое число

    Создание списка равномерно расположенных номеров в определенном диапазоне в python

    Как изменить версию python по умолчанию на Linux-машине? (А не только символическую ссылку)

    Как настроить ZeroRPC и тайм-ауты

    Извлечение кластеров из морской кластерной карты

    Как быстро переназначить идентификаторы для последовательных номеров

    ANTLR4 Python синтаксический анализ больших файлов

    scikit-learn: случайные параметры class_weight и sample_weight

    Как структурировать программу для работы с конфигурациями тральщика

    Как вложить записи в схему Avro?

    Сравнение двух массивов numpy для равенства, по элементам

    Python - лучший язык программирования в мире.