使用scrapy AUTH解析XML文件

时间:2012-03-01 11:44:13

标签: python xml authentication scrapy

我的问题是当我需要授权访问它时,我不知道如何从xml文件中删除。

所以我的xml文件在url =“ftp://ftp.Dom.com/BlaBla/”user =“我自己”传递=“秘密”。

在scrapy的文档中,我发现了类似于html的内容,我尝试根据自己的需要调整它。

这是我的代码atm:

class kelly(XMLFeedSpider):
   name = "kelly"
   allowed_domains = []
   start_urls = ["ftp://ftp.Dom.com/BlaBla/"]
   itertag='Job'

   def __init__(self, name=None, **kwargs):
      XMLFeedSpider.__init__(self)
      self.secret_users = {}
      pipe_import = ImportLaunch()
      pipe_import.pipe = Pipe.objects.first()
      pipe_import.save()
      self.pipe_import = pipe_import

   def parse_node(self, response):
      import pdb
      pdb.set_trace()
      return [FormRequest.from_response(response,
                    formdata={'username': 'myself', 'password': 'secret'},
                    callback=self.parse_after_log)]


   def parse_after_log(self,response):
      # check login succeed before going on
      if "authentication failed" in response.body:
         self.log("Login failed", level=log.ERROR)
         return
         # We've successfully authenticated, let's have some fun!
      else:
         return Request(url="ftp://ftp.Dom.com/BlaBla/kelly_polarbear.xml", callback=self.parse_tastypage)

   def parse_tastypage(self,response,node):
      print 'I passed !!' 

但我的信息仍然是

`2012-03-01 12:27:28+0100 [kelly] ERROR: Error downloading <GET ftp://ftp.kellyservices.com`/Polarbear/>: 530 User anonymous cannot log in.

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

如何更简单的方法?

import requests
from lxml import objectify

r = requests.get('http://www.example.com/', auth('username','password'))
root = objectify.fromstring(r.result)

# Now root is an object tree representing your XML

答案 1 :(得分:0)

未与XMLFeedSpider合作,但与BaseSpider inheritsXMLFeedSpider合作。

您的.xml文件位于ftp服务器上,但FormRequest会创建HTTP POST请求,当加载带有身份验证表单的页面时,该请求通常来自parse方法。所以我认为这不会起作用。

传递HttpAuthMiddlewarebasic access authentication,但看起来它不适用于FTP(尽管你可以试试)。

我认为解决方案是编写自己的下载中间件,它将使用(尚未尝试过)从FTP服务器下载文件:

urllib2.urlopen("ftp://user:password@host.example.com/rest/of/the/url")