Python OOP - 网络会话

Python OOP - web session

我有以下脚本:

import mechanize, cookielib, re ...
br = mechanize.Browser()
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)
br.addheaders = ....
and do stuff

因为我的脚本变得非常大,所以我想将它分成 classes。一个 class 处理网络连接,一个 class 做一些事情等等。 根据我的阅读,我需要类似的东西:

from web_session import * # this my class handling web-connection (cookies + auth)
from do_stuff import * # i do stuff on web pages

我主要有:

browser = Web_session()
stuff = Do_stuff()

我的问题是,当我将它传递给 Do_stuff 时,我丢失了会话 cookie。谁能帮我举一个 classes 和交互的基本例子,比方说:我在网站上登录,浏览一个页面,我想做一些类似 re.findall("something", one_that_page)。提前致谢

更新: 主要脚本:

br = WebBrowser()
br.login(myId, myPass)

网络浏览器class:

class WebBrowser():

def __init__(self):
    self.browser = mechanize.Browser()
    cj = cookielib.LWPCookieJar()
    self.browser.set_cookiejar(cj)
    self.browser.addheaders = ....

def login(self, username, password):
    self.username = username
    self.password = password
    self.browser.open(some site)
    self.browser.submit(username, password)

def open(self, url):
    self.url = url
    self.browser.open(url)

def read(self, url):
    self.url = url
    page = self.browser.open(url).read()
    return page

当前状态: 这部分工作完美,我可以登录,但我失去了机械化 class "goodies" 就像打开,post o 阅读 url。 例如:

management = br.read("some_url.php")

我所有的 cookie 都不见了(错误:必须登录)

我该如何解决?

"mechanise.Browser" class 具有您希望在 "Web_session" class 上添加的所有功能(旁注 - 命名约定和易用性会推荐 "WebSession" 代替)。

无论如何,如果您在调用中保持相同的浏览器对象,您将保留您的 cookie - 如果您真的想要另一个包装器 class,只需在实例化您的 [=23] 时创建一个 mehcanize.Broser =] class,并将其保留为对象属性(例如,作为 "self.browser")。

但是,您很可能不需要这样做 - 只需在 Do_stuff 的 __init__ 上创建一个浏览器,将其保留为实例属性,然后将其重新用于所有请求-

class DoStuff(object):
   def __init__(self):
      self.browser = mechanize.Browser()
      cj = cookielib.LWPCookieJar()
      self.browser.set_cookiejar(cj)

   def login(self, credentials):
      self.browser.post(data=credentials)

   def  match_text_at_page(self, url, text):
      # this will use the same cookies as are used in the login
      req = self.browser.get(url)
      return re.findall(text, req.text)

切勿使用 from X import * 中的构造

from web_session import *
from do_stuff import *

在交互式会话中进行试验时没问题,但不要在代码中使用它。

假设如下:在 web_session.py 中,您有一个名为 my_function 的函数,您在主模块中使用该函数。在 do_stuff.py 中,您有一个导入语句 from some_lib_I_found_on_the_net import *。一切都很好,但过了一会儿,您的程序莫名其妙地失败了。原来你升级了some_lib_I_found_on_the_net.py,新版本包含了一个叫做my_function的函数。您的主程序突然调用 some_lib_I_found_on_the_net.my_function 而不是 web_session.my_function。 Python 对分离关注点有很好的支持,但是使用这种懒惰的构造,你只会搬起石头砸自己的脚,此外,能够查看你的代码并查看每个对象的来源真是太好了,你没有 *.

如果您想避免像 web_session.myfunction() 这样的长内容,请执行 import web_session as ws 然后 ws.my_function()from web_session import my_function, ...

即使你以这种方式只导入一个模块,它也会咬你一口。我的同事有类似...

...
import util
...
from matplotlib import *
...
(a few hundred lines of code)
...
x = util.some_function()
...

突然,他们在调用 util.some_function 时遇到了一个 AttributeError,这多年来一直是一个魅力。然而他们看着代码,他们不明白哪里出了问题。过了很长时间,才有人意识到 matplotlib 已经升级,现在它包含一个名为(你猜对了)的函数!

显式优于隐式!