基于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 logging模块学习笔记
May 24 Python
Python的迭代器和生成器使用实例
Jan 14 Python
以Python的Pyspider为例剖析搜索引擎的网络爬虫实现方法
Mar 30 Python
Django model序列化为json的方法示例
Oct 16 Python
对Python 简单串口收发GUI界面的实例详解
Jun 12 Python
python创建学生管理系统
Nov 22 Python
Python如何根据时间序列数据作图
May 12 Python
基于python检查矩阵计算结果
May 21 Python
Python基于数列实现购物车程序过程详解
Jun 09 Python
Django封装交互接口代码
Jul 12 Python
详解pandas apply 并行处理的几种方法
Feb 24 Python
Python中for后接else的语法使用
May 18 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
PHP中调用ASP.NET的WebService的代码
2011/04/22 PHP
Could not load type System.ServiceModel.Activation.HttpModule解决办法
2012/12/29 PHP
什么是PEAR?什么是PECL?PHP中两个容易混淆的概念解释
2015/07/01 PHP
Yii框架组件和事件行为管理详解
2016/05/20 PHP
PHP 在数组中搜索给定的简单实例 array_search 函数
2016/06/13 PHP
PHP+Ajax异步带进度条上传文件实例
2016/11/01 PHP
基于jQueryUI和Corethink实现百度的搜索提示功能
2016/11/09 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
2017/09/16 PHP
Jquery中dialog属性小记
2010/09/03 Javascript
javascript框架设计之浏览器的嗅探和特征侦测
2015/06/23 Javascript
javascript自动恢复文本框点击清除后的默认文本
2016/01/12 Javascript
深入解析JavaScript中的立即执行函数
2016/05/21 Javascript
JavaScript SHA-256加密算法详细代码
2016/10/06 Javascript
javaScript语法总结
2016/11/25 Javascript
利用JS屏蔽页面中的Enter按键提交表单的方法
2016/11/25 Javascript
JS中append字符串包含onclick无效传递参数失败的解决方案
2016/12/26 Javascript
jquery中关于bind()方法的使用技巧分享
2017/03/30 jQuery
nodejs中art-template模板语法的引入及冲突解决方案
2017/11/07 NodeJs
原生javascript自定义input[type=radio]效果示例
2019/08/27 Javascript
Node 代理访问的实现
2019/09/19 Javascript
selenium+java中用js来完成日期的修改
2019/10/31 Javascript
js实现百度登录窗口拖拽效果
2020/03/19 Javascript
解决Mint-ui 框架Popup和Datetime Picker组件滚动穿透的问题
2020/11/04 Javascript
[15:35]教你分分钟做大人:天怒法师
2014/10/30 DOTA
Python实现的数据结构与算法之快速排序详解
2015/04/22 Python
Python连接mysql数据库的正确姿势
2016/02/03 Python
详解Python并发编程之创建多线程的几种方法
2019/08/23 Python
Django框架 Pagination分页实现代码实例
2019/09/04 Python
Python pathlib模块使用方法及实例解析
2020/10/05 Python
python实现测试工具(二)——简单的ui测试工具
2020/10/19 Python
python中编写函数并调用的知识点总结
2021/01/13 Python
CSS3模块的目前的状况分析
2010/02/24 HTML / CSS
低碳环保倡议书
2014/04/14 职场文书
招股说明书范本
2014/05/06 职场文书
CSS3 菱形拼图实现只旋转div 背景图片不旋转功能
2021/03/30 HTML / CSS
python3 删除所有自定义变量的操作
2021/04/08 Python