Python Scrapy:进行表单登录,然后处理该会话

Python Scrapy:进行表单登录,然后处理该会话,python,scrapy,Python,Scrapy,我正在努力做到以下几点: 登录一个网页(在我的例子中是zendesk.com) 使用该会话执行一些post请求 事实上,zendesk遗漏了一些API(创建/更改宏),我现在需要这些API来模拟浏览器会话 所以我不是在写蜘蛛,而是在脚本编写过程中尝试与网站交互。post请求从一开始就不知道,只是在我的脚本中才知道 在文档中,有以下示例说明如何在Scrapy中使用经过身份验证的会话: class LoginSpider(BaseSpider): name = 'example.com' s

我正在努力做到以下几点:

  • 登录一个网页(在我的例子中是zendesk.com)
  • 使用该会话执行一些post请求
  • 事实上,zendesk遗漏了一些API(创建/更改宏),我现在需要这些API来模拟浏览器会话

    所以我不是在写蜘蛛,而是在脚本编写过程中尝试与网站交互。post请求从一开始就不知道,只是在我的脚本中才知道

    在文档中,有以下示例说明如何在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实现这一点,或者有没有更适合这项任务的工具?

    非常感谢@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))
    

    非常感谢@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))
    

    我认为scrapy不适合你。scrapy是用来刮的,登录并“保留”它是没有意义的。尝试使用urllib登录:我不认为scrapy是适合您的工具。scrapy是用来刮的,登录并“保留”它是没有意义的。尝试使用urllib登录:mechanize可以进一步简化您的生活:我最终将其打包成一个类并添加了方法处理(尤其是添加zendesk宏时需要PUT):mechanize可以进一步简化您的生活:我最终将其打包成一个类并添加了方法处理(尤其是添加zendesk宏时需要PUT):