用python实现多线程爬取影视网站全部视频方法【笔记】
我拿这个站点作为案例:https://91mjw.com/ 其他站点方法都是差不多的。
第一步:获得整站所有的视频连接
html = requests.get("https://91mjw.com",headers=gHeads).text
xmlcontent = etree.HTML(html)
UrlList = xmlcontent.xpath("//div[@class='m-movies clearfix']/article/a/@href")
NameList = xmlcontent.xpath("//div[@class='m-movies clearfix']/article/h2/a/text()")
第二步 :是进入选择的电影的页面 去获得视频的链接
UrlList = xmlContent.xpath("//div[@id='video_list_li']/a/@href")
第三步 构造下载视频用到的参数
第四步 下载视频 保存到本地
直接上实现代码
使用的多线程 加信号量实现 默认开启5条线程开始操作 每条线程去下载一套视频 是一套 一套 一套
也可以自己去修改同时开启几条线程
实现代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import re
import requests
from threading import *
from bs4 import BeautifulSoup
from lxml import etree
from contextlib import closing
nMaxThread = 5
connectlock = BoundedSemaphore(nMaxThread)
gHeads = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"}
class MovieThread(Thread):
def __init__(self,url,movieName):
Thread.__init__(self)
self.url = url
self.movieName = movieName
def run(self):
try:
urlList = self.GetMovieUrl(self.url)
for i in range(len(urlList)):
type,vkey = self.GetVkeyParam(self.url,urlList[i])
if type != None and vkey !=None:
payload,DownloadUrl = self.GetOtherParam(self.url,urlList[i],type,vkey)
if DownloadUrl :
videoUrl = self.GetDownloadUrl(payload,DownloadUrl)
if videoUrl :
self.DownloadVideo(videoUrl,self.movieName,i+1)
finally:
connectlock.release()
def GetMovieUrl(self,url):
heads = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
"Host":"91mjw.com",
"Referer":"https://91mjw.com/"
}
html = requests.get(url,headers=heads).text
xmlContent = etree.HTML(html)
UrlList = xmlContent.xpath("//div[@id='video_list_li']/a/@href")
if len(UrlList) > 0:
return UrlList
else:
return None
def GetVkeyParam(self,firstUrl,secUrl):
heads = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
"Host": "91mjw.com",
"Referer": firstUrl
}
try :
html = requests.get(firstUrl+secUrl,headers=heads).text
bs = BeautifulSoup(html,"html.parser")
content = bs.find("body").find("script")
reContent = re.findall('"(.*?)"',content.text)
return reContent[0],reContent[1]
except:
return None,None
def GetOtherParam(self,firstUrl,SecUrl,type,vKey):
url = "https://api.1suplayer.me/player/?userID=&type=%s&vkey=%s"%(type,vKey)
heads = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
"Host": "api.1suplayer.me",
"Referer": firstUrl+SecUrl
}
try:
html = requests.get(url,headers=heads).text
bs = BeautifulSoup(html,"html.parser")
content = bs.find("body").find("script").text
recontent = re.findall(" = '(.+?)'",content)
payload = {
"type":recontent[3],
"vkey":recontent[4],
"ckey":recontent[2],
"userID":"",
"userIP":recontent[0],
"refres":1,
"my_url":recontent[1]
}
return payload,url
except:
return None,None
def GetDownloadUrl(self,payload,refereUrl):
heads = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
"Host": "api.1suplayer.me",
"Referer": refereUrl,
"Origin": "https://api.1suplayer.me",
"X-Requested-With": "XMLHttpRequest"
}
while True:
retData = requests.post("https://api.1suplayer.me/player/api.php",data=payload,headers=heads).json()
if retData["code"] == 200:
return retData["url"]
elif retData["code"] == 404:
payload["refres"] += 1;
continue
else:
return None
def DownloadVideo(self,url,videoName,videoNum):
CurrentSize = 0
heads = {
"chrome-proxy":"frfr",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
"Host":"sh-yun-ftn.weiyun.com",
"Range":"bytes=0-"
}
with closing(requests.get(url,headers=heads)) as response:
retSize = int(response.headers['Content-Length'])
chunkSize = 10240
if response.status_code == 206:
print '[File Size]: %0.2f MB\n' % (retSize/1024/1024)
with open("./video/%s/%02d.mp4"%(videoName,videoNum),"wb") as f:
for data in response.iter_content(chunk_size=chunkSize):
f.write(data)
CurrentSize += len(data)
f.flush()
print '[Progress]: %0.2f%%' % float(CurrentSize*100/retSize) + '\r'
def main():
html = requests.get("https://91mjw.com",headers=gHeads).text
xmlcontent = etree.HTML(html)
UrlList = xmlcontent.xpath("//div[@class='m-movies clearfix']/article/a/@href")
NameList = xmlcontent.xpath("//div[@class='m-movies clearfix']/article/h2/a/text()")
for i in range(len(UrlList)):
connectlock.acquire()
url = UrlList[i]
name = NameList[i].encode("utf-8")
t = MovieThread(url,name)
t.start()
if __name__ == '__main__':
main()
用python实现多线程爬取影视网站全部视频方法【笔记】的更多相关文章
- from appium import webdriver 使用python爬虫,批量爬取抖音app视频(requests+Fiddler+appium)
使用python爬虫,批量爬取抖音app视频(requests+Fiddler+appium) - 北平吴彦祖 - 博客园 https://www.cnblogs.com/stevenshushu/p ...
- python之简单爬取一个网站信息
requests库是一个简介且简单的处理HTTP请求的第三方库 get()是获取网页最常用的方式,其基本使用方式如下 使用requests库获取HTML页面并将其转换成字符串后,需要进一步解析HTML ...
- 初次尝试python爬虫,爬取小说网站的小说。
本次是小阿鹏,第一次通过python爬虫去爬一个小说网站的小说. 下面直接上菜. 1.首先我需要导入相应的包,这里我采用了第三方模块的架包,requests.requests是python实现的简单易 ...
- 用Python爬取影视网站,直接解析播放地址。
记录时刻! 写这个爬虫主要是想让自己的爬虫实用,把脚本放到了服务器,成为可随时调用的接口. 思路算是没思路吧!把影视名带上去请求影视网站,然后解析出我们需要的播放地址. 我也把自己的接口分享出来.接口 ...
- Python多线程爬取某网站表情包
# 爬取网络图片import requestsfrom lxml import etreefrom urllib import requestfrom queue import Queue # 导入队 ...
- python协程爬取某网站的老赖数据
import re import json import aiohttp import asyncio import time import pymysql from asyncio.locks im ...
- 使用python爬虫,批量爬取抖音app视频(requests+Fiddler+appium)
抖音很火,楼主使用python随机爬取抖音视频,并且无水印下载,人家都说天下没有爬不到的数据,so,楼主决定试试水,纯属技术爱好,分享给大家.. 1.楼主首先使用Fiddler4来抓取手机抖音app这 ...
- Python爬虫一爬取B站小视频源码
如果要爬取多页的话 在最下方循环中 填写好循环的次数就可以了 项目源码 from fake_useragent import UserAgent import requests import time ...
- Python多进程方式抓取基金网站内容的方法分析
因为进程也不是越多越好,我们计划分3个进程执行.意思就是 :把总共要抓取的28页分成三部分. 怎么分呢? # 初始range r = range(1,29) # 步长 step = 10 myList ...
随机推荐
- Github首次使用教程(本地新建项目并同步到Github远程仓库)
网上关于Github的教程很多且有点乱,自己亲自躺坑实践,现分享出来给将要入坑的小伙伴. 主要步骤: 创建Github帐号,登录,新建仓库(远程仓库) 下载安装Git,git bash配置及简单使用( ...
- SpringBoot系列教程web篇之Post请求参数解析姿势汇总
作为一个常年提供各种Http接口的后端而言,如何获取请求参数可以说是一项基本技能了,本篇为<190824-SpringBoot系列教程web篇之Get请求参数解析姿势汇总>之后的第二篇,对 ...
- sort_buffer_size, Sort_merge_passes关系
对于事务性工作负载是通常最快这个大小设置为32K,并且也是允许的最小尺寸.您应该谨慎使用它设置为较大的值,因为这可以很容易地降低性能. 如果所有的数据进行排序不适合在指定缓冲区大小的MySQL第一种类 ...
- 讲解JavaScript中对闭包的理解
1.JS中变量的作用域 在理解闭包之前,我们得弄清楚JS中变量的作用域原理,它分为全局作用域和局部作用域,它有一个特点就是局部可以获取全局的声明变量,而全局却不能得到局部声明的变量,我们先来看一个小例 ...
- docker容器中用户自定bridge网络与默认bridge网络之间的区别
转载 https://blog.csdn.net/dkfajsldfsdfsd/article/details/79959534
- [转帖]在 k8s 中自动为域名配置 https
在 k8s 中自动为域名配置 https https://juejin.im/post/5db8d94be51d4529f73e2833 随着 web 的发展,https 对于现代网站来说是必不可少的 ...
- [转帖]《吊打面试官》系列-Redis基础
<吊打面试官>系列-Redis基础 https://www.cnblogs.com/aobing/archive/2019/11/07/11811194.html 你知道的越多,你不知 ...
- MySQL权限管理常用命令
1.进入mysql命令行. (1)SSH连接:mysql -u root -p输入root密码 (2)Navicat for MySQL中:右击连接,选择“命令列界面..” 2.mysql环境操作 ( ...
- drf复习(一)--原生djangoCBV请求生命周期源码分析、drf自定义配置文件、drf请求生命周期dispatch源码分析
admin后台注册model 一.原生djangoCBV请求生命周期源码分析 原生view的源码路径(django/views/generic/base.py) 1.从urls.py中as_view ...
- 51单片机局部变量占用ram的问题
51单片机局部变量占用ram的问题 一.问题 自从工作以来基本不使用51或者增强型51之类的单片机.最近调试芯圣HC89S003F4增强型51,移植了32的实用代码,结果发现RAM爆了!!! 二.实践 ...