V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
childewei
V2EX  ›  问与答

关于 api 调用的问题

  •  
  •   childewei · 2023-04-24 23:53:30 +08:00 · 1375 次点击
    这是一个创建于 580 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求

    今天想写一个图书交易相关的程序,希望有一个通过 isbn 快速录入图书的功能。 查了好久豆瓣的 api 似乎是不开放,最后发现一个网站能满足我的使用,然后我不会用他的 api !!! 网站是: https://openlibrary.org/dev/docs/api/books

    尝试

    我尝试了直接去调用 api

    import requests
    import json
    
    # 指定 API 的 URL
    url = 'https://openlibrary.org/api/books'
    
    # 指定要查询的 ISBN 号
    isbn = '0837165245'
    
    # 构造 API 请求的参数
    params = {
        'bibkeys': f'ISBN:{isbn}',
        'callback': 'mycallback'
    }
    
    # 发送 API 请求
    response = requests.get(url, params=params)
    
    # 获取 API 响应中的 JSON 字符串
    json_str = response.content.decode('utf-8')
    
    print(response)
    

    给出的是<Response [200]> 看提示应该是成功了,但是书籍相关的信息我调不出来。

    第 1 条附言  ·  2023-04-25 14:18:03 +08:00

    问题的解决

    已经成功的解决了我的问题,感谢@ccwhkkk 的代码帮助和启发,以及@huntagain2008 这位朋友关于作者信息提取的补充。 以下是正确可用的代码:

    import requests
    
    # 接口地址
    url = 'https://openlibrary.org/api/books?bibkeys=ISBN:9787553669090&jscmd=data&format=json'
    
    # 发送 GET 请求
    response = requests.get(url)
    
    # 获取响应数据
    response_data = response.json()
    
    # 处理响应数据
    book = response_data['ISBN:9787553669090']
    
    
    print (f"书名:{book ['title']}")
    print (f"作者:{book ['authors'][0]['name']}")
    print (f"出版日期:{book ['publish_date']}")
    

    输出信息为:

    书名:狂人日记(鲁迅小说全集)
    作者:鲁迅
    出版日期:????
    

    一些离题的话

    附上一些与主题无关的话,冗长而又无聊,并且不想有人从里面找出几个字来怼我,如果你不幸看完了并且不舒服请拉黑我,谢谢。 我不是一个科班出身的人,学习java是为了能找到一份工作,另外课内也有这门课所以继续深入了一些,并打算一直学习下去,故而曾经在v2ex做了一些询问,而python也是在做数学建模时使用过的,不得不承认在一些简单的事请上用python很好用,随手想写一点小工具,或是学习api调用都是很方便的。 不曾想过如此会被人把仅有的三个帖子挖坟教训了一顿。我承认我的python基础只是学了基础的程序设计,只是用来写一些算法题,这些也可以叫基础吧,为什么我不会使用api也值得被拿出来说了好几楼呢? 一个询问技术的帖子下,你可以说我的python基础不够,可以告诉我想要读取这个api的返回值需要去学习什么,我都很欢迎,就像是下面有人提出我学的东西杂而不精,我自然承认,也在努力的深入学习。可那些说一句你好垃圾然后扬长而去时能够满足自己的优越感还是什么呢?我不理解,只是午睡前看完回复难受了许久,还是不吐不快。

    另外,Chat-GPT诞生这么久了,我当然也使用过,但我也觉得认知不足就是提不出好问题,我和它聊了许久也没能得到答案,我想许多人也会先问gtp而后发帖吧,所以大可不必抖一句机灵你去问Chat-GPT快得很,那我干脆发帖说“大佬们过来帮我问问Chat-GPT吧”,这句话适用于各种在不同帖子下回复去问Chat-GPT的人。

    17 条回复    2023-05-12 16:25:37 +08:00
    childewei
        1
    childewei  
    OP
       2023-04-24 23:55:04 +08:00
    另外还发现一个网站不错,但是一点文档都没找到
    https://isbnsearch.org/isbn
    hlwjia
        2
    hlwjia  
       2023-04-25 00:18:11 +08:00
    这不是你不会用谁家的 API 的问题

    你是不是刚学 Python ?
    Hequndev
        3
    Hequndev  
       2023-04-25 00:25:17 +08:00 via iPhone
    楼上正解,这边建议直接 gpt 或许更快解决(:
    LiSrRbE2Mac
        4
    LiSrRbE2Mac  
       2023-04-25 00:25:54 +08:00 via Android
    你 print 的是这个对象本身
    你要的内容包含在这个对象的属性里……
    ccwhkkk
        5
    ccwhkkk  
       2023-04-25 01:57:44 +08:00   ❤️ 1
    ```
    import requests

    # 接口地址
    url = 'https://openlibrary.org/api/books?bibkeys=ISBN:9787544270871&format=json'

    # 发送 GET 请求
    response = requests.get(url)

    # 获取响应数据
    response_data = response.json()

    # 处理响应数据
    book = response_data['ISBN:9787544270871']
    print(f"书名:{book['title']}")
    print(f"作者:{book['authors'][0]['name']}")
    print(f"出版日期:{book['publish_date']}")
    ```
    musi
        6
    musi  
       2023-04-25 08:57:00 +08:00
    在上一个帖子了解到楼主“目前本人掌握的技术:除了上述的还有 python 基础”
    你这可不像有 python 基础的样子。。。
    pkxutao
        7
    pkxutao  
       2023-04-25 10:13:53 +08:00   ❤️ 1
    看了下你以往的帖子。。。你应该去深入学习某项技术或语言,而不是这里搞一下那里搞一下,浮于表面,你对编程思想的理解非常非常浅,甚至我武断的认为你只是照着教程写过一些代码,自己上手就啥也不会
    huntagain2008
        8
    huntagain2008  
       2023-04-25 10:47:39 +08:00
    我尝试了运行 python 代码但是访问不了,这个网站我访问不了。

    小白我看了 GPT-4 生成的代码,它使用了函数,ifelse ,NULL 处理。比如获取图书信息对 response 做 ifelse ,200 就返回图书信息,否则输出错误信息。在解析图书信息时,用 ifelse 判断数据非空,否则显示没有收到数据。有该 ISBN 号则获取图书信息,否则找不到该 ISBN 号的图书。图书的作者可能是多个作者,所以它写的是:
    ```python
    authors = [author[‘name’] for author in book.get(‘authors’, [])]
    authors_str = ‘, ‘.join(authors) if authors else ‘Unknown Author’
    print(f”Author(s): {authors_str}”)
    ```
    childewei
        9
    childewei  
    OP
       2023-04-25 13:53:02 +08:00
    @ccwhkkk
    我直接使用你的方法没有成功,不多多少还是有些启发,在文档里看了一会,发现调用 data 可以调出来,改了你的 url 变成`'https://openlibrary.org/api/books?bibkeys=ISBN:9787553669090&jscmd=data&format=json'`就成功了。
    非常感谢!
    childewei
        10
    childewei  
    OP
       2023-04-25 13:55:05 +08:00
    @huntagain2008 网站我是可以访问的,获取了想要的数据到 json 只是不知道怎么提取出来(也许吧,好在现在成功了),多个作者这一点很有帮助谢谢。
    childewei
        11
    childewei  
    OP
       2023-04-25 14:00:14 +08:00
    @LiSrRbE2Mac 哦是的,我忘记了给出我原本用于提取信息的代码(是一段错误的代码),不过好在问题解决了。
    起先我不会从 response 里提取我想要的文件,每次都读取出一个空值,所以就把那段代码删掉了,谢谢。
    huntagain2008
        12
    huntagain2008  
       2023-04-25 20:34:42 +08:00
    别人说的也没啥问题,用 GPT-4 生成代码比你自己写的还优秀,空的判断你就没写。如果还要讲代码安全性,可以在最后给 GPT-4 加一句:生成代码之后请检查代码的安全性并修改不安全的地方。

    import requests

    def get_book_info(isbn):
    url = f'https://openlibrary.org/api/books?bibkeys=ISBN:{isbn}&jscmd=data&format=json'
    response = requests.get(url)
    if response.status_code == 200:
    book_data = response.json()
    return book_data
    else:
    print(f"Error: {response.status_code}")
    return None

    def print_book_info(book_data, isbn):
    if book_data:
    book_key = f'ISBN:{isbn}'
    if book_key in book_data:
    book = book_data[book_key]
    title = book.get('title', 'Unknown Title')
    authors = [author['name'] for author in book.get('authors', [])]
    authors_str = ', '.join(authors) if authors else 'Unknown Author'
    print(f"Title: {title}\nAuthor(s): {authors_str}\nISBN: {isbn}")
    else:
    print(f"No book data found for ISBN: {isbn}")
    else:
    print("No book data retrieved.")

    if __name__ == "__main__":
    isbn = '0837165245'
    book_data = get_book_info(isbn)
    print_book_info(book_data, isbn)

    """ by GPT-4
    在运行此代码之前,请确保已安装 requests 库。如果尚未安装,请使用以下命令进行安装:

    pip install requests

    运行上述程序后,您将看到给定 ISBN 号的图书信息以文本形式打印。
    """
    childewei
        13
    childewei  
    OP
       2023-04-25 23:00:34 +08:00
    @huntagain2008
    感谢你的回复,的确 GPT 的结果是不错的,评论中有人指出 GPT-4 说作者多个情况下的解决我也作了修改并表达了感谢,不爽是只有一句你去问 gpt 吧,他会告诉你结果的这种。
    我给出的代码也是有自己的习惯在里面,先写了核心部分再进行补充,所以许多应该加的都没有(我还觉得这样提问时候可以一下子看到问题关键呢哈哈哈)
    另外不知道是不是我这边的缘故?你的代码都没有缩进,看起来很麻烦,需要调整一边才能使用;这个是你用 GPT 生成的代码的话,的确是我能力不够成熟,正如我在补充里面说的,我和它对话许久都没得到满意的答复。
    huntagain2008
        14
    huntagain2008  
       2023-04-27 08:54:47 +08:00
    #13 代码没有缩进是因为 V2EX 的回复评论里就不支持 markdown 也不能缩进,GPT-4 的回复里是 markdown 做好的代码展示。我作为小白只见过一些人写代码是用辅助工具,自己没有用过。见过有人推广过网页去水印的技术,他就是用 ChatGPT 帮助写的代码,是集成在 IDE 中的。

    他用的 cursor 的工具,是集成了 GPT-4 的。要 AI 的错误率低,主要还是需要 GPT-4 。 其次就是 prompt 的使用。工具在视频的 05:58
    https://www.bilibili.com/video/BV1Ak4y147t6/
    childewei
        15
    childewei  
    OP
       2023-05-12 10:37:54 +08:00 via Android
    @pkxutao #7 思来想去,还是想要和您请教一下何谓编程思想,该怎么理解?困扰许久,希望不吝赐教。
    pkxutao
        16
    pkxutao  
       2023-05-12 11:07:07 +08:00
    @childewei 对于你的情况,我简单的介绍下(实际我的理解也很浅薄),你学了这么多方向,但是对前后端的理解、数据结构的理解等是怎样的呢?就比如这个帖子的问题,你获取到的是一个对象,你想打印对象里的某个字段,那么这个“对象”->“字段”的关系,你肯定没有理解,不然不会有这个帖子,而这个“对象”->“字段”的关系,属于数据结构范畴,和哪个编程语言无关。“对象”是虚拟的,而字节流是现实存在的,那字节流又怎么转化为虚拟的“对象”呢? 就类似这些东西,你要去理解,去查找知识,这都和编程语言无关的,每个程序员都要掌握
    childewei
        17
    childewei  
    OP
       2023-05-12 16:25:37 +08:00 via Android
    @pkxutao #16 嗯我有点理解,确实因为我的专业不是正统的计算机,所以以前帖子里提到的像是我学过 c ,java 这种都属于大学课程的必修课比较浅薄了,其他的我所自学 python 更是为了完成比赛要求学习的,对于操作系统数据结构这些都没有深入的了解。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1149 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:14 · PVG 02:14 · LAX 10:14 · JFK 13:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.