Scrapy:先登录表单,然后再使用该会话

2024-06-10 09:56:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正努力做到以下几点:

  1. 登录到一个网页(在我的例子中zendesk.com网站)在
  2. 使用该会话执行一些post请求

事实上,zendesk遗漏了一些api(create/alter宏),我现在需要模拟模拟浏览器会话。在

所以我不是在写蜘蛛,而是在我的脚本进行的时候尝试与网站进行交互。post请求从一开始就不知道,但只在脚本中知道。在

Scrapy文档中,有以下示例来说明如何在scray中使用经过身份验证的会话:

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来实现这一点,或者是否有更适合这项任务的工具?在


Tags: self脚本comlogreturn网站exampleresponse
1条回答
网友
1楼 · 发布于 2024-06-10 09:56:18

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

从那里可以打开所有的页面,例如

^{pr2}$

相关问题 更多 >