最近看到很多博主下载资源,其中有人就问:我们是搞程序出生的,能不能写段代码来实现微博下载视频资源呢?
当然,可以了,下面我使用python,来做一下演示。
1.借助JavaScript将页面滚动到最底部
def scroll(driver):
driver.execute_script("""
(function () {
var y = document.body.scrollTop;
var step = 100;
window.scroll(0, y);
function f() {
if (y < document.body.scrollHeight) {
y += step;
window.scroll(0, y);
setTimeout(f, 50);
}
else {
window.scroll(0, y);
document.title += "scroll-done";
}
}
setTimeout(f, 1000);
})();
""")
2.登录代码
from selenium import webdriver
import time
driver = webdriver.PhantomJS(executable_path=r'D:\phantomjs\bin\phantomjs.exe')
driver.set_window_size(1124, 850)#如果不设置窗口大小,send_keys()会报错
driver.get('https://weibo.com/login.php')
driver.find_element_by_id('loginname').send_keys('*********@qq.com')#输入用户名
driver.find_element_by_name('password').send_keys('********')#输入密码
driver.find_element_by_css_selector('.W_btn_a.btn_32px').click()
3.等待浏览器加载JavaScript,如果出现了“加载更多微博”则单击该链接
driver.get('http://www.weibo.com/u/2479183364/home?wvr=5&c=spr_sinamkt_buy_hyww_weibo_t112')#模拟登录成功之后需要手动转到用户主页,否则用户主页中的js不会加载
for i in range(100):
scroll(driver)
time.sleep(2) #等待浏览器加载JavaScript
print(i)
try: #如果出现了“加载更多微博”则单击该链接
check = driver.find_element_by_css_selector('.more_txt.W_f14')
check.click()
except:
pass
html = driver.page_source
with open('sourcepage.html','wb') as f:
f.write(html.encode('utf-8'))
4.分析网页代码并下载视频,具体代码如下:
f = open('sourcepage.html','r',encoding='utf-8')
def Schedule(a,b,c):
'''''
a:已经下载的数据块
b:数据块的大小
c:远程文件的大小
'''
per = 100.0 * a * b / c
if per > 100 :
per = 100
print('%.2f%%' % per,'已完成:',a*b,'文件大小:',c)
import re
import urllib.request
5.视频地址保存在如下字符串中:video_src=%2F%2Ff.us.sinaimg.cn%2F003VadS9lx07dFILBptK010f010027cR0k01.mp4
src_list = re.findall(r'video_src=(.+?\.mp4)',f.read())#提取地址
for i in range(len(src_list)):
src_list[i] = re.sub(r'%2F','/',src_list[i])
try:#部分视频无法访问,会抛出403错误
urllib.request.urlretrieve('http:'+src_list[i],"D:/Book/大型实例/Weibo"+re.sub(r'/','',src_list[i]),Schedule)
except Exception as e:
print(e)
OK,先写到这了,下次再写了!呵呵~