基于python爬取梨视频实现过程解析


Posted in Python onNovember 09, 2020

目标网址:梨视频

然后我们找到科技这一页:https://www.pearvideo.com/category_8。其实你要哪一页都行,你喜欢就行。嘿嘿…

这是动态网站,所以咱们直奔network 然后去到XHR:

基于python爬取梨视频实现过程解析

找规律,这个应该不难,我就直接贴网址上来咯,想要锻炼的可以找找看哈:

https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=8&start=0

这个就是我们要找的目标网址啦,后面的0就代表页数,让打开这个网页发现是静态网页,这最好搞啦,直接上:

基于python爬取梨视频实现过程解析

代码如下:

import requests
import parsel,re
import os
target = "https://www.pearvideo.com/videoStatus.jsp?contId="

url = "https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=9&start=0"
res = requests.get(url)
res.encoding="utf-8"
html = parsel.Selector(res.text)
lists = html.xpath('/html/body/li/div/a/@href').getall()
for each in lists:

  print("https://www.pearvideo.com/"+each)

output;
https://www.pearvideo.com/video_1703486
https://www.pearvideo.com/video_1703189
https://www.pearvideo.com/video_1703161
https://www.pearvideo.com/video_1702880
https://www.pearvideo.com/video_1702773
...

顺利拿到,然后进入播放页面,却发现找不到MP4视频,怎么办?经过我一番努力(扯掉了几十根头发后)发现,它在另外一个网址里面

基于python爬取梨视频实现过程解析

咋办?当然要想办法把这个网址搞到手啦,仔细分析下,发现这个网址非常陌生呀,唯一稍微熟悉点的就是那串数字了,前面我们拿到播放页的网址后面那串数字和这个对比,完全是一模一样的,这样的话那就好搞了,咱们直接用拼接的方式把它接上去就可以了,看代码:

for each in lists:
  url_num = each.replace('video_',"")
  urls = target+url_num
  print(urls)
``

