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 
  • web.py: как получить параметр POST и параметр GET?
  • Итерировать по всем строкам в таблице, используя python lxml xpath
  • Почему Scrapy возвращает iframe?
  • Scrapy: выбор содержимого через Javascript
  • Лучший способ интегрировать код Python с HTML
  • Скрученная ошибка Python - проблемы с скрипом
  • Разница между BaseSpider и CrawlSpider
  • Джанго говорит, что моя модель не определена
  • Необходимо очистить информацию с веб-страницы с помощью кнопки «показать больше», каких-либо рекомендаций?
  • Scrapy дает URLError: <urlopen error timed out>
  • Python SimpleHTTPServer: изменить заголовок ответа
  •  
    Interesting Posts for Van-Lav

    Django с несколькими базами данных и конкретными маршрутизаторами приложений не может добавлять пользователей в MSSQL

    Выберите между двумя датами с Django

    Как я могу запросить ближайшую запись в заданных координатах (широта и долгота типа строки)?

    Распространение расширений на основе Cython с использованием LAPACK

    Эффективно использовать Google App Engine для отправки большого количества писем с помощью PHP?

    Рекурсивная реализация с использованием одного рекурсивного вызова

    Печать в stdout в параллельных процессах IPython

    Почему я могу назначить True = False (Python 2.7.9)

    GAE Простой поиск + Автозаполнение

    Документация Python отсылает вас к документам для «ожидания функции C». Где это?

    Инструмент (или комбинация инструментов) для воспроизводимых сред в Python

    Qt5 и QtQuick 2 для Python 2.7

    Триггеры косой черты 404 в правиле маршрута колбы

    Создание словарных клавиш на лету

    Keras Masking для RNN с шагами изменения времени

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