-1

如何进行表单登录,然后使用scrapy处理该会话?

例如,考虑一个具有登录身份验证的网站,它具有与登录会话链接的三个不同页面。所以使用scrapy,首先登录,然后在主页上抓取一些,然后点击主页上可用的特定链接,点击链接并从该页面抓取。然后再次返回主页,点击另一个链接,依此类推。我有一个文件ccbank_spider.py,下面是内容

class LoginSpider(BaseSpider):

 #some code

 #for hitting and parsing of the Account URL
 for accountURL in (strip(s) for itemArr in items for s in itemArr['accountURL']):
    print accountURL
    yield request(accountURL, callback=self.account_transactions)

 def account_transactions(self, response):
  print 'print text'
  return None

我收到以下错误

          File "D:\NextGen\workspace\tutorial\tutorial\spiders\ccbank_spider.py", line       45, in after_login
       yield request(accountURL, callback=self.account_transactions)
   exceptions.TypeError: 'module' object is not callable
4

1 回答 1

0

这是来自关于您的第一个问题(登录)的文档:

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

至于您问题的另一部分,您可以抓取所有您想要的链接,也可以抓取表单主页并为每个新请求执行:

request = Request(url_to_scrape, callback=self.parse_item)
    request.meta['language'] = "eng"
    yield request

然后你在这个例子的 parse_item 中解析那个页面,你也可以向它发送元信息,如你所见。

于 2012-07-17T11:46:17.950 回答