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

这是 月小水长 的第47篇原创干货

对于一个爬虫,其爬取的目标不仅限于文字,图片、语音、视频均有可能,我开源的微博爬虫之话题爬虫,设定之初就是将微博内容、评论等文字形式和图片作为爬取目标的,只不过由于图片无法保存在 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/', '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。这样,每次无论时长,爬的内容都具有可连续性

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200620A0LJTH00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券