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

Python和SQL:存储值、查询和解析下一个,python,sql,yelp,Python,Sql,Yelp,我在逻辑上左右为难 我正试图用Yelp检索法国所有的餐馆。 为了做到这一点,我正在编写一个web爬虫程序来废弃YelpAPI并检索数据。 查询如下: https://api.yelp.com/v3/businesses/search?cc=fr&location=Paris&categories=restaurants 我有一个包含法国所有城市的SQL数据库(很好,不是吗?) 我现在正在运行我的网络爬虫,手动输入城市名称。 当然,我希望我的脚本: 查询SQL Server 取

我在逻辑上左右为难

我正试图用Yelp检索法国所有的餐馆。 为了做到这一点,我正在编写一个web爬虫程序来废弃YelpAPI并检索数据。 查询如下:

https://api.yelp.com/v3/businesses/search?cc=fr&location=Paris&categories=restaurants
我有一个包含法国所有城市的SQL数据库(很好,不是吗?)

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

  • 查询SQL Server
  • 国家
    城市
  • 在URL中传递值(我知道怎么做)
  • 取下一行的值(我不知道如何做)
  • 所以我的问题更多的是关于逻辑:如何构建整个事物

    如何查询、执行并传递到下一个?

    假设您的数据库有一个连接器(您没有提到供应商…),您只需在光标上迭代即可:

    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)
    
    现在,一种显而易见的简单方法是返回一个游标,然后在它上面进行迭代,得到一条传递到爬网函数的记录。如果您的数据库没有处于高写负载下,我怀疑保持读事务打开这么长时间可能不是一件可怕的事情

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


    俗话说,过早优化是万恶之源,这一点在这里也适用。因此,关键是要确保你能正确地分离逻辑,这样你以后就可以在不破坏逻辑的情况下对其进行更改。因此,我会先在光标上循环,除非我知道这将是一个问题,然后如果是这种情况(或者如果它被证明是一个问题),我会探索其他选项,比如将光标上的所有内容提取到一个字典(或元组)数组中并返回,或者序列化到一个文件并在上面迭代。

    Dear@Bruno,我没想到会重播得那么准确那么快!(