2012-02-09 17 views
0

私はPython開発者にとって少し新しいです。私はいくつかのWebスクレイピングのためのより大きなプロジェクトを作成しています。私はこれを可能な限り「Pythonically」としてアプローチしたいと思いますし、プロジェクトの構造についていくつかの助けに感謝します。 、基本的に、私は目的のWebサイトにアクセスして、独自の配列にそれにいくつかの特定のデータを解析することで、オブジェクトの基本クラスを持っているPython OOP Project Organization

ジョブ[]

:ここで私は今それをやっている方法ですminion.py

class minion: 

# Empty getJobs() function to be defined by object pre-instantiation 
def getJobs(self): 
    pass 

# Constructor for a minion that requires site authorization 
# Ex: minCity1 = minion('http://portal.com/somewhere', 'user', 'password') 
# or minCity2 = minion('http://portal.com/somewhere') 
def __init__(self, title, URL, user='', password=''): 
    self.title = title 
    self.URL = URL 
    self.user = user 
    self.password = password 
    self.jobs = [] 
    if (user == '' and password == ''): 
      self.reqAuth = 0 
    else: 
     self.reqAuth = 1 

def displayjobs(self): 
    for j in self.jobs: 
     j.display() 

私は約100の異なるデータソースを持っているつもりです。 minCity1.py

:私は今それをやっている方法は、単にそのオブジェクト

例えば(およびバインド)を定義し、各「ミニオン」のために別のモジュール、より多くの仕立てgetJobs()関数を作成することです

minions.py

from minion import minion 
from BeautifulSoup import BeautifulSoup 
import urllib2 
from job import job 

# MINION CONFIG 
minTitle = 'Some city' 
minURL = 'http://www.somewebpage.gov/' 

# Here we define a function that will be bound to this object's getJobs function 
def getJobs(self): 
    page = urllib2.urlopen(self.URL) 
    soup = BeautifulSoup(page) 

    # For each row 
    for tr in soup.findAll('tr'): 
     tJob = job() 
     span = tr.findAll(['span', 'class="content"']) 

     # If row has 5 spans, pull data from span 2 and 3 ([1] and [2]) 
     if len(span) == 5: 
      tJob.title = span[1].a.renderContents() 
      tJob.client = 'Some City' 
      tJob.source = minURL 
      tJob.due = span[2].div.renderContents().replace('<br />', '') 
      self.jobs.append(tJob) 

# Don't forget to bind the function to the object! 
minion.getJobs = getJobs 

# Instantiate the object 
mCity1 = minion(minTitle, minURL) 

Iは、単に(私は私は1つを追加するたびに更新しなければならない)、すべてのインスタンス化された手先のオブジェクトのリストを含む別のモジュールを有します

from minion_City1 import mCity1 
from minion_City2 import mCity2 
from minion_City3 import mCity3 
from minion_City4 import mCity4 

minionList = [mCity1, 
       mCity2, 
       mCity3, 
       mCity4] 

main.pyは、集約されたデータを操作するためのすべてのアクティビティのminionListを参照します。

これは私には少し混乱しているようで、誰かがもっとPythonのアプローチを概説できると思っていました。

ありがとうございました。

+2

[scrapy](http://scrapy.org/)を検討するか、少なくとも[architecture](http://doc.scrapy.org/ja/latest/topics/architecture.html)を調べてください。 )。 –

+0

「これは私にとっては少し混乱しているようですね?どうして?どうやって? **特に**混沌と思われるものを説明してください。あなたは多くのカスタマイズを行っているようです。それ以外にどのようにアプローチすると思いますか? –

答えて

0

関数を作成してオブジェクトに割り当てるのではなく(実際にはminionだとわかりません)、代わりにクラスを使うべきです。次に、各データソースに対して1つのクラスを作成します。

これらのクラスを共通の基本クラスから継承させることもできますが、必ずしもそうである必要はありません。