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 
Interesting Posts

Как импортировать пространство имен / перечисление объектов COM в Python?

Python: запись в один файл с очередью при использовании многопроцессорного пула

Встроенный питон: многопроцессорная работа не работает

Установите ошибку возврата mysql-python в CentOs

Закрытие в Python

Изменение определения функции без назначения

Расширенное понимание списка Python

Сравните два текстовых файла, чтобы найти различия и вывести их в новый текстовый файл

Python – добавление списка в dict (начинающий)

Передача структурированного массива numpy со строками в функцию cython

Почему python компилирует исходный код в байт-код перед интерпретацией?

как я могу использовать fileinput для редактирования нескольких файлов?

Pandas – пишите строки Multiindex с to_csv

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

Нужен способ получить текущую песню от Zune и проигрывателя Windows Media с помощью Python

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