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 OpenCV中的resize()函数的使用

    Python OpenCV中的resize()函数的使用

    这篇文章主要介绍了Python OpenCV中的resize()函数的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • python中的pyc文件是什么

    python中的pyc文件是什么

    这篇文章主要介绍了python中的pyc文件是什么,pyc文件是Python编译过的字节码文件,这个字节码是一种低级的、与平台无关的代码,还不知道的朋友来了解一下吧
    2023-04-04
  • tensorflow 实现打印pb模型的所有节点

    tensorflow 实现打印pb模型的所有节点

    今天小编就为大家分享一篇tensorflow 实现打印pb模型的所有节点,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • 解决PyCharm无法使用lxml库的问题(图解)

    解决PyCharm无法使用lxml库的问题(图解)

    这篇文章主要介绍了解决PyCharm无法使用lxml库的问题,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • 使用Python的数据可视化库Matplotlib实现折线图

    使用Python的数据可视化库Matplotlib实现折线图

    数据可视化是数据分析和探索中不可或缺的一环,本文将介绍如何使用Python中的数据可视化库Matplotlib,通过示例代码实现一个简单的折线图,感兴趣的同学可以参考阅读下
    2023-07-07
  • python能做哪些生活有趣的事情

    python能做哪些生活有趣的事情

    在本篇文章里小编给各位分享了关于python能做的生活有趣的事情,有兴趣的朋友们可以学习下。
    2020-09-09
  • Pandas数据分析之pandas文本处理

    Pandas数据分析之pandas文本处理

    这篇文章主要介绍了Pandas数据分析之pandas文本处理,pandas对文本数据也有很多便捷处理方法,可以不用写循环,向量化操作运算速度快,还可以进行高级的正则表达式,各种复杂的逻辑筛选和匹配提取信息
    2022-08-08
  • 利用Anaconda简单安装scrapy框架的方法

    利用Anaconda简单安装scrapy框架的方法

    今天小编就为大家分享一篇利用Anaconda简单安装scrapy框架的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • python使用SimpleXMLRPCServer实现简单的rpc过程

    python使用SimpleXMLRPCServer实现简单的rpc过程

    这篇文章主要介绍了python使用SimpleXMLRPCServer实现简单的rpc过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • 全面掌握Python JSON库函数与方法学会JSON数据处理

    全面掌握Python JSON库函数与方法学会JSON数据处理

    Python提供了内置的JSON库,允许在Python中解析和序列化JSON数据,本文将深入研究Python中JSON库的各种函数和方法,为你提供丰富的示例代码来帮助掌握JSON处理的方方面面
    2024-01-01

最新评论