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 
  • Как просмотреть весь сайт с помощью селена?
  • Как перебрать сотни изображений в Qulatrics - помощь, необходимая для реализации кода
  • Python Flask + nginx fcgi - выводит большой ответ?
  • как получить доступ к моему 127.0.0.1:8000 из Android-планшета
  • Как использовать CrawlSpider из scrapy, чтобы щелкнуть ссылку с javascript onclick?
  • Как безопасно хранить криптовый ключ?
  • Обработка разбиения на страницы в lxml
  • Динамическая обработка поддоменов в веб-приложении (колба)
  •  
    Interesting Posts for Van-Lav

    Добавляйте строки в базу данных Pandas без создания новой копии

    Как сформировать анонимный запрос API API Imgur

    Счетчик возвратов Django при сохранении даты <= последние 24 часа

    Синхронизация даты / времени с сокращенным названием часового пояса в Python?

    Как работает привязка оператора на этом примере Python?

    matplotlib: при использовании append_axes, как я могу указать оси, к которым я хочу добавить подпанель?

    Моя собственная программа OCR в Python

    Как отображать текст на экране без окна с помощью Python

    Что такое «URL-адрес обратного вызова по умолчанию» для Tumblr API v2?

    Python pygame error: Ошибка загрузки libpng.dylib: dlopen (libpng.dylib, 2): изображение не найдено

    Изучение упражнений на Python

    Как я могу количественно определить разницу между двумя изображениями?

    Инструмент тестового покрытия для платформы тестирования поведения

    Измените тензор TensorFlow внутри функции потери Keras?

    Почему нет реальных потоков для python?

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