Bilibili视频封面获取艰辛之路

2018-03-06  本文已影响0人  刘点石

1.石原里美的锅

话说近日日本女星石原里美在网上很火,大有与我家Gakki分庭抗礼之势。本着知己知彼百战百胜的原则,我打开B站搜索石原里美,结果如下:

image

然后目光尖锐的我看到一个封面看起来挺不错的视频

image

打开之后完全没有封面额影子,于是熟练地打开F12F5,很容易地拿到了视频封面地址:

image

于是打算写一个获取B站视频封面的Python脚本。

2.B站的深坑

经过上面的分析,思路就有了:

1.用requests模块获取网页源代码

2.用正则表达式匹配https://i0.hdslb.com/bfs/archive/****.jpg

3.用urllib模块的urllib.request.urlretrieve保存文件

看起来思路清晰,很开心,于是打开VSCode开整。

找了另一个看起来封面好好看的视频:

image

脚本运行出现错误

Traceback (most recent call last):
  File "a.py", line 34, in <module>
    real_img_url = 'http:'+str(img_url[0])
IndexError: list index out of range

看起来是正则表达式匹配出错,于是打开网页源代码,发现了原因:

image

文件的拓展名是.png,果然很神奇,于是修改一下正则表达式:

img_url = re.findall(r'//i0.hdslb.com/bfs/archive/[0-9a-zA-Z\.]+', html.text)

试了一下果然成功了。

然后我就发现这俩视频竟然是同一个UP主投的稿,哇良心UP主啊,打开他的主页,发现了另一个视频

image

果断拿到神秘代码av20252181试一下,然鹅:

image

心中说了一句mmp,然后默默打开网页按F12F5,没找到。。。

于是又打开网页源代码,CTRL+F查一下i0.hdslb.com/bfs/archive,没有任何结果。。。

就在我想要放弃的时候,突然想到酷安有很多获取B站封面视频的软件,心想给手机抓个包美滋滋,然鹅:

image image image

mmpB站还我石原里美

绝望之际,心想私聊UP主要封面照片吧(2333),好吧其实我打开源代码,搜一下hdslb.com/bfs/archive,妈耶竟然搜到了一个看起来特别像的

image

打开链接,竟然成功了。。。

仔细一看,图片域名开头是i1而不是i0

修改正则表达式为:

img_url = re.findall(r'//i[0-9].hdslb.com/bfs/archive/[0-9a-zA-Z\.]+', html.text)

然后测试:

image

奉上原图:

image

除了上面说的那一大堆还遇到了headers、cookie等一堆问题,还好都解决了。

下面奉上源代码:

import requests
import re
import urllib.request

header = {
    'Cache-Control':
    'no-cache, must-revalidate, max-age=0, no-store',
    'Connection':
    'keep-alive',
    'Content-Encoding':
    'gzip',
    'Content-Type':
    'text/html; charset=UTF-8',
    'Date':
    'Sun, 04 Mar 2018 14:39:00 GMT',
    'Expires':
    'Thu, 31 Dec 1997 23:55:55 GMT',
    'Pragma':
    'no-cache',
    'Server':
    'Tengine',
    'Transfer-Encoding':
    'chunked',
    'X-Account-Via':
    'HIT from shd-app-3',
    'X-Cache':
    'MISS from cn-zjwz3-dx-w-03.hdslb.com',
    'X-TKID':
    '152016926293028483424',
    'Accept':    'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
    'Accept-Encoding':
    'gzip, deflate, br',
    'Accept-Language':
    'zh-CN,zh;q=0.9',
    'Cache-Control':
    'max-age=0',
    'Connection':
    'keep-alive',
    'Cookie':
    '填你自己的cookie',
    'Host':
    'www.bilibili.com',
    'Referer':
    'https://passport.bilibili.com/login',
    'Upgrade-Insecure-Requests':
    '1',
    'User-Agent':
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36'
}

url = 'http://www.bilibili.com/'
av_num = input('请输入B站AV号:')
testurl = url + str(av_num)
html = requests.get(testurl,headers=header)
img_url = re.findall(r'//i[0-9].hdslb.com/bfs/archive/[0-9a-zA-Z\.]+', html.text)
#print(img_url)
try:
    real_img_url = 'http:'+str(img_url[0])
    urllib.request.urlretrieve(real_img_url, 'C:/Users/18337/Desktop/'+str(av_num)+'.jpg')
    print(str(av_num)+'视频封面保存成功')
except IndexError as e:
    print('未知错误:'+str(e))
    exit()
finally:
    pass

折腾了一晚上又到了凌晨,此时此刻,我的感受就是:

石原小姐姐真好看呀!

Python小白一枚,自娱自乐,大神勿喷,手动/doge

欢迎评论、私信、来呀一起tree new bee呀~~

欢迎关注微博:@_刘点石

上一篇下一篇

猜你喜欢

热点阅读