在上一期中,我们有一个简单的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的基线。