首页 > 编程问答 >使用 Scrapy 进行身份验证并登录用户会话的证书?

使用 Scrapy 进行身份验证并登录用户会话的证书?

时间:2024-07-25 17:03:03浏览次数:14  
标签:python web-scraping scrapy certificate

在 Scrapy 文档中,有以下示例说明如何在 Scrapy 中使用带有登录数据的经过身份验证的会话:

class LoginSpider(BaseSpider):
name = 'example.com'
start_urls = ['http://www.example.com/users/login.php']

def parse(self, response):
    return [FormRequest.from_response(response,
                formdata={'username': 'john', 'password': 'secret'},
                callback=self.after_login)]

def after_login(self, response):
    # check login succeed before going on
    if "authentication failed" in response.body:
        self.log("Login failed", level=log.ERROR)
        return

    # continue scraping with authenticated session...

但是有没有办法使用证书登录进行此身份验证?


很遗憾,Scrapy 本身并不直接支持使用客户端证书进行身份验证。Scrapy 主要依赖于 requests 库进行网络请求,而 requests 库默认情况下不发送客户端证书。

但是,可以通过以下几种方法来实现使用证书登录:

1. 使用自定义 Downloader Middleware:

  • 创建一个自定义的 Downloader Middleware,并在其中处理证书加载和请求修改。
  • 在 Middleware 的 process_request 方法中,使用 requests.Session 对象加载的证书,并将 Session 对象附加到请求的 meta 属性中。
  • 修改 LoginSpider parse 方法,从请求的 meta 属性中获取 Session 对象,并使用该 Session 对象发送表单数据。

示例代码:

```python import scrapy from scrapy.http import FormRequest from scrapy.downloadermiddlewares.redirect import RedirectMiddleware import requests from requests.adapters import HTTPAdapter from requests.packages.urllib3.poolmanager import PoolManager from requests.packages.urllib3.util import ssl_

class SSLCertAdapter(HTTPAdapter): """ 自定义的 Adapter,用于加载证书 """ def init (self, cert_file, key_file, args, kwargs): self.cert_file = cert_file self.key_file = key_file super(SSLCertAdapter, self). init ( args, **kwargs)

   def init_poolmanager(self, connections, maxsize, block=False, **pool_kwargs):
       context = ssl_.create_default_context(ssl_.PROTOCOL_TLS)
       context.load_cert_chain(certfile=self.cert_file, keyfile=self.key_file)
       return PoolManager(
           num_pools=connections,
           maxsize=maxsize,
           block=block,
           ssl_context=context,
           **pool_kwargs
       )

class CertMiddleware(RedirectMiddleware): """ 自定义的 Downloader Middleware,用于加载证书并修改请求 """ def init (self, settings): super(CertMiddleware, self). init (settings) self.cert_file = settings.get('CERT_FILE') self.key_file = settings.get('KEY_FILE')

   @classmethod
   def from_crawler(cls, crawler):
       return cls(crawler.settings)

   def process_request(self, request, spider):
       if 'use_cert' in request.meta and request.meta['use_cert']:
           session = requests.Session()
           session.mount('https://', SSLCertAdapter(self.cert_file, self.key_file))
           request.meta['cert_session'] = session
       return None

class LoginSpider(scrapy.Spider): name = 'example.com' start_urls = ['https://www.example.com/users/login.php']

   def parse(self, response):
       return FormRequest.from_response(
           response,
           formdata={'username': 'john', 'password': 'secret'},
           callback=self.after_login,
           meta={'use_cert': True}
       )

   def after_login(self, response):
       session = response.meta['cert_session']
       # 使用 session 发送后续请求

```

settings.py:

```python DOWNLOADER_MIDDLEWARES = { 'myproject.middlewares.CertMiddleware': 543, }

CERT_FILE = 'path/to/your/cert.pem' KEY_FILE = 'path/to/your/key.pem' ```

  1. 使用其他支持客户端证书的 Python 库:

  2. 可以使用其他支持客户端证书的 Python 库,例如 urllib3 http.client ,并手动构建和发送请求。

