专栏首页月小水长如何保存微博的所有图片链接并下载图片到本地

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

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

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

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

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 下载图片这部分代码几乎是放之四海而皆准的。

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。这样,每次无论时长,爬的内容都具有可连续性

本文分享自微信公众号 - 月小水长(inspurer),作者:BuyiXiao

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-06-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 基金实时涨跌提示小助手支持用户自动配置了

    在上周推送的我用 Python 写了个基金涨跌通知助手一文中,基金涨跌通知小助手已经稳定运行一周了,没出现什么大的 bug,而且已经有十几个用户订阅该服务了,但...

    月小水长
  • 用户、话题、评论一网打尽,分享一个最强微博爬虫

    微博向来是一个极好的吃瓜圣地,为了获取微博上行行色色的数据,微博相关的爬虫也是层出不穷,因为无论是运营者还是数据分析从业者都或多或少需要微博数据,我的许多朋友也...

    月小水长
  • 微博话题爬虫更新:突破 50 页限制

    在上一次更新至今,又出现了不少了 bug,昨天趁着有空更新了代码,这次的更新主要做了三件事

    月小水长
  • scarpy初识

    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。Scrapy的一个最主要...

    听城
  • 第5篇:数据库系统的实现

    前言 前面的文章中,主要都是在围绕关系数据库理论进行研究,没有涉及到数据库系统的具体实现。 虽说数据库系统的具体实现因业务环境,RDBMS等因素而异,但总体开发...

    Spark学习技巧
  • 不知道如何实现服务的动态发现?快来看看 Dubbo 是如何做到的

    上篇文章如果有人问你 Dubbo 中注册中心工作原理,就把这篇文章给他大致了解了注册中心作用以及 Dubbo Registry 模块源码,这篇文章将深入 Dub...

    andyxh
  • 浅谈SQL Server内部运行机制

    对于已经很熟悉T-SQL的读者,或者对于较专业的DBA来说,逻辑的增删改查,或者较复杂的SQL语句,都是非常简单的,不存在任何挑战,不值得一提,那么,SQL的哪...

    三哥
  • 安卓系统Google Admin应用曝0day漏洞,可绕过沙箱

    MWR实验室的研究人员发现一个0day漏洞,该漏洞存在于安卓系统中Google Admin应用程序处理一些URL的方式中,通过该漏洞攻击者可以绕过安卓沙箱机制。...

    FB客服
  • 电商数据分析时的excel的基本操作(吐血总结)

    一般的使用Excel的工作习惯 1.保留原始文件,新建一个Sheet进行处理数据存放,或者另外COPY一份新的文档,尽量保持原始数据的原貌,因为我们都不知道啥时...

    CDA数据分析师
  • Python之Pymysql模块实现MySQL增删改查

    PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb。

    橙子探索测试

扫码关注云+社区

领取腾讯云代金券