小编典典

使用Scrapy进行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, }

在我的spider课上

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

我一直无法使它正常工作。

如果任何人都能够通过NTLM身份验证成功从网站抓取,可以为我指明正确的方向,我将不胜感激。


阅读 560

收藏
2020-04-09

共1个答案

小编典典

我能够弄清楚发生了什么。

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)

在Spider中,你所需要做的就是设置以下变量:

http_user = 'DOMAIN\\USER'
http_pass = 'PASS'
2020-04-09