Python和SQL:存值,查询,解析下一个

Python and SQL: store value, query, and parse the next one

我有一个逻辑难题。

我正在尝试使用 Yelp 检索法国的所有餐馆。 为此,我正在编写一个网络爬虫来抓取 Yelp API 并检索数据。 查询是这样的:

https://api.yelp.com/v3/businesses/search?cc=fr&location=Paris&categories=restaurants

我有一个包含法国所有城市的 SQL 数据库(很好,不是吗?):

我现在 运行 我的网络爬虫用手手动输入 city 名称。 当然,我希望我的脚本:

  1. 查询SQL服务器
  2. 采用 CountryCity
  3. 传递 URL 中的值(我知道怎么做)
  4. 取下一行的值(我不知道怎么做)

所以我的问题更多是关于逻辑的:如何构建整个事物?

如何查询,做,传给下一个?

假设你的数据库有一个 python db-api compliant 连接器(你没有提到供应商......)你只需要遍历你的光标:

def get_restaurants_for(country, city):
    # your api calls etc here
    ...

def main():
    db = yourdbmodule.connect(**connexion_infos)
    cursor = db.cursor()
    try:
        cursor.execute("select country, city from yourtable")
        for country, city in cursor:
            get_restaurants_for(city, country)
    finally:
        cursor.close()
        db.close() 

好的,让我们从关于发挥每个环境的优势以及每种方法的权衡是什么的基本点开始。

Python 关于如何通过迭代处理事物非常一致。所以理想情况下,您希望将代码结构化为:

for city in cities():
    crawl_yelp(city)

现在明显、简单的方法是 return 一个游标,然后当您遍历它时,您会得到一条记录并传递给您的爬网函数。如果您的数据库没有承受高写入负载,我怀疑将读取事务保持打开这么长时间可能不是一件坏事。

但是....如果是,那么 cities() 可以将行收集到一个列表中,然后 return。您可以用内存和初始延迟来换取在更高写入负载下数据库服务器本身更容易的东西。如果内存有问题,您可以写入一个 csv 文件,然后打开它并对其进行迭代(尽管这可能需要以向后兼容的方式做更多的工作)。

俗话说,过早优化是万恶之源,这句话适用于此。所以关键是要确保你可以正确地分离逻辑,这样你以后可以在不破坏东西的情况下改变它。所以我会首先遍历光标,除非我知道这会是一个问题,然后如果是这种情况(或者如果它被证明是一个问题)我会探索其他选项,例如从光标中获取所有内容到一个字典(或元组)数组和 returning,或序列化到一个文件并迭代它。