天生呀 2023-11-21 02:41 采纳率: 80%
浏览 17
已结题

关于百度街景爬取图片不显示的问题

测试了使用的坐标存在街景,但是使用代码爬取图片不显示是为什么原因,下载的所有的图片都不显示

img

  • 写回答

18条回答 默认 最新

  • 专家-赤兔[在线] 2023-11-21 02:50
    关注
    获得0.45元问题酬金

    引自强大而免费的微信小程序:皆我百晓生

    问题描述

    用户在使用Python编写程序爬取百度街景图片时遇到了无法显示图片的问题。用户输入的坐标在百度地图中存在街景,但是爬取到的图片无法正确显示。用户希望了解产生这个问题的原因,并希望能够给出解决方法。

    可能原因和解决方法

    1. Urls请求错误:图片可能没有正确地从指定的URL上下载下来。
      解决方法:检查程序中的URL是否正确,并且确保能够从该URL下载到图片。可以尝试使用浏览器或者其他下载方式来验证URL是否有效。

    2. Headers请求头缺失:爬取百度街景图片时,可能缺少必要的请求头信息,导致无法正确获取图片。
      解决方法:在请求中添加必要的请求头,例如User-Agent等,以模拟浏览器的请求。

    3. 反爬虫机制:百度可能针对爬虫做了一些反爬虫机制,导致无法正确获取图片。
      解决方法:尝试绕过反爬虫机制,可以尝试以下方法:

    • 使用代理IP进行请求,以隐藏真实的请求IP。
    • 延缓请求发送的频率,以模拟人的操作。
    • 模拟登录获取权限后再进行图片的爬取。
    1. 验证码验证:爬取过程中,可能出现验证码验证的情况。
      解决方法:可以尝试使用验证码识别库对验证码进行自动化识别。

    2. 图片保存路径错误:图片可能被保存到了错误的路径。
      解决方法:检查程序中保存图片的路径是否正确,并确保有写入权限。

    3. 图片编码问题:图片可能采用了非常规的编码方式,导致无法正确显示。
      解决方法:检查图片的编码方式,尝试使用合适的库进行解码和显示。

    4. 其他错误:可能存在其他未知的问题导致图片无法正确显示。
      解决方法:对程序进行调试和排查,检查相关日志和错误信息,尝试在网上搜索类似的问题并寻找解决方法。

    参考代码

    import requests
    
    # 创建请求头
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'
    }
    
    # 设置URL
    url = 'https://www.example.com'  # 替换为实际的URL
    
    # 发送请求
    response = requests.get(url, headers=headers)
    
    # 检查请求是否成功
    if response.status_code == 200:
        # 保存图片
        with open('image.jpg', 'wb') as f:
            f.write(response.content)
            print('图片保存成功')
    else:
        print('请求失败')
    

    以上代码是一个简单的示例,展示了如何使用requests库发送GET请求,并保存返回的图片。在实际使用时,需要根据具体情况进行相应的修改和调整。

    评论 编辑记录
  • 心梓知识 2023-11-21 03:14
    关注
    获得0.30元问题酬金

    结合GPT给出回答如下请题主参考
    可能是由于以下几个原因导致爬取的图片不显示:

    1. 爬取的图片URL地址有误。

    2. 网络连接不稳定或者被限制了访问。

    3. 爬虫请求频率过高,被网站封IP了。

    下面是一个Python 3的街景图片爬取代码示例,可以参考:

    import urllib.request
    import os
    
    # 设置图片保存路径
    img_dir = 'D:/images/'
    
    # 设置街景API请求URL
    api_url = "http://api.map.baidu.com/panorama/v2?ak=你的百度API秘钥&width=1024&height=512&location={},{}&fov=360"
    
    # 设置待爬取的坐标列表
    coords = [(116.404269, 39.913164), (116.404439, 39.913204), (116.404836, 39.913357)]
    
    for coord in coords:
        # 生成请求URL
        url = api_url.format(coord[0], coord[1])
        try:
            # 发送请求
            response = urllib.request.urlopen(url)
            # 读取图片内容
            img_content = response.read()
            # 拼接图片名称
            img_name = str(coord[0]) + '_' + str(coord[1]) + '.jpg'
            # 拼接图片保存路径和名称
            img_path = os.path.join(img_dir, img_name)
            # 保存图片
            with open(img_path, 'wb') as f:
                f.write(img_content)
            print('成功下载图片:{}'.format(img_name))
        except:
            print('下载图片失败:{}'.format(img_name))
    

    其中,api_url是街景API请求URL,需要将其中的你的百度API秘钥替换成自己在百度开发平台申请到的百度API秘钥;coords是待爬取的坐标列表,可以按照自己的需求修改;img_dir是图片保存路径,需要修改成自己想要保存的路径。

    如果以上代码仍不能解决问题,建议检查一下网络连接和请求频率限制。

    评论
  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-21 04:11
    关注
    获得0.60元问题酬金

    【以下回答由 GPT 生成】

    问题分析:

    根据提供的代码和问题描述,可能导致图片无法显示的原因有以下几个可能性:

    1. 请求的URL不正确,导致获取到的响应内容并非是图片数据。
    2. 图片下载成功,但是保存到本地的文件路径不正确,导致无法打开图片文件。
    3. 在显示图片时,使用的显示方法不正确。

    解决方案:

    1. 首先,需要确认请求的URL是否正确,并且能够获取到正确的图片数据。可以通过在代码中添加一个print语句来打印response.content的内容,以便检查是否获取到了正确的图片数据。
    print(response.content)
    
    1. 其次,需要确认保存图片时的文件路径是否正确。可以使用绝对路径来保存图片,或者在代码中加入检查和创建文件夹的逻辑,以确保路径的正确性。
    import os
    
    # 创建保存图片的文件夹
    folder = "images"
    if not os.path.exists(folder):
        os.makedirs(folder)
    
    # 保存图片到指定路径
    file_path = os.path.join(folder, "street_view_image.jpg")
    with open(file_path, "wb") as file:
        file.write(response.content)
    
    1. 最后,确认使用的图片显示方法是否正确。在某些情况下,直接使用image.show()可能无法正常显示图片。可以尝试使用其他的显示方法,例如使用matplotlib库的imshow方法来显示图片。
    import matplotlib.pyplot as plt
    
    # 显示图片
    image = Image.open(file_path)
    plt.imshow(image)
    plt.show()
    

    如果以上的方法都没有解决问题,则可能是其他地方出现了问题,或者是百度街景图片的响应内容存在其他的限制,无法直接通过下载和显示的方式来获取图片。在这种情况下,可能需要进一步调查百度街景图片接口的使用规则和限制,并尝试其他的解决方案来获取和显示街景图片。

    请注意,在以上的解决方案中,对代码进行了一些修改和补充,以尽可能排除常见的错误和问题,并提供更清晰易懂的解决方案。希望以上的分析和解决方案对您有帮助。如果还有其他问题或需要进一步的帮助,请随时告知。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论
  • threenewbee 2023-11-21 08:31
    关注
    获得0.60元问题酬金
    评论
  • cjh4312 2023-11-21 08:34
    关注
    获得0.30元问题酬金

    你是需要这个吗

    import requests
    import json
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
    }
    
    params = {
        'qt': 'guide',
        'sid': '09000300122012131019470027I',
    }
    
    res = requests.get('https://mapsv0.bdimg.com/', params=params, headers=headers)
    id=json.loads(res.text)['content'][0]['PID']
    
    for i in range(3):
        for j in [0,1,2,7]:
            params = {
                'qt': 'pdata',
                'sid': id,
                'pos': f'{i}_{j}',
                'z': '4',
                'udt': '20200825',
            }
    
            res = requests.get('https://mapsv1.bdimg.com/', params=params, headers=headers)
            with open(f'e:\\{i}_{j}.jpg', 'wb') as f:
                f.write(res.content)
    
    

    img

    评论
  • honestman_ 2023-11-21 09:09
    关注
    获得0.30元问题酬金

    url拼接错了,可以先把url打印出来看下,是不是正常的

    评论
  • Leodong. 2023-11-21 09:32
    关注
    获得0.30元问题酬金

    该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
    可能的原因有以下几点:

    1. 图片URL不正确或已过期。请检查您使用的坐标是否正确,以及是否已经更新了街景数据。
    2. 网络问题。请确保您的网络连接正常,可以尝试更换网络环境后再次尝试爬取。
    3. 代码问题。请检查您的代码是否有误,例如是否正确设置了请求头、参数等。
    4. 图片格式问题。有些图片可能因为格式问题无法正常显示,可以尝试将图片转换为其他格式后再查看。

    如果您能提供更多关于您的代码和使用的坐标的信息,我将更好地帮助您解决问题。


    如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

    评论
  • lzh_me 2023-11-21 09:40
    关注
    获得0.30元问题酬金

    可以先把图片的URL放到浏览器里面看下是否正常显示,能否下载,然后再找问题原因。

    评论
  • 郭老师的小迷弟雅思莫了 Java领域新星创作者 2023-11-21 09:58
    关注
    获得0.45元问题酬金

    百度街景的爬取过程中,可能有多个原因导致下载的图片无法正常显示。以下是一些可能的原因和解决方法:

    1. 请求头问题: 百度街景接口可能对请求头有一些要求,确保你的爬虫设置了合适的请求头,包括User-Agent等信息,以模拟正常的浏览器请求。

      headers = {
          'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
      }
      
    2. 反爬虫机制: 百度街景可能有一些反爬虫机制,比如IP封锁等。你可以尝试使用代理IP轮换,以防止IP被封锁。

    3. 验证码: 百度街景可能会出现验证码,需要你的爬虫处理验证码,以确保正常的请求。

    4. 动态加载: 百度街景的图片可能是通过 JavaScript 动态加载的,你的爬虫需要模拟这些动态加载的过程。可以考虑使用无头浏览器,如Selenium,来模拟浏览器行为。

    5. Referer头: 有些网站可能要求请求中包含正确的Referer头。你可以尝试设置请求的Referer头,模拟从百度街景网站链接到图片的流程。

    确保你的爬虫代码处理了上述可能的问题,如果问题仍然存在,你可能需要深入分析具体的请求和响应,查看是否有其他的反爬虫机制或者限制。此外,请注意爬取网站的规定和政策,确保你的爬取行为是合法的。

    评论
  • 呈两面包夹芝士 2023-11-21 10:54
    关注
    获得0.30元问题酬金

    引自讯飞星火
    可能的原因有以下几点:

    1. 图片URL不完整或错误。请检查生成的图片URL是否正确,确保它们是完整的。

    2. 图片文件损坏。可能是由于网络问题或其他原因导致下载的图片文件损坏。可以尝试重新下载图片。

    3. 图片格式不支持。百度街景支持的图片格式有限,如果下载的图片格式不在支持范围内,可能会导致无法显示。可以尝试将图片转换为其他支持的格式。

    4. 代码中的问题。请检查代码中是否存在错误,例如坐标设置不正确、请求头设置不正确等。

    5. 网站结构变化。如果网站结构发生变化,可能导致爬取到的图片无法正常显示。可以尝试更新爬虫代码以适应新的网站结构。

    评论
  • 小明说Java 2023-11-21 12:38
    关注
    获得0.30元问题酬金

    引用文心一言及个人思考回答:
    如果你在尝试使用Python爬取百度街景图片时遇到了问题,可能有几个原因导致你无法看到图片。以下是一些可能的原因和解决方法:

    1. 网络连接问题:首先,确保你的网络连接正常,且可以访问百度街景的服务器。如果网络连接不稳定或速度慢,可能会导致爬取过程中出现问题。
    2. 权限问题:在爬取百度街景图片时,需要验证你的请求是否有权限。确保你使用的API密钥或令牌是正确的,并且没有被限制或封禁。
    3. 坐标无效:确认你使用的坐标是有效的街景地点。尝试使用其他坐标进行测试,看看是否能够获取到街景图片。
    4. 爬取速度过快:如果你爬取图片的速度过快,可能会触发百度街景服务器的防爬机制,导致暂时无法获取图片。可以尝试减慢爬取速度,或者在请求之间添加适当的延迟。
    5. 代码错误:检查你的代码,确保请求URL、参数设置和数据处理都是正确的。参考百度街景的官方文档或示例代码,确保你的代码符合他们的要求。
    6. 图片格式不支持:有些浏览器可能不支持某些图片格式,导致无法显示图片。你可以尝试将图片保存到本地,并使用图像查看器打开,看看是否能够正常显示。
    7. 浏览器问题:如果你在浏览器中查看街景图片时遇到问题,可能是浏览器设置或扩展程序导致的问题。尝试使用不同的浏览器或清除浏览器的缓存和cookies进行测试。

    如果以上方法都无法解决问题,建议参考百度街景的官方文档和支持论坛,看看是否有其他用户遇到了类似的问题,并寻求他们的帮助和建议。

    评论
  • 技术宅program 2023-11-21 18:44
    关注
    获得0.30元问题酬金

    (1) 【干货】百度全景静态图(街景图)爬取工具EXE——一个兴致使然的街景图数据爬取工具 - 知乎. https://zhuanlan.zhihu.com/p/397553962.
    (2) Python通过百度全景图API爬取街景图像 - 知乎 - 知乎专栏. https://zhuanlan.zhihu.com/p/149298321.
    (3) 小白尝试爬虫,爬回来的图片显示不了,是什么问题? - 知乎. https://www.zhihu.com/question/430543453.
    (4) Python爬取图片显示似乎不支持此文件格式_python中为什么下载图片有的报错-CSDN博客. https://blog.csdn.net/qq_44718932/article/details/109327608.
    (5) 百度地图街景图像批量获取 - 知乎 - 知乎专栏. https://zhuanlan.zhihu.com/p/304886600.

    评论
  • bug菌¹ Java领域优质创作者 2023-11-22 00:16
    关注
    获得0.60元问题酬金

    该回答引用ChatGPT,望对题主有所帮助/启发;若有帮助,还望采纳。


    你好!很抱歉听到你在使用百度街景 API 爬取图片时遇到问题。问题可能有很多原因,以下是一些建议和常见的检查点,你可以逐一排查:

    1. 检查网络连接: 确保你的网络连接是正常的,没有防火墙或代理阻止了请求。

    2. API 密钥是否有效: 确保你使用的百度街景 API 密钥是有效的,并且没有超过调用限制。

    3. 检查坐标的正确性: 确保你提供的坐标是正确的,确实存在于百度街景的覆盖范围内。

    4. 查看 API 响应: 在请求中添加适当的错误处理,检查 API 的响应是否包含有用的信息,例如错误消息或状态码。

    5. 用户代理设置: 有时候,网站可能要求特定的用户代理才能正常获取内容。你可以尝试设置一个合适的用户代理。

    6. 防止爬虫检测: 一些网站会采取措施防止被爬虫访问,你可能需要调整你的爬取策略,模拟真实用户的访问行为。

    以下是一个简单的 Python 代码片段,用于使用百度街景 API 下载图片:

    import requests
    
    def download_streetview_image(latitude, longitude, api_key):
        base_url = "http://api.map.baidu.com/panorama/v2"
        params = {
            "ak": api_key,
            "width": 512,
            "height": 512,
            "location": f"{latitude},{longitude}",
            "fov": 360  # 设置全景图
        }
    
        response = requests.get(base_url + "/streetview", params=params)
    
        if response.status_code == 200:
            with open("streetview_image.jpg", "wb") as f:
                f.write(response.content)
            print("Image downloaded successfully.")
        else:
            print(f"Error: {response.status_code}, {response.text}")
    
    # 使用你的坐标和 API 密钥调用函数
    latitude = 40.748817
    longitude = -73.985428
    api_key = "your_api_key"
    download_streetview_image(latitude, longitude, api_key)
    

    请确保替换 your_api_key 为你自己的百度街景 API 密钥。

    如果问题仍然存在,请提供更多的代码细节或错误消息,这将有助于更详细地分析问题。

    评论
  • yy64ll826 2023-11-22 09:42
    关注
    获得0.15元问题酬金

    可能搜索出来的图片库获取的图片链接不是真正的源图片链接,点进去实际上再查看单张图片,然后再在里面获取图片链接才是源图片
    举个获取源图例子

    import requests
    import urllib.request
    import os
    from bs4 import BeautifulSoup
    import socket  # 超时跳过
    import urllib.error  # 可能链接挂了
    from tqdm import tqdm
     
    def main(user_agent, noun, number, save_root):
        "(1)初始化"
        print("初始化...")
     
        url = ...
     
        headers = {
            'user-agent': user_agent
        }
        opener = urllib.request.build_opener()
        opener.addheaders = [('User-Agent', user_agent)]
        urllib.request.install_opener(opener)
     
     
        "(2)获取html"
        print("获取html...")
        response1 = requests.get(url=url,headers=headers)
        html1 = response1.text
     
        soup1 = BeautifulSoup(html1, 'html.parser')
        divs = soup1.find_all('div', class_='imgpt')  # 视具体网页而获取
     
     
        "(3)获取图片链接"
        print("获取链接与下载...")
        count = 1
        for div in divs:
            # 不是源地址,再次获取
            bing_url = '...' + div.find('a', class_="iusc").get('href')
     
            try:
                response2 = requests.get(bing_url, headers=headers)
     
                html2 = response2.text
                soup2 = BeautifulSoup(html2, 'html.parser')
     
                # 视具体网页而获取
                img_url = soup2.find('div', id="b_content").find('div', id='b_idpdata').get('data-firstimg') 
                img_url = img_url[img_url.index("thumbnailUrl")+len("thumbnailUrl")+3:img_url.index('fhs')-3]
     
                # 准备
                save_dir = os.path.join(save_root, noun)
                if not os.path.exists(save_dir):
                    os.makedirs(save_dir)
                save_path = save_dir + '/%s-%d.jpg' % (noun, count)
     
                "(4)下载"
                socket.setdefaulttimeout(10)
                try:
                    urllib.request.urlretrieve(img_url, save_path)
                    print("%s-第%d张下载完毕, from:%s" % (noun, count, img_url))
                    count += 1
                except urllib.error.HTTPError:
                    print("链接挂了")
                except socket.timeout:
                    try:
                        urllib.request.urlretrieve(img_url, save_path)
                        print("%s-第%d张下载完毕, from:%s" % (noun, count, img_url))
                        count += 1
                    except socket.timeout:
                        print("\n下载超时,跳过")
                except urllib.error.ContentTooShortError:
                    try:
                        urllib.request.urlretrieve(img_url, save_path)
                        print("%s-第%d张下载完毕, from:%s" % (noun, count, img_url))
                        count += 1
                    except urllib.error.ContentTooShortError:
                        print("\n似乎网络不太好?已中断")
                except:
                    print("未知错误,跳过")
            except:
                print("远程主机强迫关闭了一个现有的连接,跳过")
                pass
     
     
    if __name__ == "__main__":
        user_agent = ...
        amount = 10
        save_root = 'images'
     
        print("Download images from noun_vocab: ")
        # noun_file = open('../../data/pororo_data/nouns_vocab.txt', 'r').readlines()
        clean_noun_file = open('../../data/pororo_data/nouns_vocab_choose.txt', 'r+')
        for line in tqdm(clean_noun_file):
            noun = line.replace('\n', '')
            main(user_agent, noun, amount, save_root)
        clean_noun_file.close()
    
    
    评论
  • 关注
    获得0.30元问题酬金

    用户代理问题:百度街景对于爬虫请求可能会有一些限制,可能会检查请求中的用户代理(User-Agent)字段。您可以尝试在请求头中设置一个常用的用户代理来模拟浏览器访问,例如:

    
    import requests
    
    url = "https://www.example.com"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"
    }
    
    response = requests.get(url, headers=headers)
    
    
    

    验证码问题:百度街景有可能会对频繁的请求弹出验证码以保护网站的正常运行。您可以尝试在爬取之前手动访问一下该街景页面,查看是否需要输入验证码。如果需要验证码,您可以考虑使用第三方库(如 pytesseract)进行验证码识别,或者手动输入验证码来绕过验证。

    JavaScript渲染问题:百度街景的图片可能是通过JavaScript动态加载的,如果您使用的是基于requests库的爬虫,可能无法获取到动态加载的内容。您可以尝试使用Selenium库来模拟浏览器行为

    评论
  • Minuw 2023-11-28 18:11
    关注
    获得0.30元问题酬金

    参考gpt
    这可能是由于以下一些原因导致的:

    1. 防爬虫机制:百度街景可能有防爬虫机制,会检测到你的爬虫行为并阻止你获取图片。你可以尝试模拟真实用户行为,比如增加访问间隔、使用代理等方式来规避防爬虫机制。

    2. 请求参数问题:可能是你请求图片时的参数不正确,比如请求的坐标、图片大小等参数不符合要求,导致返回的图片无法显示。你可以仔细检查请求参数是否正确。

    3. 图片格式问题:可能是下载的图片格式有问题,无法被正常显示。你可以尝试使用不同的图片打开工具来查看下载的图片是否能正常打开。

    4. 网络问题:有时候网络问题也可能导致下载的图片无法显示,你可以尝试使用不同的网络环境进行测试。

    在使用Python进行爬取图片时,你可以使用requests库来发送网络请求,并使用PIL库或matplotlib库来打开和显示图片。确保你的代码能够正确处理网络请求和图片显示的逻辑。如果你能提供更多的代码细节,或者具体的报错信息,我们可以更准确地帮助你解决问题。

    评论
  • GIS工具开发 2023-11-28 21:51
    关注
    获得0.30元问题酬金

    图片格式有问题吧

    评论
  • 会跑的小鹿 2023-11-28 21:54
    关注
    获得0.15元问题酬金

    有反爬机制

    评论

报告相同问题?

问题事件

  • 系统已结题 11月29日
  • 赞助了问题酬金15元 11月21日
  • 创建了问题 11月21日

悬赏问题

  • ¥30 哈夫曼编码译码器打印树形项目
  • ¥20 求完整顺利登陆QQ邮箱的python代码
  • ¥15 怎么下载MySQL,怎么卸干净原来的MySQL
  • ¥15 网络打印机Ip地址自动获取出现问题
  • ¥15 求局部放电案例库,用于预测局部放电类型
  • ¥100 QT Open62541
  • ¥15 stata合并季度数据和日度数据
  • ¥15 谁能提供rabbitmq,erlang,socat压缩包,记住版本要对应
  • ¥15 Vue3 中使用 `vue-router` 只能跳转到主页面?
  • ¥15 用QT,进行QGIS二次开发,如何在添加栅格图层时,将黑白的矢量图渲染成彩色