Python ООП — веб-сессия

У меня есть следующий скрипт:

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

Поскольку мой сценарий становится очень большим, я хочу разделить его на классы. Один класс для обработки веб-соединения, один класс для выполнения различных действий и так далее. Из того, что я прочитал, мне нужно что-то вроде:

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()

проблема для меня в том, что я теряю файлы cookie сеанса, когда передаю их в Do_stuff. Может ли кто-нибудь помочь мне с базовым примером классов и взаимодействия, скажем: я вхожу на сайт, просматриваю страницу и хочу сделать что-то вроде re.findall("something", one_that_page). заранее спасибо

Обновление: Основной скрипт:

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

Класс веб-браузера:

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

Текущее состояние: Эта часть работает отлично, я могу войти в систему, но я теряю «плюшки» класса механизированных, такие как открытие, публикация или чтение URL-адреса. Например:

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

все мои куки пропали (ошибка: необходимо авторизоваться)

Как я могу это исправить?


person BlueDotRo    schedule 27.03.2015    source источник


Ответы (2)


Класс «mechanise.Browser» имеет все функции, которые вы хотите добавить в свой класс «Web_session» (примечание: соглашения об именах и готовность к использованию вместо этого рекомендуют «WebSession»).

В любом случае, вы сохраните файлы cookie, если сохраните один и тот же объект браузера для вызовов — если вы действительно хотите иметь другой класс-оболочку, просто создайте mehcanize.Broser при создании экземпляра класса Web_session и сохраните его как атрибут объекта (например, как " селф.браузер") .

Но вам, скорее всего, не нужно этого делать — просто создайте браузер на __init__ вашего Do_stuff, сохраните его как атрибут экземпляра и повторно используйте для всех запросов —

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)
person jsbueno    schedule 27.03.2015
comment
Спасибо, но у меня другие проблемы. Я объясняю их в своем исходном посте. Не могли бы быть так любезны, чтобы дать дальнейшие выводы. - person BlueDotRo; 27.03.2015
comment
Я решил проблему. Я возился со звонками. Большое спасибо! - person BlueDotRo; 28.03.2015

Никогда не используйте конструкцию 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()
...

Внезапно они получили ошибку AttributeError при вызове util.some_function, которая годами работала как чудо. Как бы они ни смотрели на код, они не могли понять, что не так. Прошло много времени, прежде чем кто-то понял, что matplotlib был обновлен, и теперь он содержит функцию под названием (как вы уже догадались) util!

Явное лучше неявного!

person Magnus Lyckå    schedule 27.03.2015
comment
Спасибо за совет. Я буду использовать его. Извините, у меня недостаточно сил, чтобы поставить вам большой палец вверх - person BlueDotRo; 28.03.2015