gpt4 book ai didi

python - 针对彼此差异很大但处理相似的功能进行模式和设计

转载 作者:行者123 更新时间:2023-11-28 22:06:09 24 4
gpt4 key购买 nike

我正在编写一些 Python 代码来抓取网站,我最终会得到越来越多的自定义抓取器集合,每个抓取器大约有 50 行长,并从特定网站定制提取特定信息。

我的程序的第一个迭代是一个巨大的文件,它以一个网站作为参数,如果它识别该网站并为其提供自定义代码(使用一个巨大的 case 语句来检查它是否识别该网站),则抓取该网站。

显然,这不是一个很好的设计,所以我想做的是将自定义抓取函数拉到它们自己的文件/类中,并有一个小脚本,我可以用它来按名称调用它们。例如:

scrape.py --site google

我想要一个类似于以下的文件结构:

scrape.py
sites/
google.py
yahoo.py
...
bing.py

我还没有掌握面向对象,但我知道这需要它,而且我正在寻找的可能是一种常见的 OO 模式。

对正确重构此代码有什么帮助吗?

PS - 我看过 Scrapy,由于各种原因,它并不是我真正需要的。
PPS - 我实际上不是在抓取搜索网站,而是在抓取美国法院网站。

最佳答案

您可以将代码放在一个类中,使用 __init__ 方法来配置所有内容,使用 _download 方法连接到站点并下载它,使用 _store 方法保存结果,run 方法将它们结合在一起,如下所示:

class Scraper(object):
def __init__(self, parser, page_generator):
self._parser = parser
self._pages = pages

def _download(self, page):
# do whatever you're already doing to download it
return html

def _store(self, data):
# Do whatever you're already doing to store the data

def run(self):
for page in pages:
html = self._download(page)
data = self._parser.parse(html)
self._store(data)

此类可以存在于您的 parser.py 文件中。

在您的每个站点特定文件中,放两样东西。

class Parser(object):
def parse(html):
# All of your rules go here

def pages(some, args, if_, you, need, them): # but they should be the same for all files
return a_list_of_pages_or_generator

然后您可以使用以下函数设置您的 python.py 文件:

def get_scraper(name):
mod = __import__(name)

parser = mod.Parser()
pages = mod.pages() # Pass whatever args you need to figure out the urls

return Scraper(parser, pages)

然后你可以像这样使用它

scraper = get_scraper('google')
scraper.run()

这样做的好处是不需要您对 Scraper 类进行任何更改。如果您需要使用不同的技巧让服务器与您的抓取程序对话,那么您可以在每个模块中创建一个 Downloader 类,并像使用 Parser 类一样使用它。如果您有两个或多个执行相同操作的解析器,只需将它们定义为单独模块中的通用解析器,然后将其导入到需要它的每个站点的模块中。或者将其子类化以进行调整。在不知道您如何下载和解析网站的情况下,很难说得更具体。

我的感觉是,您可能需要问几个问题才能弄清所有细节,但这将是一次很好的学习体验。

关于python - 针对彼此差异很大但处理相似的功能进行模式和设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4243491/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com