使用scrapy登录不起作用

时间:2016-12-22 02:40:25

标签: web-scraping scrapy scrapy-spider

我最近开始使用this page,并且正在设置一个典型的抓取需要身份验证的网页的任务。

我的想法是从登录页面开始,提交表单,然后从其他登录受保护的页面下载数据。

我可以看到我已经过身份验证,但是,我发现当它进入下载页面时,我陷入了重定向循环。

我的蜘蛛类如下所示:

class MySpiderWithLogin(Spider):
    name = 'my-spider'

    download_url = 'https://example.com/files/1.zip'

    login_url = 'https://example.com/login'

    login_user = '...'
    login_password = '...'

    def start_requests(self):
        # let's start by sending a first request to login page
        yield Request(self.login_url, self.parse_login)

    def parse_login(self, response):
        # got the login page, let's fill the login form...
        return FormRequest.from_response(response,
                           formdata={'username': self.login_user, 'password': self.login_password},
                           callback=self.start_crawl,
                           dont_filter = True)


    def start_crawl(self, response):
        # OK, we're in, let's start crawling the protected pages
        yield Request(self.download_url, dont_filter = True)

    def parse(self, response):
        # do stuff with the logged in respons
        inspect_response(response, self)
        return

运行蜘蛛后我看到的是一个重定向循环,如下所示。我已经抽象了login_pagedownload_page和一些查询参数,即ticket,jsession_id,cas_check

2016-12-21 18:06:36 [scrapy] DEBUG: Redirecting (302) to <GET <login_page>>
2016-12-21 18:06:39 [scrapy] DEBUG: Crawled (200) <GET <login_page>>
2016-12-21 18:06:39 [scrapy] DEBUG: Redirecting (302) to <GET <login_page/j_spring_cas_security_check;jsessionid=bar?ticket=foo> from <POST <login_page/j_spring_cas_security_check;jsessionid=bar?ticket=foo>
2016-12-21 18:06:42 [scrapy] DEBUG: Redirecting (302) to <GET home_page>
2016-12-21 18:06:44 [scrapy] DEBUG: Crawled (200) <GET <home page>>
2016-12-21 18:06:44 [scrapy] DEBUG: Redirecting (302) to <GET login_page>>from <GET download_page>
2016-12-21 18:06:47 [scrapy] DEBUG: Redirecting (302) to < download_page?ticket=biz> from <GET login_page>
2016-12-21 18:06:50 [scrapy] DEBUG: Redirecting (302) to <GET download_page> from <GET download_page?ticket=biz>
2016-12-21 18:06:54 [scrapy] DEBUG: Redirecting (302) to <GET login_page>>from <GET download_page>
....
....
2016-12-21 18:07:34 [scrapy] DEBUG: Discarding <GET download_page?ticket=biz_100>: max redirections reached

我已将用户代理设置为settings.py中的浏览器,但此处无效。有什么想法可能是错的吗?

以下是来自浏览器的成功请求的登录表单的有效负载以供参考:

url: login_page/jsessionid=...?service=../j_spring_cas_security_check%3Bjsessionid%3D...
method: POST
payload:
    - username: ...
    - password: ...
    - lt: e1s1
    - _eventId: submit
    - submit: Sign In

更新

使用python的请求库就像对同一个url的魅力一样。此外值得一提的是,该网站使用scrapy进行身份验证,这使得下载URL可以一次性访问给定的票证。对于任何进一步的访问,需要发出新的票证。

我猜这可能是Scrapy的请求卡在重定向中的原因,因为它可能不是围绕一次性访问场景构建的。

0 个答案:

没有答案