我对Python开发人员有点新鲜 - 我正在为一些网络抓取创建一个更大的项目。我希望以#34; Python的方式来解决这个问题。尽可能地,并希望对项目结构有所帮助。以下是我现在的表现:
基本上,我有一个对象的基类,其目的是访问一个网站并将其上的一些特定数据解析为自己的数组,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,用于处理聚合数据的所有活动。
这对我来说似乎有点混乱,并希望有人能够勾画出更多的Pythonic方法。
谢谢你,对不起这篇长篇文章感到抱歉!
答案 0 :(得分:0)
不是创建函数并将它们分配给对象(或者minion
,我不是很确定),你应该使用类来代替。然后,您将为每个数据源创建一个类。
如果需要,您甚至可以让这些类继承自公共基类,但这并非绝对必要。