2018-11-02视频爬取
# -*- coding:utf-8 -*- #
import urllib.request
import requests
import re
import os
import time
import logging
from concurrent.futures import ThreadPoolExecutor
#version 0.0.5
#网站的规律是后面的编号是所有视频一起的,但是这些视频是分成不同的月份的。
#比如2018-5/33839,2018-6/33840至2018-6/34732,2018-7/34733到后面有一个2015-10/4709
month="2018-6"
page_id_s = 34001 # 起始id 1600开始
page_id_e = 34011 # 结束id 3620终止
mpath = "VideoSave7"
debug = True
def init():
#new a directory
if(os.path.exists(mpath)):
print("已存在'"+mpath+"',跳过!")
logging.info("已存在'"+mpath+"',跳过!")
else:
os.makedirs(mpath, 0o755)
def analyse():
init()
#inti threadpool
pool = ThreadPoolExecutor(max_workers=3) # 创建一个最大可容纳2个task的线程池
i=1
for page_id in range(page_id_s,page_id_e+1):
#print(pool._work_queue.qsize())
while(pool._work_queue.qsize()>0):
#print("wait...")
time.sleep(1)
purl='http://www.m.com/video/2018-6/'+str(page_id)+'.html'
if debug:
print("%d.开始访问:"%(i)+purl+"\n")
try:
res = requests.get(purl)#requests得到url数据
res.encoding = "gb2312"
if (res.status_code == 200): # response对象返回状态码,如果不是200,说明get失败!也就是没有得到有效信息
# print("访问正常!")
#mtitle = str(i) + "." + re.findall(r'<title>(.*?)</title>', res.text)[0].replace('在线观看', '')
try:
mtitle =str(i)+"."+ re.findall(r'<title>(.*?)</title>', res.text)[0]
except:
print('访问的网页已过时!请检查是否正常。')
mp4List = re.findall(r'https://(.*?)"', res.text)
else:
print("网页访问异常!")
for mp4url in mp4List:
mp4url = "https://" + mp4url
if debug:
#print("得到的mp4地址:"+str(mp4url)+"\n开始下载"+mtitle+"\n"+str(i)+".正在下载中...")
print("%s.准备下载:"%(str(i)) + mtitle + "\n")
else:
print("%s.访问成功,准备执行。\n"%(str(i) ))
with open('test.txt', 'w') as f:
f.writelines([purl, mpath])
mtitle = mtitle + month + "-" + str(page_id)
mpath_title = mpath + '/%s.mp4' % mtitle
futrue1 = pool.submit(download, mp4url, mpath_title, i)
i = i + 1
except requests.exceptions.ConnectionError:
print('1.爬取异常')
def download(mp4url,mpath_title,i):
try:
print("%s.开始执行...\n"%(i))
urllib.request.urlretrieve(mp4url,mpath_title)
#time.sleep(4)
print("%s.执行完成!\n"%(i))
except:
print("%s.执行异常!\n"%(i))
if __name__ =='__main__':
analyse()
'''
更新日志:
0.0.4版本去掉,下载时候的文件名字提示
0.0.5版本,修正全局变量的bug
格式化输出
增加调试模式与正常模式
逻辑修改:因为访问网页与下载是不同线程,所以可以分开,把网页访问得到的信息放到队列中,然后再调用多线程执行即可。
这样做可以提高效率
'''