1

私は次のことをしようとしています:

  1. Webページ(私の場合はzendesk.com)にログインします
  2. そのセッションを使用して、いくつかの投稿リクエストを実行します

実際、zendeskはいくつかのAPI(作成/変更マクロ)を見逃しており、ブラウザーセッションのシミュレーションをシミュレートする必要があります。

ですから、私はスパイダーを書いているのではなく、スクリプトが進むにつれてWebサイトと対話しようとしています。投稿リクエストは最初からわかりませんが、私のスクリプトの間だけです。

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...

しかし、これはスクレイピングでのみ機能するように見えますが、私の場合は、セッションを「保持」して、そのセッションでさらに作業したいと思います。スクレイプでこれを達成する方法はありますか、それともこのタスクにより適したツールがありますか?

4

1 に答える 1

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)
于 2012-07-16T05:15:58.460 に答える