但是今天不止一个读者跟我反馈,图片 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。这样,每次无论时长,爬的内容都具有可连续性。