1

我是一名初学者 python 程序员,我正在使用 python 2.7 开发一个 selenium 项目。

我有一个通用的爬虫脚本,它基本上概述了我想要对我访问的所有网站执行的操作。但是,由于我要获取的数据的性质,我不能在每个站点上运行相同的代码——每个站点都需要运行它自己的单独代码。

我试图通过在 if 语句中导入来解决这个问题,这就是我想出的解决方案:

site = False
if source_website == "Website A":
    from website_a import *
    site = True
elif source_website == "Website B":
    from website_b import *
    site = True
else:
    print "This is not an acceptable website!"

if site == True:
    # main code block
    driver = driver_setup(chrome)
    driver.get(source_website_URL)
    stuff_to_save = do_some_stuff(driver)
    xml_file(stuff_to_save)
    driver.quit()

其中website_awebsite_b模块都具有名为 的函数do_some_stuff,并且它们执行特定于它们所在网站的操作。现在,这似乎在大多数情况下都有效。我似乎也能够将功能扩展到任意数量的网站,因为我编写了一个website_c使用 function调用的模块do_some_stuff,并将其添加到条件导入中。

所以,我的问题是,这是个好主意吗?有没有更好的方法来做这样的事情?

从字面上看,我从未见过有人在这样的 if 语句中包装 import 语句——通常,如果似乎没有人这样做,通常有一个很好的理由。

4

2 回答 2

2

一般来说,from somewhere import *由于命名空间污染,这不是一个好主意。如果您想在单独的模块中使用特定于网站的代码,为什么不做类似的事情

import importlib

website_modules = {'Website A': 'website_a', 'Website B': 'website_b'}

# ...

website = importlib.import_module(website_modules[source_website])

# use with website.function_name
于 2012-07-31T21:32:36.170 回答
1

探索页面对象模型模式 (http://code.google.com/p/selenium/wiki/PageObjects)。您应该将每个页面建模为一个唯一的实体,然后有一些逻辑来确定您正在显示的页面类型(通过让您明确指定它或通过检查 URL 和页面内容来隐式地显示),然后公开要捕获的方法您需要在这些对象上的数据,而不是直接使用 webdriver 实例。您最终应该瞄准以下目标:

for page_identifier in ['page1', 'page2', 'page3']:
    page = navigate_to(page_identifier)
    extracted_data = page.get_data()
    xml_file.write(extracted_data)
于 2012-07-31T21:44:57.640 回答