当前位置: 首页 > 面试题库 >

使用urllib2的Python表单POST(也是有关保存/使用Cookie的问题)

子车安和
2023-03-14
问题内容

我正在尝试编写一个函数来发布表单数据并将返回的cookie信息保存在文件中,以便下次访问该页面时,该cookie信息被发送到服务器(即正常的浏览器行为)。

我使用curlib在C ++中相对容易地编写了此代码,但是花了整整一天的时间尝试使用urllib2在Python中编写此代码-仍然没有成功。

这是我到目前为止所拥有的:

import urllib, urllib2
import logging

# the path and filename to save your cookies in
COOKIEFILE = 'cookies.lwp'

cj = None
ClientCookie = None
cookielib = None


logger = logging.getLogger(__name__)

# Let's see if cookielib is available
try:
    import cookielib
except ImportError:
    logger.debug('importing cookielib failed. Trying ClientCookie')
    try:
        import ClientCookie
    except ImportError:
        logger.debug('ClientCookie isn\'t available either')
        urlopen = urllib2.urlopen
        Request = urllib2.Request
    else:
        logger.debug('imported ClientCookie succesfully')
        urlopen = ClientCookie.urlopen
        Request = ClientCookie.Request
        cj = ClientCookie.LWPCookieJar()

else:
    logger.debug('Successfully imported cookielib')
    urlopen = urllib2.urlopen
    Request = urllib2.Request

    # This is a subclass of FileCookieJar
    # that has useful load and save methods
    cj = cookielib.LWPCookieJar()


login_params = {'name': 'anon', 'password': 'pass' }

def login(theurl, login_params):
  init_cookies();

  data = urllib.urlencode(login_params)
  txheaders =  {'User-agent' : 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'}

  try:
    # create a request object
    req = Request(theurl, data, txheaders)

    # and open it to return a handle on the url
    handle = urlopen(req)

  except IOError, e:
    log.debug('Failed to open "%s".' % theurl)
    if hasattr(e, 'code'):
      log.debug('Failed with error code - %s.' % e.code)
    elif hasattr(e, 'reason'):
      log.debug("The error object has the following 'reason' attribute :"+e.reason)
      sys.exit()

  else:

    if cj is None:
      log.debug('We don\'t have a cookie library available - sorry.')
    else:
      print 'These are the cookies we have received so far :'
      for index, cookie in enumerate(cj):
        print index, '  :  ', cookie

      # save the cookies again  
      cj.save(COOKIEFILE)

      #return the data
      return handle.read()



# FIXME: I need to fix this so that it takes into account any cookie data we may have stored
  def get_page(*args, **query):
    if len(args) != 1:
        raise ValueError(
            "post_page() takes exactly 1 argument (%d given)" % len(args)
        )
    url = args[0]
    query = urllib.urlencode(list(query.iteritems()))
    if not url.endswith('/') and query:
        url += '/'
    if query:
        url += "?" + query
    resource = urllib.urlopen(url)
    logger.debug('GET url "%s" => "%s", code %d' % (url,
                                                    resource.url,
                                                    resource.code))
    return resource.read()

当我尝试登录时,我传递了正确的用户名和密码。但是登录失败,并且没有保存cookie数据。

我的两个问题是:

  • 谁能看到login()函数出了什么问题,我该如何解决?
  • 我如何修改get_page()函数以利用我保存的任何cookie信息?

问题答案:

您发布的代码有很多问题。通常,您需要构建一个可以处理重定向,https等的自定义打开器,否则会遇到麻烦。至于cookie本身,您需要在上调用load和save方法cookiejar,并使用子类之一,例如MozillaCookieJarLWPCookieJar

这是我写的用于登录Facebook的课程,当时我在玩愚蠢的网络游戏。我刚刚对其进行了修改,以使用基于文件的cookiejar,而不是内存中的cookiejar。

import cookielib
import os
import urllib
import urllib2

# set these to whatever your fb account is
fb_username = "your@facebook.login"
fb_password = "secretpassword"

cookie_filename = "facebook.cookies"

class WebGamePlayer(object):

    def __init__(self, login, password):
        """ Start up... """
        self.login = login
        self.password = password

        self.cj = cookielib.MozillaCookieJar(cookie_filename)
        if os.access(cookie_filename, os.F_OK):
            self.cj.load()
        self.opener = urllib2.build_opener(
            urllib2.HTTPRedirectHandler(),
            urllib2.HTTPHandler(debuglevel=0),
            urllib2.HTTPSHandler(debuglevel=0),
            urllib2.HTTPCookieProcessor(self.cj)
        )
        self.opener.addheaders = [
            ('User-agent', ('Mozilla/4.0 (compatible; MSIE 6.0; '
                           'Windows NT 5.2; .NET CLR 1.1.4322)'))
        ]

        # need this twice - once to set cookies, once to log in...
        self.loginToFacebook()
        self.loginToFacebook()

        self.cj.save()

    def loginToFacebook(self):
        """
        Handle login. This should populate our cookie jar.
        """
        login_data = urllib.urlencode({
            'email' : self.login,
            'pass' : self.password,
        })
        response = self.opener.open("https://login.facebook.com/login.php", login_data)
        return ''.join(response.readlines())

test = WebGamePlayer(fb_username, fb_password)

设置用户名和密码后,您应该会看到一个文件facebook.cookies,其中包含您的Cookie。实际上,您可能需要对其进行修改,以检查是否有活动的cookie并使用它,如果访问被拒绝,请再次登录。



 类似资料:
  • 本文向大家介绍有关Ajax中get和post的使用问题,包括了有关Ajax中get和post的使用问题的使用技巧和注意事项,需要的朋友参考一下 使用get遇到的问题: 1.问题一. 缓存:当每次访问的url相同,客户端直接读取本地缓存里面的内容,即使后台数据变化前台也不会有变化; 解决方法:在?后面链接一个num=【随机数Math.random()】或者num=【时间戳new Date().get

  • 问题内容: 87 58 如何将Python的Selenium WebDriver中的所有cookie保存到txt文件,然后稍后加载?该文档并没有说太多有关getCookies函数的内容。 问题答案: 你可以使用pickle将当前cookie保存为python对象。例如: 然后再将它们添加回去:

  • 我需要发送数千个帖子请求。我在网上搜索信息,经过多次尝试,我编写了以下解决方案: pushes是一个字典列表。 我将应用程序移植到另一个框架中。问题消失了。 发送请求的源服务器上的代码没有被修改。

  • 问题内容: 发送带有用户名和密码的POST请求后,如何使用Jsoup保存cookie?还是我必须先将它们提供给连接对象然后保存? 问题答案: 假设HTML表单如下所示: 您可以发布它并获取cookie,如下所示: 您可以按以下要求将Cookie传递回去: 或者,如果您知道单个Cookie的名称,则:

  • 阅读了一些例子后,我想实现一个爬虫的帮助转移与登录,如: https://target.helpshift.com/login/?next=/admin/issues/ 但是,我得到这个错误: 线程“main”组织中出现异常。jsoup。HttpStatusException:获取URL时发生HTTP错误。状态=403,URL=https://target.helpshift.com/login/

  • 我正在尝试使用用户对web表单的输入创建一个用户名cookie。然而,它不起作用,我不知道为什么。你知道问题出在哪里吗?