Scrapy:执行登录,然后使用该会话

时间:2012-07-12 05:54:10

标签: python scrapy

我正在尝试执行以下操作:

  1. 登录网页(在我的案例中为zendesk.com)
  2. 使用该会话进行一些发布请求
  3. 事实上,zendesk错过了一些apis(创建/更改宏),我现在需要模拟模拟浏览器会话。

    因此,我不是在编写蜘蛛,而是在我的脚本继续进行时尝试与网站进行交互。帖子请求从一开始就不知道,但仅在我的脚本中。

    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实现这一目标,还是有更适合这项任务的工具?

1 个答案:

答案 0 :(得分:1)

非常感谢@wawaruk。基于stackoverflow帖子,您链接了我提出的解决方案:

import urllib, urllib2, cookielib, re

zendesk_subdomain = 'mysub'
zendesk_username = '...'
zendesk_password = '...'

cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
resp = opener.open('http://%s.zendesk.com/access/unauthenticated' % (zendesk_subdomain))
s = resp.read()
data = dict()
data['authenticity_token'] = re.findall('<input name="authenticity_token" type="hidden" value="([^"]+)"', s)[0]
data['return_to'] = 'http://%s.zendesk.com/login' % zendesk_subdomain
data['user[email]'] = zendesk_username
data['user[password]'] = zendesk_password
data['commit'] = 'Log in'
data['remember_me'] = '1'

opener.open('https://localch.zendesk.com/access/login', urllib.urlencode(data))

从那里开启所有页面都可以被访问,例如

opener.open('http://%s.zendesk.com/rules/new?filter=macro' % zendesk_subdomain)