dataabc / weibo-search

获取微博搜索结果信息,搜索即可以是微博关键词搜索,也可以是微博话题搜索
1.7k stars 372 forks source link

通过百度图片外链,解决图片下载失败问题 #473

Open liuzyii opened 5 months ago

liuzyii commented 5 months ago

感谢作者提供的便利工具,2024年5月1日,由于微博防盗链机制,直接获得的图片链接已经无法访问,有相似问题的朋友可自行在MyImagesPipeline中,修改并拼接图片下载链接,以实现下载

eg: 爬虫获取的原链接https://wx2.sinaimg.cn/large/005EOMxagy1hleevmegvjj33kg2ocnpg.jpg 修改拼接后的链接https://image.baidu.com/search/down?url=https://wx2.sinaimg.cn/large/005EOMxagy1hleevmegvjj33kg2ocnpg.jpg

本人爬虫外行,仅在三台不同IP的设备下人工测试过,百度图片外链几乎不限频率不限速。

参考:https://blog.axiaoxin.com/post/2023-10-14-%E5%85%8D%E8%B4%B9%E5%9B%BE%E5%BA%8A%E4%B9%8B%E5%BE%AE%E5%8D%9A%E5%A4%96%E9%93%BE%E5%9B%BE%E7%89%87%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/

XueyuanLiang commented 5 months ago

您好,非常感谢您提供的解决方法。试过了很有效。但是下载的图片有些问题,部分图片不能完全展示,类似图中这样(下半部分缺失),您知道该如何解决这个问题吗? 5029689198383102-1

chaossshing commented 4 months ago

class MyImagesPipeline(ImagesPipeline): def get_media_requests(self, item, info): if len(item['weibo']['pics']) == 1: image_url = 'https://image.baidu.com/search/down?url='+item['weibo']['pics'][0] yield scrapy.Request( image_url, meta={ 'item': item, 'sign': '' }) else: sign = 0 for image_url in item['weibo']['pics']: full_image_url = 'https://image.baidu.com/search/down?url=' + image_url yield scrapy.Request(full_image_url, meta={ 'item': item, 'sign': '-' + str(sign) }) sign += 1

def file_path(self, request, response=None, info=None):
    image_url = request.url
    item = request.meta['item']
    sign = request.meta['sign']
    base_dir = '结果文件' + os.sep + item['keyword'] + os.sep + 'images'
    if not os.path.isdir(base_dir):
        os.makedirs(base_dir)
    image_suffix = image_url[image_url.rfind('.'):]
    file_path = base_dir + os.sep + item['weibo'][
        'id'] + sign + image_suffix
    return file_path

请问是这样拼接的么,还是下载不了呢

chaossshing commented 4 months ago

您好,非常感谢您提供的解决方法。试过了很有效。但是下载的图片有些问题,部分图片不能完全展示,类似图中这样(下半部分缺失),您知道该如何解决这个问题吗? 5029689198383102-1

你是怎么拼接的呀 是这样么class MyImagesPipeline(ImagesPipeline): def get_media_requests(self, item, info): if len(item['weibo']['pics']) == 1: image_url = 'https://image.baidu.com/search/down?url='+item['weibo']['pics'][0] yield scrapy.Request( image_url, meta={ 'item': item, 'sign': '' }) else: sign = 0 for image_url in item['weibo']['pics']: full_image_url = 'https://image.baidu.com/search/down?url=' + image_url yield scrapy.Request(full_image_url, meta={ 'item': item, 'sign': '-' + str(sign) }) sign += 1

def file_path(self, request, response=None, info=None):
    image_url = request.url
    item = request.meta['item']
    sign = request.meta['sign']
    base_dir = '结果文件' + os.sep + item['keyword'] + os.sep + 'images'
    if not os.path.isdir(base_dir):
        os.makedirs(base_dir)
    image_suffix = image_url[image_url.rfind('.'):]
    file_path = base_dir + os.sep + item['weibo'][
        'id'] + sign + image_suffix
    return file_path
Starfulllll commented 4 weeks ago

您好,非常感谢您提供的解决方法。试过了很有效。但是下载的图片有些问题,部分图片不能完全展示,类似图中这样(下半部分缺失),您知道该如何解决这个问题吗? 5029689198383102-1

你是怎么拼接的呀 是这样么class MyImagesPipeline(ImagesPipeline): def get_media_requests(self, item, info): if len(item['weibo']['pics']) == 1: image_url = 'https://image.baidu.com/search/down?url='+item['weibo']['pics'][0] yield scrapy.Request( image_url, meta={ 'item': item, 'sign': '' }) else: sign = 0 for image_url in item['weibo']['pics']: full_image_url = 'https://image.baidu.com/search/down?url=' + image_url yield scrapy.Request(full_image_url, meta={ 'item': item, 'sign': '-' + str(sign) }) sign += 1

def file_path(self, request, response=None, info=None):
    image_url = request.url
    item = request.meta['item']
    sign = request.meta['sign']
    base_dir = '结果文件' + os.sep + item['keyword'] + os.sep + 'images'
    if not os.path.isdir(base_dir):
        os.makedirs(base_dir)
    image_suffix = image_url[image_url.rfind('.'):]
    file_path = base_dir + os.sep + item['weibo'][
        'id'] + sign + image_suffix
    return file_path

经过测试目前可以正常下载图片,感谢大家的经验分享

liuzyii commented 4 weeks ago

您好,非常感谢您提供的解决方法。试过了很有效。但是下载的图片有些问题,部分图片不能完全展示,类似图中这样(下半部分缺失),您知道该如何解决这个问题吗? 5029689198383102-1

你是怎么拼接的呀 是这样么class MyImagesPipeline(ImagesPipeline): def get_media_requests(self, item, info): if len(item['weibo']['pics']) == 1: image_url = 'https://image.baidu.com/search/down?url='+item['weibo']['pics'][0] yield scrapy.Request( image_url, meta={ 'item': item, 'sign': '' }) else: sign = 0 for image_url in item['weibo']['pics']: full_image_url = 'https://image.baidu.com/search/down?url=' + image_url yield scrapy.Request(full_image_url, meta={ 'item': item, 'sign': '-' + str(sign) }) sign += 1


def file_path(self, request, response=None, info=None):

    image_url = request.url

    item = request.meta['item']

    sign = request.meta['sign']

    base_dir = '结果文件' + os.sep + item['keyword'] + os.sep + 'images'

    if not os.path.isdir(base_dir):

        os.makedirs(base_dir)

    image_suffix = image_url[image_url.rfind('.'):]

    file_path = base_dir + os.sep + item['weibo'][

        'id'] + sign + image_suffix

    return file_path

经过测试目前可以正常下载图片,感谢大家的经验分享

回复中提到的图片异常的问题,我并没有遇到,也无法复现。修改下载链接的方法,在我的机器上,是可以正常工作的。