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 已经升级,现在它包含一个名为(你猜对了)的函数!
显式优于隐式!
我有以下脚本:
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 已经升级,现在它包含一个名为(你猜对了)的函数!
显式优于隐式!