异步多线程下载网页爬取的视频

程序改进如下:::

import requests
import re # 正则模块
import uuid # uuid.uuid(4) 可以根据时间戳生成一段世界上唯一的随机字符串

# 导入线程池模块

from concurrent.futures import ThreadPoolExecutor

# 线程(os的资源,一个进程可以开多个线程),但是无法限制好线程数;
# 线程池:帮助控制好线程数

pool = ThreadPoolExecutor(50)


# 爬虫三部曲

# 1、发送请求

def get_page(url):
print("开始异步任务:{url}")
response = requests.get(url)
return response


# 2、解析数据
# 解析主页获取视频详情页ID
def parse_index(res):
response = res.result()
res = re.findall('<a href="video_(.*?)', response.text, re.S)
# print(res)
# detail_url_list = []
for m_id in res:
# 拼接详情页url
detail_url = 'https://www.pearvideo.com/video_' + m_id
# 把详情页url提交给get_page
pool.submit(get_page, detail_url).add_done_callback(parse_detail)
# detail_url_list.append(detail_url)
# return detail_url_list


##解析详情页获取视频url
def parse_detail(res):
response = res.result()

movie_url = re.findall('srcUrl ="(.*?)" ', response.text, re.S)[0]
pool.submit(get_page, movie_url).add_done_callback(save_movie)
# return movie_url


# 3、保存数据

def save_movie(res):
movie_res = res.result()

# # 把视频写到本地


with open(f'{uuid.uuid4()}.mp4', 'wb') as f:
f.write(movie_res.content)
f.flush()

# 测试:调用函数并实现爬取

if __name__ == '__main__': # mian+回车键

# 往get_page发送异步请求,把结果交给parse_index
url = 'https://www.pearvideo.com/'
pool.submit(get_page, url).add_done_callback(parse_index) # 异步提交

 

 

 执行代码如下:

import requests
import re  # 正则模块
import uuid  # uuid.uuid(4) 可以根据时间戳生成一段世界上唯一的随机字符串

# 导入线程池模块

from concurrent.futures import ThreadPoolExecutor

# 线程(os的资源,一个进程可以开多个线程),但是无法限制好线程数;
# 线程池:帮助控制好线程数

pool = ThreadPoolExecutor(50)


# 爬虫三部曲

# 1、发送请求

def get_page(url):
    print("开始异步任务:{url}")
    response = requests.get(url)
    return response


# 2、解析数据
# 解析主页获取视频详情页ID
def parse_index(res):
    response = res.result()
    res1= re.findall('<a href="video_(.*?)"', response.text, re.S)
    print(res1)
    # detail_url_list = []
    for m_id in res1:
        # 拼接详情页url
        detail_url = 'https://www.pearvideo.com/video_' + m_id
       # print(detail_url)
        # 把详情页url提交给get_page
        pool.submit(get_page, detail_url).add_done_callback(parse_detail)
    # detail_url_list.append(detail_url)
    # return detail_url_list
#
#
##解析详情页获取视频url
def parse_detail(res):
    response = res.result()
    print(response.text)
    movie_url = re.findall('srcUrl="(.*?)" ', response.text, re.S)[0]
    print(movie_url)
    pool.submit(get_page, movie_url).add_done_callback(save_movie)
    # return movie_url


# 3、保存数据

def save_movie(res):
    movie_res=res.result()

    # # 把视频写到本地


    with open(f'{uuid.uuid4()}.mp4', 'wb') as f:
        f.write(movie_res.content)
        f.flush()

# 测试:调用函数并实现爬取

if __name__ == '__main__':  # mian+回车键

    # 往get_page发送异步请求,把结果交给parse_index
    url = 'https://www.pearvideo.com/'
    pool.submit(get_page, url).add_done_callback(parse_index)  # 异步提交
   # print(pool.submit(get_page, url))

  

 

 

 

 

 

 

 

 

 

 

数据传递过程,如下几图:

 

 

 

 

 

转载于:https://www.cnblogs.com/evan0925/p/11022149.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值