打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Python爬虫

首先进入今日头条视频首页。

分析网页


其中href属性下的连接就是我们需要下载的视频。

在下载全部视频之前应该分析一下单视频下载的方法。

下载一个视频

首先查看单个视频的网页页面


我们需要获取var mp4下的视频。但是这个语句应该是JS的?可以使用正则匹配到连接。

def get_video_url(url):    try:        res = requests.get(url)        if res.status_code != 200:            print('视频详情页请求失败')            return None        print('视频详情页请求成功 : ' + video_title)        res.encoding = 'utf-8'        link = re.findall(r'var mp4 = "(.*.mp4?)";', res.text)[0]        link = 'http:' + link        return link    except Exception:        print('视频详情页请求失败')        return None
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

这个函数的返回值就是需要下载的视频连接。

    file_path = '{0}/{1}.{2}'.format('D:/1', video_title, 'mp4')    with open(file_path, 'wb') as f: #必须是wb            f.write(data)            f.close()
  • 1
  • 2
  • 3
  • 4
  • 5

这样就可以下载单个视频了。

下载首页全部视频

具体正则方式,详见网页html格式。

#单进程使用def get_urls():    try:        res = requests.get('http://video.eastday.com/')        if res.status_code != 200:            print('视频主页请求失败')            return None        print('获取视频主页')        res.encoding = 'utf-8'        soup = BeautifulSoup(res.text, 'html.parser')        links = soup.find_all('a', pdata=re.compile("index.*")) #所有带视频的标签  都带index这些 例如pdata="index|jlp|12|0"        for link in links:            if not re.findall('.*/a/.*', link['href']): #页面因为最上面的 是类型分类  不带/a/  视频全部带                continue            # if re.compile(link['href'])            if not re.findall('http://video.eastday.com/', link['href']):   #有一部分视频没有http://video.eastday.com/  只有后面一部分                link['href'] = 'http://video.eastday.com/' + link['href']            #对于每一个主页的url都有一个具体页面            get_video_url(link['href'], link['title'])    except Exception:        print('视频主页请求失败')        return None
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

这样下载的方式比较慢,按顺序下载。
为了提高效率,可以考虑进程池方式。

进程池方式下载视频

假如直接加上进程池,相当于每个进程都同时开始下载同一个。。我们应该根据pool.map传入不同参数让不同的进程下载不同的部分。
我们观察可以知道视频主页分为:主题部分、娱乐、记录片等等。
比如这个轻松一刻的代码部分:


我们可以定义一个字典类型,根据参数让不同进程完成不同部分下载。
还有一个比较重要的是。我们对于不同板块需要重新获取该板块的所有url。

具体代码如下:

#进程池使用def get_urls_(item_index):    try:        res = requests.get('http://video.eastday.com/')        if res.status_code != 200:            print('视频主页请求失败')            return None        print('获取视频主页')        res.encoding = 'utf-8'        soup = BeautifulSoup(res.text, 'html.parser')        item_dict = {            '1' : 'w100 clr pt25',   #6个板块            '2' : 'main funny mt10',            '3' : 'main mt10 consult',            '4' : 'main mt10 entertainment',            '5' : 'main mt10 Blog',            '6' : 'main mt10 record',         }        #这里就相当于不同进程(1-6号进程) 执行不同板块的url下载工作        html_all = soup.find_all('div', class_=re.compile(item_dict[str(item_index)]))        soup_items = BeautifulSoup(str(html_all[0]), 'html.parser')  # 加上str!!! 还有它是列表!!!        soup_items = soup_items.find_all('a', pdata=re.compile("index.*"))        for item in soup_items:            if not re.findall('.*/a/.*', item['href']):                continue            if not re.findall('http://video.eastday.com/', item['href']):                item['href'] = 'http://video.eastday.com/' + item['href']            get_video_url(item['href'], item['title'])    except Exception:        print('视频主页请求失败')        return Noneif __name__=='__main__':    groups = [x for x in range(0, 6)]    pool = Pool()    pool.map(get_urls_, groups) #需要执行的 加上条件
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

调试代码

可以看到是同时执行,而不是顺序执行。提高效率。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
用Python实现Youku视频批量下载
如何抓取视频资源-以头条视频为例
使用Python实现读取TXT小说文件按每一回显示打印出来
用python实现的抓取腾讯视频所有电影的爬虫
请查收,一份让你年薪突破20W的Python爬虫笔记!
python入门实例——正则表达式和函数的使用
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服