python中的异步爬虫详解

 更新时间:2023年08月09日 10:53:12   作者:南岸青栀*  
这篇文章主要介绍了python中的异步爬虫详解,所谓的异步异步 IO,就是发起一个 IO 阻塞的操作,但是不用等到它结束,可以在它执行 IO 的过程中继续做别的事情,当 IO 执行完毕之后会收到它的通知,需要的朋友可以参考下

python异步爬虫

基本概念

目的:在爬虫中使用异步实现高性能的数据爬取操作。

异步爬虫的方式:

  • 多线程,多进程(不建议) :
    • 好处:可以为相关阻塞的操作单独开启线程或者进程,阻塞操作就可以异步执行。
    • 弊端:无法无限制的开启多线程或者多进程。
  • 线程池、 进程池(适当) :
    • 好处:我们可以降低系统对进程或者线程创建和销毁的一个频率,从而很好的降低系统的开销。
    • 弊端:池中线程或进程的数量是有上限。

线程池的基本使用

# import time
# #单线程串行方式执行
# start_time = time.time()
# def get_page(str):
#     print('正在下载:',str)
#     time.sleep(2)
#     print('下载完成:',str)
#
# name_list = ['haha','lala','duoduo','anan']
#
# for i in range(len(name_list)):
#     get_page(name_list[i])
#
# end_time = time.time()
# print(end_time-start_time)
import time
from multiprocessing.dummy import Pool
#单线程串行方式执行
start_time = time.time()
def get_page(str):
    print('正在下载:',str)
    time.sleep(2)
    print('下载完成:',str)
name_list = ['haha','lala','duoduo','anan']
pool = Pool(4)
pool.map(get_page,name_list)
end_time = time.time()
print(end_time-start_time)

效果图

单线程串行方式

在这里插入图片描述

线程池

在这里插入图片描述

爬取网址:https://www.pearvideo.com/category_6

代码

import requests,re,random
from lxml import etree
from multiprocessing.dummy import Pool
urls = [] #视频地址和视频名称的字典
#获取视频假地址函数
def get_videoadd(detail_url,video_id):
    ajks_url = 'https://www.pearvideo.com/videoStatus.jsp'
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36',
                      'Referer':detail_url
    }
    params = {
        'contId': video_id,
        'mrd': str(random.random())
    }
    video_json = requests.post(headers=header,url=ajks_url,params=params).json()
    return video_json['videoInfo']['videos']['srcUrl']
#获取视频数据和持久化存储
def get_videoData(dic):
    right_url = dic['url']
    print(dic['name'],'start!')
    video_data = requests.get(url=right_url,headers=headers).content
    with open(dic['name'],'wb') as fp:
        fp.write(video_data)
    print(dic['name'],'over!')
if __name__ == '__main__':
    url = 'https://www.梨video.com/category_6'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'
    }
    page_text = requests.get(url=url,headers=headers).text
    tree = etree.HTML(page_text)
    li_list = tree.xpath('//*[@id="listvideoListUl"]/li')
    for li in li_list:
        detail_url = 'https://www.pearvideo.com/'+li.xpath('./div/a/@href')[0]
        name = li.xpath('./div/a/div[2]/text()')[0]+'.mp4'
        #解析视频ID
        video_id = detail_url.split('/')[-1].split('_')[-1]
        false_url = get_videoadd(detail_url,video_id)
        temp = false_url.split('/')[-1].split('-')[0]
        #拼接出正确的url
        right_url = false_url.replace(temp,'cont-'+str(video_id))
        dic = {
            'name':name,
            'url':right_url
        }
        urls.append(dic)
    #使用线程池
    pool = Pool(4)
    pool.map(get_videoData,urls)
    #子线程结束后关闭
    pool.close()
    #主线程关闭
    pool.join()

效果图

在这里插入图片描述

思路

1.详情页发现ajks请求

在这里插入图片描述

2.但是,这是假地址 例: 假地址:

https://video.pearvideo.com/mp4/adshort/20210323/1616511268090-15637590_adpkg-ad_hd.mp4

3.真地址

https://video.pearvideo.com/mp4/adshort/20210323/cont-1724179-15637590_adpkg-ad_hd.mp4

对比之后发现

在这里插入图片描述

圈中的数字中换为cont-video_id就为真地址

到此这篇关于python中的异步爬虫详解的文章就介绍到这了,更多相关python异步爬虫内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python如何调用spire.doc轻松读取Word文档内容

    Python如何调用spire.doc轻松读取Word文档内容

    Spire.Doc for .NET 是一款专门对 Word 文档进行操作的 .NET 类库,本文为大家介绍了Python如何调用spire.doc实现轻松读取Word文档内容,需要的可以了解下
    2025-02-02
  • python xlsxwriter模块的使用

    python xlsxwriter模块的使用

    这篇文章主要介绍了python xlsxwriter模块的使用,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2020-12-12
  • Python正则表达式教程之三:贪婪/非贪婪特性

    Python正则表达式教程之三:贪婪/非贪婪特性

    这篇文章主要介绍了Python正则表达式中贪婪/非贪婪特性的相关资料,文中通过示例代码介绍的很详细,对大家具有一定的参考价值,需要的朋友下面来一起看看吧。
    2017-03-03
  • python下grpc与protobuf的编写使用示例

    python下grpc与protobuf的编写使用示例

    这篇文章主要为大家介绍了python下grpc与protobuf的编写使用,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • python批量爬取图片的方法详解

    python批量爬取图片的方法详解

    这篇文章给大家介绍了如何使用python批量爬取图片,文中通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2023-12-12
  • Python代码执行时间测量模块timeit用法解析

    Python代码执行时间测量模块timeit用法解析

    这篇文章主要介绍了Python代码执行时间测量模块timeit用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Python进行项目打包的完整流程

    Python进行项目打包的完整流程

    在 Python 开发日常工作中,直接传输源码文件共享项目,这种方式不仅杂乱无章,还难以管理版本、依赖和更新,借助 Python 官方内置的setuptools工具,就能快速将普通脚本、项目模块打包成标准可安装包,本文通过代码示例给大家详细介绍了Python项目打包的完整流程
    2026-05-05
  • python如何通过pyarmor库保护源代码

    python如何通过pyarmor库保护源代码

    pyarmor是一款用于加密和保护python脚本的工具,可以用于防止源代码泄露,下面我们就来学习一下Python如何利用pyarmor库来保护源代码吧
    2024-11-11
  • Pytorch中膨胀卷积的用法详解

    Pytorch中膨胀卷积的用法详解

    今天小编就为大家分享一篇Pytorch中膨胀卷积的用法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • Python fileinput模块使用介绍

    Python fileinput模块使用介绍

    这篇文章主要介绍了Python fileinput模块使用方法,需要的朋友可以参考下
    2014-11-11

最新评论