我最近开始使用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_page
,download_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的请求卡在重定向中的原因,因为它可能不是围绕一次性访问场景构建的。