爆米花视屏下载
代码
python
import requests
import re
import time
from selenium import webdriver
import threading
import os
import pyqt5
def getUrl():
url = "https://www.baomihua.com/funny"
payload = ""
headers = {
'cache-control': "no-cache",
'Postman-Token': "d004742c-c7a1-48c4-b770-74d6dc7bab79"
}
response = requests.request("GET", url, data=payload, headers=headers)
urs=re.findall(r"//video.*?\d\d\d\d\d\d\d\d",str(response.content))
urls=[]
for ur in urs:
if "http:"+ur not in urls:
urls.append("http:"+ur)
return urls
def moreThreadDownload(urls):
ts=[]
for url,i in zip(urls,range(len(urls))):
while i%5==0 and i!=0:
n=0
for m in range(5):
n=m
if ts[m].isAlive():
n-=1
break
if n==4:
ts=[]
break
t=threading.Thread(target=download,args=[url,i+1])
t.start()
ts.append(t)
def download(url,i):
option = webdriver.ChromeOptions()
option.add_argument("headless")
browser = webdriver.Chrome(chrome_options=option)
browser.get(url)
browser.implicitly_wait(50)
time.sleep(10)
print("正在下载。。。。。{0}".format(str(i)))
mp4_urls=re.findall(r"aliyun.*?mp4",browser.page_source)
browser.quit()
mp4=[]
for mp4_url in mp4_urls:
if "http://"+mp4_url not in mp4:
mp4.append("http://"+mp4_url)
try:
file_path="baomihua"
if os.path.exists(file_path) is not True:
os.makedirs(file_path)
file=open(file_path+"/"+str(i)+".mp4","wb")
file.write(requests.get(mp4[0]).content)
print("下载完成。。。。。{0}".format(str(i)))
except:
print("下载出错。。。。。{0}".format(str(i)))
if __name__=="__main__":
urls=getUrl()
moreThreadDownload(urls)
程序思路
分析网页
下载爆米花搞笑类别的视屏,看见有一些视频被列出,然后想办法获得这些视屏跳转链接,获得这些跳转链接后,分别获取其中的视屏资源地址。
坑:
- 视频资源url是js动态加载的,并不能直接获取
- pip install selenium
- 下载一个 浏览器引擎(chromedriver)
- 将chromedriver放在与.py文件同一目录下(若编译,则需将其与编译后的.exe文件放在同一目录下)
- 利用chromedriver访问网页依旧无视频url
- 因为网页中的视屏播放是要放广告的只有广告放完才执行js,视屏url才会被加载,所以需要等待广告结束(大约十秒钟)
- 爬取速度过慢
- 因为用到浏览器引擎,需要对网页进行渲染,然后爬取渲染后的页面,所以所需要的时间自然较长,所以采用多线程下载