我对Python有点陌生--我正在为一些web抓取创建一个更大的项目。我希望尽可能地将其作为“project”来处理,并希望对项目结构提供一些帮助。我现在是这样做的:
基本上,我有一个对象的基类,它的目的是访问一个网站并将其中的一些特定数据解析到它自己的数组jobs[]中。
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个不同的数据源。我现在要做的就是为每个"Minion“创建一个单独的模块,它为该对象定义(并绑定)一个定制的getJobs()函数
示例: minCity1.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)
我还有一个单独的模块,它只包含所有实例化的minion对象的列表(每次添加一个都必须更新这些对象):
minions.py
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。
这在我看来有点混乱,我希望有人能勾勒出一种更毕达通的方法。
谢谢你,很抱歉给你这么长的邮件!
发布于 2012-02-09 19:48:12
与其创建函数并将它们分配给对象(或任何minion
,我不太确定),您应该使用类来代替。然后,您将为每个数据源创建一个类。
如果需要,甚至可以从公共基类继承这些类,但这并不是绝对必要的。
https://stackoverflow.com/questions/9217591
复制相似问题