Проблема с логином на Python scrapy

#python #login #scrapy

#python #аутентификация #scrapy

Вопрос:

Я пытаюсь очистить свои личные данные (о путешествиях) с веб-сайта, который требует, чтобы я вошел в свою личную учетную запись. Я использую приведенный ниже паук. Он основан на руководстве и отлично работал в тестах на других веб-сайтах.

Кажется, все работает нормально. Однако страница входа в систему не открывается после open_in_browser(response) -строки (которую я использую в качестве теста). Вместо этого он пытается открыться в моем браузере:

C:/Users/[user]/AppData/Local/Temp/[filename].html

Как ни странно, когда я ввожу неправильный пароль, он действует так, как вы ожидаете (открывает страницу входа и показывает «неправильный пароль». Кроме того, я могу без проблем извлекать данные с помощью Scrapy из общедоступных частей веб-сайта.

Я новичок в scrapy и прочитал много сообщений о проблемах с логином, но на самом деле не могу понять, что происходит. Любые указания на то, что является причиной этого, были бы чрезвычайно признательны.

паук:

 # -*- coding: utf-8 -*-
from scrapy import Spider
from scrapy.http import FormRequest
from scrapy.utils.response import open_in_browser


class QuotesSpider(Spider):
    name = 'quotes'
    start_urls = ('http://login.ns.nl/login',)

    def parse(self, response):
        token = response.xpath('//*[@name="csrfToken"]/@value').extract_first()
        return FormRequest.from_response(response,
                                         formdata={'csrfToken': token,
                                                   'password': '[password]',
                                                   'email': '[email]'},
                                         meta={'dont_redirect': True, 'handle_httpstatus_list': [302]},
                                         callback=self.scrape_pages)

    def scrape_pages(self, response):
        open_in_browser(response)

        # Complete your code here to scrape the pages that you are redirected to after logging in

        # ....
        # ....
  

и вывод окна командной строки:

 2019-03-21 10:43:50 [scrapy.utils.log] INFO: Scrapy 1.5.2 started (bot: scrapy_login)
2019-03-21 10:43:50 [scrapy.utils.log] INFO: Versions: lxml 4.2.5.0, libxml2 2.9.8, cssselect 1.0.3, parsel 1.5.1, w3lib 1.20.0, Twisted 18.9.0, Python 3.7.1 (default, Dec 10 2018, 22:54:23) [MSC v.1915 64 bit (AMD64)], pyOpenSSL 18.0.0 (OpenSSL 1.1.1a  20 Nov 2018), cryptography 2.4.2, Platform Windows-10-10.0.17763-SP0
2019-03-21 10:43:50 [scrapy.crawler] INFO: Overridden settings: {'BOT_NAME': 'scrapy_login', 'NEWSPIDER_MODULE': 'scrapy_login.spiders', 'ROBOTSTXT_OBEY': True, 'SPIDER_MODULES': ['scrapy_login.spiders']}
2019-03-21 10:43:51 [scrapy.extensions.telnet] INFO: Telnet Password: be649c379dcca999
2019-03-21 10:43:51 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.corestats.CoreStats',
 'scrapy.extensions.telnet.TelnetConsole',
 'scrapy.extensions.logstats.LogStats']
2019-03-21 10:43:52 [scrapy.middleware] INFO: Enabled downloader middlewares:
['scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware',
 'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware',
 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware',
 'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware',
 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware',
 'scrapy.downloadermiddlewares.retry.RetryMiddleware',
 'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware',
 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware',
 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware',
 'scrapy.downloadermiddlewares.cookies.CookiesMiddleware',
 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware',
 'scrapy.downloadermiddlewares.stats.DownloaderStats']
2019-03-21 10:43:52 [scrapy.middleware] INFO: Enabled spider middlewares:
['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware',
 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware',
 'scrapy.spidermiddlewares.referer.RefererMiddleware',
 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware',
 'scrapy.spidermiddlewares.depth.DepthMiddleware']
