网络爬虫,听起来很神秘,其实也不过如此,简单来说,只要网站开放了端口即用户能访问这个网站,那么无论这个网站的反爬机制做的有多么好,只要你的技术够,总会有机会破解它。
换句话说,不是你的网站很安全,而是你的信息没有价值。我前几天无意中找到了别样网,选择这个网站的原因是这个网站里有很多视频素材,这是很少有的。
一般来说,只要网站上有的东西,都能抓取下来,就看这东西有没有价值罢了。大家可以翻阅我以前的文章:
- 爬取图片:抓取王者荣耀英雄列表的爬虫笔记(python+requests)
- 爬取文字:抓取中国天气网当前时段所有城市的天气数据(python+xpath)
- 模拟登陆:使用python登陆某学校内网(操控浏览器进行登陆操作)
- 群发邮件:爬取某新闻网站的新闻并实现自动群发邮件的功能(python3+SMTP)
当然,我目前所爬取的都是开放的服务型网站,不涉及隐私信息,这里我想说的是:
每一种新兴技术就好比是一把刀,刀本身没有错,关键看用刀的人是谁,用刀的目的是什么。
学习爬虫技术能让我们清楚网络爬虫的运行机制,以此来提高大家的安全意识,从另一方面来说,通过学习爬虫技术,能提高我们对python的学习兴趣。
下面展示一下最终效果:
使用爬虫,几十个视频分分钟下载完成,顺带自动命名,是不是很方便?
如果手动下载,我们还需要各种登陆,重复各种操作,十分钟都不一定能解决,况且如果要下载的视频很多,岂不是很麻烦?
这就是爬虫的优势所在!话不多说,下面我们来讲讲具体方法:
我这里使用的是谷歌浏览器,按住F12,或者右键进入检查,便可打开这一界面,因为我们需要的东西不在HTML的代码里(如果在,我们可以用xpath):
所以我们找到Network这个选项:
按住Ctrl+R刷新界面,可以看到下面有很多栏,这是网页返回的数据,我们需要的视频就在这里面,往下翻翻:
可以看到有很多.MP4的后缀,我想这应该就是我们想要的东西,点击进去看一下:
看这里的url地址,我们复制一下,用浏览器打开:
可以看到,确实是一个视频,而且这个视频是我们想要的,但是,光有一个视频是不够的,既然是批量下载,肯定要找到其他存放这些地址的列表,于是我们再找找看:
我们发现这个20002出现了很多次,我们分别点进去看一下,可以发现这有一个共同点,所有的20002里面都是有数据的,但是,里面的数据有限,看来也不是这一条数据,接着再往下找:
好像快要接近了,我们看这里面有很多数据,打开来看一下:
很好,里面有我们想要的东西,我们在headers里找到他的url地址,并使用浏览器打开它:
出现异常了,原因是这里的请求需要携带参数,我们在GitHub找到一个解析工具:
https://curl.trillworks.com/
回到刚刚的网页:
复制cURL并粘贴到刚刚curl command里:
把右边的python request全部复制到python编辑器里:
import requests
cookies = {
'BAIDU_SSP_lcr': 'https://www.baidu.com/link?url=kzwk2tY6VdLzGcc1Nfo9AWYgrzw-jxD1wVstT4gKkku&wd=&eqid=90bb793e00089362000000065e43d96c',
'_dg_playback.7b6028a56aac520d.ce42': '1',
'_dg_abtestInfo.7b6028a56aac520d.ce42': '1',
'_dg_check.7b6028a56aac520d.ce42': '-1',
'_dg_antiBotFlag.7b6028a56aac520d.ce42': '1',
'_dg_antiBotInfo.7b6028a56aac520d.ce42': '10%7C%7C%7C3600',
'SESSION': 'OTIyZGE2ZTgtMjM0Yi00NmZjLWEyM2MtMmJiYTVhMzEwZWJj',
'_dg_id.7b6028a56aac520d.ce42': 'bdbb5697b510c5bc%7C%7C%7C1581504892%7C%7C%7C9%7C%7C%7C1581509404%7C%7C%7C1581509342%7C%7C%7C%7C%7C%7C53b348475c9a517a%7C%7C%7C%7C%7C%7Chttps%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3Dkzwk2tY6VdLzGcc1Nfo9AWYgrzw-jxD1wVstT4gKkku%26wd%3D%26eqid%3D90bb793e00089362000000065e43d96c%7C%7C%7C1%7C%7C%7Cundefined',
}
headers = {
'Connection': 'keep-alive',
'Accept': 'application/json',
'Sec-Fetch-Dest': 'empty',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36',
'Content-Type': 'application/json',
'Origin': 'https://www.ssyer.com',
'Sec-Fetch-Site': 'same-origin',
'Sec-Fetch-Mode': 'cors',
'Accept-Language': 'zh-CN,zh;q=0.9',
}
data = '{"cateId":2,"order":2,"recommendType":1,"page":{"showCount":20,"currentPage":2}}'
response = requests.post('https://www.ssyer.com/apis/20001', headers=headers, cookies=cookies, data=data)
print(response)
200表示请求成功!我们在这里解析一下:
在response的后面加上.text:
response = requests.post('https://www.ssyer.com/apis/20001', headers=headers, cookies=cookies, data=data).text
可以看出,我们想要的东西就在里面,只要提取出来就可以了:
response = requests.post('https://www.ssyer.com/apis/20001', headers=headers, cookies=cookies, data=data)
json_datas = response.json()
json_data = json_datas['data']
这里我们把下载好的视频存到一个名为"20200213video"的文件夹里:
video_path = '20200213video'
if not os.path.exists(video_path):
os.mkdir(video_path)
接下来用一个循环,边提取边下载:
for item in range(len(json_data)):
print(json_data[item]['video'])
print("正在下载第%s个视频"%(item+1))
file_path = video_path+'/'+ '%s'%(item+1) +'.mp4'
urlretrieve(json_data[item]['video'],file_path,cbk)
简单讲讲最后一句里的urlretrieve(),这是负责下载文件的函数,括号左边是下载地址,中间是保存的地址,第三个是检查下载进度:
def cbk(a,b,c):
'''回调函数
a:已经下载的数据块
b:数据块的大小
c:远程文件的大小
'''
per=100.0*a*b/c
if per>100:
per=100
print('%.2f%%' % per)
但是下载一个视频也就几秒的事,看上去显得很多余,所以这一步也可以不要:
我们可以播放一下视频:
确认过眼神,是可以播放的视频。今天的内容到这里就结束了,大家如果有问题的话,欢迎大家在评论区留言!