引导到功能
#初学者 #python #dataengineering

在上一期中,我们有一个简单的10行脚本(不包括导入),该脚本从网站上提取或提取了股价和U3O8股票。然后,它清理或将这些值转换为数字并将其打印到屏幕上。您会注意到,即使在这10行代码中,也有一些重复。

fund_values = soup.find_all('div', class_='fundHeader_value')
shareprice = fund_values[4].contents
shareprice_value = str(shareprice[0]).strip().replace('$US', '')

u3o8 = fund_values[6].contents
u3o8_stock = str(u3o8[0]).strip().replace(',', '')

共享价格和U3O8股票本质上都是相同的:它们进入索引的“ DIV”,然后清理字符串。这违反了一种称为“干”或“不要重复自己”的良好编码实践中的一般规则。在我的编码时期的早期,我的导师总是经常告诉我,如果您必须进行两次,请创建一个功能。创建这些功能是抽象和更健壮的可扩展代码的第一步!

如何将此代码分解为函数?在任何数据处理中,我都喜欢借助提取,转换和加载或ETL的常见镜头。如今,找到ELT也很常见,尤其是在流式管道中,因此,只要您首先提取,不要以这些字母在什么顺序中陷入困境。

我们的提取是什么?它正在将网页拉到美丽的小组中。

我们的转变是什么?它正在处理字符串并产生一个干净的数字。

我们的负担是什么?它只是将其加载到打印语句中的屏幕。

让我们将这些变成功能:
提取

def web_call(url):  # Extract
    r = requests.get(url)
    if r.status_code == 200:
        soup: BeautifulSoup = BeautifulSoup(r.content, "html.parser")
        return soup
    else:
        return r.status_code

现在,我们有一个通用函数,您可以将任何URL放入,而不仅仅是Sprott URL,并且可以在1行代码中执行您以前在上述6行代码中所做的事情。

这是您为Sprott做的:

soup = web_call(
        url='https://sprott.com/investment-strategies/physical-commodity-funds/uranium/')

就是这样!

变换

def get_fund_values(soup, index, class_name):  # Transform
    fund_values = soup.find_all('div', class_=class_name)
    value = fund_values[index].contents
    return str(value[0]).strip().replace('$US', '').replace(',', '')

这只是稍有抽象的(不是通用),而不是拉动汤含量,获取内容并清洁内容n次,您现在可以使用一行代码来完成n次。<<<<<<<<<< /p>

这是您现在以股价的方式进行的:

shareprice_value = get_fund_values(soup, 4, 'fundHeader_value')

我们有2个值我们正在抓取,但是网站上还有更多值。我们可以用一行代码抓住每个值。

LOAD只是一个称为print()的Python函数,但让我们有用。为什么我们不使用抓取两个值创建一个JSON文件?这是一个简单的功能,它将编写一个JSON文件:

负载

def write_json(data, filename='data.json'):  # Load
    with open(filename, 'w') as f:
        json.dump(data, f, indent=4)

现在,当我们运行此脚本时,它不仅将其从上到下运行,因为我们拥有功能中的所有内容;因此,我们告诉Python,此脚本运行时,这是您的行动:

if __name__ == '__main__':
    soup = web_call(
        url='https://sprott.com/investment-strategies/physical-commodity-funds/uranium/')
    data = {}
    data['shareprice'] = get_fund_values(soup, 4, 'fundHeader_value')
    data['u3o8_stock'] = get_fund_values(soup, 6, 'fundHeader_value')
    write_json(data=data)

这将调用网站,创建一个名为Data的字典,用两个值填充字典,然后将字典写入JSON文件。

这些功能真正很酷的是它们不再仅在此脚本中可用。我们可以将这些功能导入其他Python脚本并创建类似的刮板!

代码在github(此处)[https://github.com/CincyBC/bootstrap-to-airflow/blob/main/src/functional_scraper.py]中。下次与我一起进行有关单元测试的快速聊天,然后进入面向对象的编程(OOP)的土地,以了解如何将其变成刮板类,该类将形成我们的气流DAG的基线。