```python
output:
https://www.pearvideo.com/videoStatus.jsp?contId=1703486
https://www.pearvideo.com/videoStatus.jsp?contId=1703189
https://www.pearvideo.com/videoStatus.jsp?contId=1703161
https://www.pearvideo.com/videoStatus.jsp?contId=1702880
https://www.pearvideo.com/videoStatus.jsp?contId=1702773
https://www.pearvideo.com/videoStatus.jsp?contId=1702633
...

出来了,好像稍微有点不一样,后面那啥&mrd=***************** 没有,怎么办?没有就不要呗,看过我发的百度图片那篇的朋友都懂,网址里面有些东西是不需要的,纯粹是搞咱们这些玩爬虫的,恶心咱们。不过没办法,毕竟是咱们要去爬人家的数据的。

网址问题解决了,但是点进去一看,发现这东东:

基于python爬取梨视频实现过程解析

恩,很明显,是遇到反爬机制了,这个好搞,要什么给什么就行,代码如下:

headers = {
  'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36',
  'Referer': 'https://www.pearvideo.com/video_'+ str(url_num)
  }
  html = requests.get(urls,headers=headers).text
  print(html)

基于python爬取梨视频实现过程解析

搞定!!

最后我们看一下MP4能不能播放:

基于python爬取梨视频实现过程解析

西八!404!!恩,这里就稍微有点麻烦了,还得找数据,把里面的时间戳改成 ‘cont-数字‘,感觉写了好多,手都有点累了,我就直接上代码了:

import requests
import parsel,re
import os


 
target = "https://www.pearvideo.com/videoStatus.jsp?contId="

url = "https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=9&start=0"
res = requests.get(url)
res.encoding="utf-8"
html = parsel.Selector(res.text)
lists = html.xpath('/html/body/li/div/a/@href').getall()
# print(lists[2:])
# 提取视频后面的数字,数字是最重要的,需要传给 Referer 和 urls
for each in lists:
  url_num = each.replace('video_',"")
  urls = target+url_num
  # print(urls)
  headers = {
  'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36',
  'Referer': 'https://www.pearvideo.com/video_'+ str(url_num)
  }
  html = requests.get(urls,headers=headers).text
  
  cont = 'cont-' + str(url_num)

  # 提取 mp4 视频
  srcUrl = re.findall(f'"srcUrl":"(.*?)"',html)[0]
  # 替换视频里面的时间戳,改为可以真正播放的数据
  new_url = srcUrl.replace(srcUrl.split("-")[0].split("/")[-1],cont)
  print(new_url)
  

  # 使用视频后缀当视频名称
  filename = srcUrl.split("/")[-1]

  # 保存到本地
  with open("./images/"+filename,"wb") as f:
    f.write(requests.get(new_url).content)

基于python爬取梨视频实现过程解析

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python Mysql自动备份脚本
Jul 14 Python
用ReactJS和Python的Flask框架编写留言板的代码示例
Dec 19 Python
Python的Flask框架应用程序实现使用QQ账号登录的方法
Jun 07 Python
Python实现两个list对应元素相减操作示例
Jun 09 Python
Python实现Pig Latin小游戏实例代码
Feb 02 Python
解决Shell执行python文件,传参空格引起的问题
Oct 30 Python
python实时获取外部程序输出结果的方法
Jan 12 Python
基于wxPython的GUI实现输入对话框(1)
Feb 27 Python
python dlib人脸识别代码实例
Apr 04 Python
pyinstaller打包成无控制台程序时运行出错(与popen冲突的解决方法)
Apr 15 Python
python中读入二维csv格式的表格方法详解(以元组/列表形式表示)
Apr 24 Python
Pandas数据分析的一些常用小技巧
Feb 07 Python
Python eval函数介绍及用法
Nov 09 #Python
python tkinter的消息框模块(messagebox,simpledialog)
Nov 07 #Python
python 用struct模块解决黏包问题
Nov 07 #Python
python hmac模块验证客户端的合法性
Nov 07 #Python
python如何利用paramiko执行服务器命令
Nov 07 #Python
基于python模拟TCP3次握手连接及发送数据
Nov 06 #Python
如何使用Django Admin管理后台导入CSV
Nov 06 #Python
You might like
用Socket发送电子邮件(利用需要验证的SMTP服务器)
2006/10/09 PHP
phpMyAdmin链接MySql错误 个人解决方案
2009/12/28 PHP
php模拟post上传图片实现代码
2016/06/24 PHP
老生常谈PHP面向对象之解释器模式
2017/05/17 PHP
Ubuntu 16.04中Laravel5.4升级到5.6的步骤
2018/12/07 PHP
Laravel+Intervention实现上传图片功能示例
2019/07/09 PHP
js控制CSS样式属性语法对照表
2012/12/11 Javascript
下载文件个别浏览器文件名乱码解决办法
2013/03/19 Javascript
js随机颜色代码的多种实现方式
2013/04/23 Javascript
jquery实现控制表格行高亮实例
2013/06/05 Javascript
JavaScript严格模式禁用With语句的原因
2014/10/20 Javascript
jQuery继承extend用法详解
2016/10/10 Javascript
JSON对象 详解及实例代码
2016/10/18 Javascript
servlet+jquery实现文件上传进度条示例代码
2017/01/25 Javascript
使用原生的javascript来实现轮播图
2017/02/24 Javascript
jQuery Ajax前后端使用JSON进行交互示例
2017/03/17 Javascript
VS Code转换大小写、修改选中文字或代码颜色的方法
2017/12/15 Javascript
用jquery获取select标签中选中的option值及文本的示例
2018/01/25 jQuery
JS设计模式之状态模式概念与用法分析
2018/02/05 Javascript
微信小程序wx:for循环的实例详解
2018/10/07 Javascript
layer iframe 设置关闭按钮的方法
2019/09/12 Javascript
[01:29:42]Liquid vs VP Supermajor决赛 BO 第一场 6.10
2018/07/05 DOTA
让python的Cookie.py模块支持冒号做key的方法
2010/12/28 Python
Python栈类实例分析
2015/06/15 Python
python Django模板的使用方法
2016/01/14 Python
Python中模块pymysql查询结果后如何获取字段列表
2017/06/05 Python
django加载本地html的方法
2018/05/27 Python
在python中利用最小二乘拟合二次抛物线函数的方法
2018/12/29 Python
简单了解为什么python函数后有多个括号
2019/12/19 Python
python单例模式的应用场景实例讲解
2021/02/24 Python
英国现代市场:ARKET
2019/04/10 全球购物
法雷奥SQA(electric)面试问题
2016/01/23 面试题
公司业务主管岗位职责
2013/12/07 职场文书
写给妈妈的道歉信
2014/01/11 职场文书
二年级作文之动物作文
2019/11/13 职场文书
解决Django transaction进行事务管理踩过的坑
2021/04/24 Python