2019-03-21 10:43:52 [scrapy.middleware] INFO: Enabled item pipelines:
[]
2019-03-21 10:43:52 [scrapy.core.engine] INFO: Spider opened
2019-03-21 10:43:52 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2019-03-21 10:43:52 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
2019-03-21 10:43:52 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (307) to <GET https://login.ns.nl> from <GET http://login.ns.nl/robots.txt>
2019-03-21 10:43:52 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://login.ns.nl> (referer: None)
2019-03-21 10:43:52 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (307) to <GET https://login.ns.nl> from <GET http://login.ns.nl/login>
2019-03-21 10:43:52 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://login.ns.nl> (referer: None)
2019-03-21 10:43:53 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (302) to <GET https://login.ns.nl/sessions/new> from <POST https://login.ns.nl/login>
2019-03-21 10:43:53 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (302) to <GET https://www.ns.nl/mijnns> from <GET https://login.ns.nl/sessions/new>
2019-03-21 10:43:54 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.ns.nl/robots.txt> (referer: None)
2019-03-21 10:43:54 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.ns.nl/mijnns> (referer: https://login.ns.nl)
2019-03-21 10:43:54 [scrapy.core.engine] INFO: Closing spider (finished)
2019-03-21 10:43:54 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 2189,
 'downloader/request_count': 8,
 'downloader/request_method_count/GET': 7,
 'downloader/request_method_count/POST': 1,
 'downloader/response_bytes': 35958,
 'downloader/response_count': 8,
 'downloader/response_status_count/200': 4,
 'downloader/response_status_count/302': 2,
 'downloader/response_status_count/307': 2,
 'finish_reason': 'finished',
 'finish_time': datetime.datetime(2019, 3, 21, 9, 43, 54, 867531),
 'log_count/DEBUG': 9,
 'log_count/INFO': 8,
 'request_depth_max': 1,
 'response_received_count': 4,
 'scheduler/dequeued': 5,
 'scheduler/dequeued/memory': 5,
 'scheduler/enqueued': 5,
 'scheduler/enqueued/memory': 5,
 'start_time': datetime.datetime(2019, 3, 21, 9, 43, 52, 233556)}
2019-03-21 10:43:54 [scrapy.core.engine] INFO: Spider closed (finished)
  

Комментарии:

1. Попробуйте добавить meta={'dont_redirect': True, 'handle_httpstatus_list': [302]} в свой запрос FormRequest.from_response.from_response. Затем при обратном вызове, если вы попытаетесь получить любой другой URL (например, ваш профиль), вы должны войти в систему.

2. Спасибо за быстрый ответ @Sewake! Я обновил код в исходном сообщении. Боюсь, я не полностью следую второй части. Как бы мне получить другой URL? В этом случае это было бы » ns.nl/mijnns#/dashboard » (извините за, вероятно, глупые вопросы. Я совершенно новичок в Python / Scrapy, поскольку только немного использую Rstudio).

3. Если я вас правильно понимаю, при использовании open_in_browser метода вы ожидаете, что Scrapy откроет новую вкладку с реальным URL в адресной строке браузера? Этот метод используется только для отладки spiders, поэтому он всегда будет пытаться открыть файл (который является ответом, загруженным Scrapy), даже если вы вводите неправильный пароль

4. Вы правы @Sewake Используя его с другими тестовыми веб-сайтами, он действительно открыл страницу пользователя (страницу, на которую вы попадаете после входа в систему) в моем браузере Chrome. Тем не менее, с этой страницей это не так. Что делает это более запутанным, так это то, что если я ввожу неправильный пароль в spider, он «правильно» открывает страницу входа в браузере, отображая то же сообщение, которое вы получили бы после ручного ввода неправильного пароля. Это заставляет меня думать, что проблема не в самом логине (который, кажется, работает нормально), а в (новом) URL, который используется для последующего действия (очистка, открытие страницы)

5. Просто для пояснения: открытие страницы в моем браузере не является целью этого проекта. До сих пор я просто использовал это в качестве теста, чтобы увидеть, был ли логин успешным. Цель состоит в том, чтобы удалить данные о путешествиях с панели управления пользователя, на которую вы перенаправлены после входа в систему.