2018-11-02视频爬取

```python

# -*- 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'(.*?)', res.text)[0].replace('在线观看', '')

                try:

                    mtitle =str(i)+"."+ re.findall(r'(.*?)', 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

        格式化输出

        增加调试模式与正常模式

逻辑修改:因为访问网页与下载是不同线程,所以可以分开,把网页访问得到的信息放到队列中,然后再调用多线程执行即可。

这样做可以提高效率

```

你可能感兴趣的:(2018-11-02视频爬取)