前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何保存微博的所有图片链接并下载图片到本地

如何保存微博的所有图片链接并下载图片到本地

作者头像
月小水长
发布2020-06-23 23:56:50
2.7K0
发布2020-06-23 23:56:50
举报
文章被收录于专栏:月小水长月小水长

对于一个爬虫,其爬取的目标不仅限于文字,图片、语音、视频均有可能,我开源的微博爬虫之话题爬虫,设定之初就是将微博内容、评论等文字形式和图片作为爬取目标的,只不过由于图片无法保存在 csv 中(不考虑 base64 编码解码这种形式,因为如果将图片 base64 编码作为结果 csv 的一列,那当我们打开 csv 时,这一列内容(肉眼无法分辨的长字符串)的展示对于我们来说是毫无意义甚至是一脸懵逼的),所以我仅仅保存了所有图片的 url 在 原始图片 url 这一列中,如果有多个图片,就以 分隔。

但是今天不止一个读者跟我反馈,图片 url 保存不了了,就算是有图片的微博,原始图片 url 列也是空的。

我调试了下,发现是在提取图片那部分代码,xpath 表达式出现点问题,可能是微博网页稍微改动了下,修复之后,又能流畅地保存 url 链接了,代码变动的地方主要是 extract_picture_urls 这个函数,可以直接复制下面的函数体取代之前的,也可以直接上 github 下载。

代码语言:javascript
复制
def extract_picture_urls(self,info, weibo_id):
    print('开始提取图片 URL')
    try:
        a_list = info.xpath('./div/a/@href')
        all_pic = 'https://weibo.cn/mblog/picAll/' + weibo_id + '?rl=1'
        if all_pic in a_list:
            selector = self.deal_html(all_pic)
            preview_picture_list = selector.xpath('//img/@src')
            picture_list = [
                    p.replace('/thumb180/', '/large/')
                    for p in preview_picture_list
            ]
            picture_urls = ','.join(picture_list)
            print(picture_urls)
        else:
            picture_urls = '无'
            if info.xpath('.//img/@src'):
                preview_picture = info.xpath('.//img/@src')[-1]
                picture_urls = preview_picture.replace(
                        '/wap180/', '/large/')
            else:
                sys.exit(
                        "爬虫微博可能被设置成了'不显示图片',请前往"
                        "'https://weibo.cn/account/customize/pic',修改为'显示'"
                )
        return picture_urls
    except Exception as e:
        print('Error: ', e)
        traceback.print_exc()

也许有的同学还有根据这些图片 url 下载图片到本地的需求,其实这个很简单,根据 url 下载图片这部分代码几乎是放之四海而皆准的。

代码语言:javascript
复制
url = 'http://ww2.sinaimg.cn/large/e76f9161gy1gdh0t0j83ij20yi1pcdts.jpg'
filename = url.split('/')[-1]
response = requests.get(url=url, headers=headers)
with open(f'img/{filename}', 'wb') as f:
    f.write(response.content)

大家也许还有这样的需求:根据话题爬虫微博保存的图片 url 保存图片到本地,乍一想,这是个很简单的问题,只需要导入 pandas 库遍历 csv 就行,但是如果 csv 有 10w 行,我大概率确定一次是无法保存完所有的图片的,平均每个微博 2 个图片,就有 20w 张图片需要下载,服务器会显然不会允许短时间这么频繁的请求,每 10 张图片 sleep 1秒,就算不考虑网络请求 IO 和磁盘写 IO,光休眠就有 2w 秒,也就是 2w/3600 ~= 6 个小时,如果突然断网,下次就得从头再来,这还是较为理想的情况,所以很有必要断点续爬,怎么实现呢,给 csv 文件新增一列 isFinished,初始值全为 0,每次遍历的时候只取 isFinished=0 的行的 url,如果该行 url 的图片下载到本地了,就立刻将该行 isFinished 字段置为 1。这样,每次无论时长,爬的内容都具有可连续性

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-20,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 月小水长 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 对于一个爬虫,其爬取的目标不仅限于文字,图片、语音、视频均有可能,我开源的微博爬虫之话题爬虫,设定之初就是将微博内容、评论等文字形式和图片作为爬取目标的,只不过由于图片无法保存在 csv 中(不考虑 base64 编码解码这种形式,因为如果将图片 base64 编码作为结果 csv 的一列,那当我们打开 csv 时,这一列内容(肉眼无法分辨的长字符串)的展示对于我们来说是毫无意义甚至是一脸懵逼的),所以我仅仅保存了所有图片的 url 在 原始图片 url 这一列中,如果有多个图片,就以 , 分隔。
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com