请注意,以上代码示例仅供参考,需要根据的实际情况进行修改。

标签:python,web-scraping,scrapy,certificate
From: 19338894

相关文章

  • 如何诊断和修复 python .\app.py 不工作
    我在vscode中激活了我的虚拟环境。在激活我的环境的PowerShell中,我成功安装了Flask。然后我在文件main.py中运行此代码:fromflaskimportFlaskapp=Flask(__name__)@app.route('/')defhello_world():return'Hello,World!'if__name__=="__main__":......
  • 【pywpsrpc/Python】改变图片宽高报错 对象无效属性: ‘tuple‘ object has no attrib
    概要开发UOS环境下,使用Python通过pywpsrpc库操作word文档在指定段落添加指定宽高的图片时意外发现的该问题,在原作者的github提问后获得解答后记录(源码地址、对应提问链接以及相关资料链接贴在文章末尾)。原因及解决方式首先贴一段简单的代码,作用是新建一个word文档并在其......
  • Python - 如何使用存储在类变量中的类型作为同一类方法的参数的类型提示?
    考虑下面的代码:fromtypingimportProtocol,ClassVar,AnyclassTool(Protocol):t:ClassVar#deff(self,params:self.t)->Any:#NameError:name'self'isnotdefineddeff(self,params)->Any:passclassSum:......
  • 从Python列表中提取值
    代码图片我只想从.dat文件中提取单个值,到目前为止,我已经成功提取了我想要的值,但我将各个字符串添加在一起。它非常笨重,所以寻找一种更平滑的方法,它只会给我行中的第一个值(-300)。谢谢代码:current_dir=os.getcwd()work_dir="\workDir"......
  • 如何从另一个 python 文件运行一个 python 文件
    我正在尝试从另一个python运行一个python文件,但是当涉及到调用另一个python文件中的方法时,它只会重新运行当前的python文件。我尝试了这段代码。我将导入放入log_user_in方法中,因为如果我将其导入到文件顶部,则会出现循环导入错误。这是我的代码片段fromtkinter......
  • 如何在Mac电脑上安装Python 2
    Python是一种高级编程语言,广泛应用于数据科学、网络开发、人工智能等领域。本文将介绍如何在Mac电脑上安装Python2,帮助初学者快速入门。一、下载Python2安装包在Python官网上下载Python2的安装包,网址为https://www.python.org/downloads/release/python-2718/ 。下载完......
  • 我的 python 抓取数据是空的,不确定我的代码出了什么问题
    我的结果是空的,不确定我的代码出了什么问题:这里是我的代码:#尝试从该网站获取数据https://www.watsons.com.sg/health/c/2100000?currentPage=1importrequestsfrombs4importBeautifulSoupimportpandasaspd#Settingdisplayoptionsforpandaspd.......
  • Chrome 浏览器更新后,我的 python tagui 代码工作不稳定。问题的解决方法是什么
    我编写了一个pythontagui脚本来在chrome中操作Intranet网页。它运行良好。但是在chrome浏览器更新后,脚本每次都会在某个时刻随机停止,并且也不会抛出错误。请帮忙。我尝试重新启动电脑,但这并没有解决问题。Chrome浏览器更新后,TagUI脚本工作不稳定的问题可能由以......
  • 如何从另一个文件运行 python 文件
    我正在尝试从另一个名为LoginOrReg的文件运行一个名为HabitTracker的python文件,但是当我这样做时,它会重新运行LoginOrReg文件。我已经尝试过这个classLoginOrReg:def__init__(self,db,cursor,login_username,data):self.db=mysql.connector.......
  • Python的字典和集合
    一、字典1.定义字典字典和列表虽然类似,但是字典是无序的可变序列,并且可以像查字典一样去查找。字典的元素都是成对出现的,每个元素都是由冒号“:”和键值对(“:”左边的称为键或者Key,“:”右边的称为值或者Value)构成的,用“{}”标识,元素之间用逗号“‘,”分隔。字典的键必须是唯一......