14⾏Python代码轻松实现爬取⽹站视频
前⾔
本⽂的⽂字及图⽚来源于⽹络,仅供学习、交流使⽤,不具有任何商业⽤途,版权归原作者所有,如有问题请及时以作处理。
作者: IvanFX 复兴计算机社团
PS:如有需要Python学习资料的⼩伙伴可以加点击下⽅链接⾃⾏获取
图片下载站源码
基本步骤与准备⼯作
调试环境:
pycharm+python3
需要库:
urllib.
request
re
(kiejar 后续爬⾍进场会使⽤到的库,本项⽬反爬不涉及所以可以不添加)
如果import过程显⽰没有上述库,可以通过⽂件→设置→projet interpreter中右侧点击+来添加(如果您使⽤anaconda或者python也可以直接运⾏本项⽬,通过cmd→pip install添加)
2.在本⽂中我们通过python对于在线的短视频进⾏爬取,下载存储。基本步骤如下(可以写注释梳理思路):
(1)分析页⾯URL和视频⽂件URL特征
(2)获取⽹页源代码HTML,解决反爬机制
(3)批量下载视频存储
分析页⾯URL与⽂件URL特征
1.分析⽹页URL
2.分析⽂件名URL
通过对于⽹页当中的mp4的⽂件名进⾏分析,发现⽂件的URL是明⽂显⽰的,所以通过re的正则可以匹配获取。批量获取URL,并从中提取视频的URL
quest
import re
for  page in range (1,20):
req = quest.Request("www.budejie/video/%s" % page)
html = quest.urlopen(req).read()
html = html.decode('UTF-8')
print(html)
1.批量爬取⽹页URL
这⾥我们page变量代表页⾯的编码,从这⾥我们暂时先爬取前20页。
(1)req获取⽹页反馈
(2)html通过函数获取⽹页的元代码
(3)通过对于源代码UTF-8编码恢复中⽂的显⽰。
但是通过上述代码的执⾏发现错误显⽰http Error 403,因为⽹页的反爬机制不能获取。
2.通过页⾯增加头⽂件
我们通过⾕歌浏览器访问页⾯,按F12并切换到Network,刷新界⾯观察访问进程,可以从进程⽂件中选取⼀个查看头⽂件,添加到代码
中,(这⾥选取的baisibudejie.js)修改代码如下,可以正常爬取界⾯。
for  page in range (1,20):
req = quest.Request("www.budejie/video/%s" % page)
req.add_header("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36")    html = quest.urlopen(req).read()
html = html.decode('UTF-8')
print(html)
批量下载视频,并建⽴⽂件名存储
1.建⽴循环结构批量命名
建⽴循环结构之后,需要保留⽂件名下载,i.split("/")[-1]的含义是将i进⾏分割,以‘/’为分割符,保留最后⼀段,即MP4⽂件名。
2.批量下载
还是需要加⼀句显⽰的输出语句,来表⽰进程,也符合⼀个程序的交互性,也就是下载到那个视频的时候显⽰⼀下进度,最后下载到⼀个
mp4的⽂件夹内
for i in re.findall(reg, html):
filename = i.split("/")[-1]  # 以‘/ ’为分割f符,保留最后⼀段,即MP4的⽂件名
print('正在下载%s视频' % filename)
1.建⽴完整程序
作为⼀名合格的程序员,需要梳理程序,添加注释,便于理解和后续的修改
quest
import re
def getVideo(page):
req = quest.Request("www.budejie/video/%s" %page)
req.add_header("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36")        html = quest.urlopen(req).read()
html = html.decode('UTF-8')
reg = r'data-mp4="(.*?)"'
for i in re.findall(reg,html):
filename = i.split("/")[-1]#以‘/ ’为分割f符,保留最后⼀段,即MP4的⽂件名
print ('正在下载%s视频' %filename)
for  i in range (1,20):
getVideo(i)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。