一个与autologin一起使用的Scrapy中间件
项目描述
这是一个Scrapy中间件,使用autologin http-api来维护scrapy爬虫的登录状态。
自动登录中间件使用autologin在登录状态下发送所有请求。它使用autologin获取cookies,检测登出并尝试在未来避免它们。假设爬虫有一个单独的授权域。自动登录中间件还将autologin_active放入request.meta中,只有在我们登录时(如果域被跳过或登录失败则为False)才为True。如果通过splash(并且设置了SPLASH_URL)发送请求,自动登录中间件将其传递给autologin,并且此splash实例也用于获取登录cookies。
安装
它适用于python 2.7和python 3,并至少需要scrapy 1.1。使用pip安装
pip install autologin-middleware
配置
将自动登录中间件包含到项目设置中并指定autologin url
AUTOLOGIN_URL = 'http://127.0.0.1:8089' AUTOLOGIN_ENABLED = True DOWNLOADER_MIDDLEWARES['autologin_middleware.AutologinMiddleware'] = 605
还需要支持cookies。目前有几个选项
scrapy cookie 中间件(COOKIES_ENABLED = True),但自动登录中间件需要访问 cookies,因此您需要启用自定义 cookie 中间件
DOWNLOADER_MIDDLEWARES = { 'autologin_middleware.AutologinMiddleware': 605, 'scrapy.downloadermiddlewares.cookies.CookiesMiddleware': None, 'autologin_middleware.ExposeCookiesMiddleware': 700, }scrapy-splash cookie 中间件(scrapy_splash.SplashCookiesMiddleware)
任何其他从 request.cookies 获取 cookies 并设置 response.cookiejar,如 scrapy-splash 中间件,或将其暴露在 response.flags 中,如 ExposeCookiesMiddleware。
可选但强烈推荐:避免注销 - 请参阅下面的可选设置和“避免注销”部分。这之所以重要,是因为注销检测不够稳健,在某些网站上,旧的 cookies 仍然有效,因此您将使用多个会话等。如果您从不注销,就可以避免所有这些问题。
有一些可选设置
AUTOLOGIN_COOKIES:手动登录后传递认证 cookies(格式为 name=value; name2=value2)。
AUTOLOGIN_LOGOUT_URL:传递要避免的 URL 子串。
AUTOLOGIN_CHECK_LOGOUT:设置为 False 以禁用自动注销检测:它记住在登录期间获得的 cookies,并在每个响应上检查它们是否已消失。对于在登录时设置大量 cookies 的网站,这可能是一个选项来禁用它。如果您禁用它,您必须依靠使用 link_looks_like_logout(见下文)避免注销链接,或设置自定义 AUTOLOGIN_LOGOUT_URL。
AUTOLOGIN_USERNAME、AUTOLOGIN_PASSWORD、AUTOLOGIN_LOGIN_URL、AUTOLOGIN_EXTRA_JS 将传递给自动登录并覆盖存储凭据的值。《span class="docutils literal">AUTOLOGIN_LOGIN_URL 是一个相对 URL,如果它与起始 URL 相同,则可以省略。《span class="docutils literal">AUTOLOGIN_EXTRA_JS 仅在您想使用自动登录的 extra_js 功能时才需要。
也可以通过 request.meta 中相应的下划线键来按请求覆盖一些设置: autologin_username、autologin_password、autologin_extra_js、autologin_login_url 和 autologin_logout_url。
自动登录中间件将以下设置传递给自动登录: SPLASH_URL、USER_AGENT、HTTP_PROXY、HTTPS_PROXY,因此它们用于自动登录请求。
避免注销
还有一个名为 autologin_middleware.link_looks_like_logout 的实用工具,用于检查链接是否看起来像注销链接:您可以在蜘蛛中使用它来避免注销链接。注销默认由自动登录中间件处理(除非 AUTOLOGIN_CHECK_LOGOUT 为 False),但避免注销链接有两个好处
不浪费时间去重试已经注销的请求
在某些情况下,注销 URL 可能是唯一的,蜘蛛将不断注销(例如,/logout?sid=UNIQUE_ID)。
API
没有特殊的 API:自动登录中间件只是确保在登录状态下执行所有请求。如上所述的“配置”部分中提到,您可以在 reqeuest.meta 中按请求覆盖一些设置。
如果我们在处理此请求时向自动登录发送了请求,则自动登录响应将可用在 response.meta['autologin_response'] 中。您可能想使用自动登录响应的 "status" 字段来进行一些记录。
中间件也始终将"autologin_active"放入response.meta中,只有在登录成功的情况下True才为真(如果跳过域名或登录失败则为False)。
此外,您可以在request.meta中将skip_autologin键设置为True,以完全禁用此请求的中间件。
与Splash的使用
自动登录中间件通过scrapy-splash支持splash,但正确设置一切可能比较棘手。
首先,您需要指定以下设置(有关更多详细信息,请参阅scrapy-splash文档)
SPLASH_URL = 'http://127.0.0.1:8050' SPIDER_MIDDLEWARES = { 'scrapy_splash.SplashDeduplicateArgsMiddleware': 100, } DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter' DOWNLOADER_MIDDLEWARES = { 'autologin_middleware.AutologinMiddleware': 605, 'scrapy_splash.SplashCookiesMiddleware': 723, 'scrapy_splash.SplashMiddleware': 725, 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810, }
其次,您需要向splash发送请求并传递cookies,使用splash:init_cookies(splash.args.cookies),并使用splash:get_cookies()将它们返回到cookies字段。如果您已经使用了一个splash脚本(execute端点),请相应地修改您的脚本。但如果您只想使用splash进行爬取,可以使用autologin_middleware.splash.splash_request而不是scrapy.Request。它有一个最小的lua脚本,传递cookies并返回html,因此您不需要在您的蜘蛛中做任何其他更改。
开发
您需要启动autologin-http-api(来自autologin),以及splash(最简单的选项是运行docker run -p 8050:8050 scrapinghub/splash)。
使用tox运行测试
tox
当使用Docker在OS X和Windows上运行Splash时,它将在非默认地址上启动,因此在运行测试时需要指定它,例如
SPLASH_URL=http://192.168.99.100:8050 tox
许可
许可证是MIT。
项目详情
autologin-middleware-0.1.6.tar.gz的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | c54ca6ea07fc1ed25ffd73010c52f19fece0c6823e0a55ae5fd4e9f76ff6cb09 |
|
MD5 | f59fc5b320346e8e18fc20ee794c87ec |
|
BLAKE2b-256 | 55028c35b5b79debdd42fb0e711d59392bab75a80fc71c595aaca2a4969ee2e6 |