文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python爬虫之线程池的使用方法

2023-06-15 00:38

关注

这篇文章主要介绍了Python爬虫之线程池的使用方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

一、前言

学到现在,我们可以说已经学习了爬虫的基础知识,如果没有那些奇奇怪怪的反爬虫机制,基本上只要有时间分析,一般的数据都是可以爬取的,那么到了这个时候我们需要考虑的就是爬取的效率了,关于提高爬虫效率,也就是实现异步爬虫,我们可以考虑以下两种方式:一是线程池的使用(也就是实现单进程下的多线程),一是协程的使用(如果没有记错,我所使用的协程模块是从python3.4以后引入的,我写博客时使用的python版本是3.9)。

今天我们先来讲讲线程池。

二、同步代码演示

我们先用普通的同步的形式写一段代码

import timedef func(url):    print("正在下载:", url)    time.sleep(2)    print("下载完成:", url)if __name__ == '__main__':    start = time.time() # 开始时间    url_list = [        "a", "b", "c"    ]    for url in url_list:        func(url)    end = time.time() # 结束时间    print(end - start)

对于代码运行的结果我们心里都有数,但还是让我们来看一下吧

Python爬虫之线程池的使用方法

不出所料。运行时间果然是六秒

三、异步,线程池代码

那么如果我们使用线程池运行上述代码又会怎样呢?

import timefrom multiprocessing import Pooldef func(url):    print("正在下载:", url)    time.sleep(2)    print("下载完成:", url)if __name__ == '__main__':    start = time.time() # 开始时间    url_list = [        "a", "b", "c"    ]    pool = Pool(len(url_list)) # 实例化一个线程池对象,并且设定线程池的上限数量为列表长度。不设置上限也可以。    pool.map(func, url_list)    end = time.time() # 结束时间    print(end - start)

下面就是见证奇迹的时候了,让我们运行程序

Python爬虫之线程池的使用方法

我们发现这次我们的运行时间只用2~3秒。其实我们可以将线程池简单的理解为将多个任务同时进行。

注意:

我使用的是 pycharm,如果使用的是 VS 或者说是 python 自带的 idle,在运行时我们只能看到最后时间的输出。

我们输出结果可能并不是按 abc 的顺序输出的。

四、同步爬虫爬取图片

因为我们的重点是线程池的爬取效率提高,我们就简单的爬取一页的图片。

import requestsimport timeimport osfrom lxml import etreedef save_photo(url, title):    # UA伪装    header = {        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"    }    # 发送请求    photo = requests.get(url=url, headers=header).content    # 创建路径,避免重复下载    if not os.path.exists("C:\\Users\\ASUS\\Desktop\\CSDN\\高性能异步爬虫\\线程池\\同步爬虫爬取4K美女图片\\" + title + ".jpg"):        with open("C:\\Users\\ASUS\\Desktop\\CSDN\\高性能异步爬虫\\线程池\\同步爬虫爬取4K美女图片\\" + title + ".jpg", "wb") as fp:            print(title, "开始下载!!!")            fp.write(photo)            print(title, "下载完成!!!")if __name__ == '__main__':    start = time.time()    # 创建文件夹    if not os.path.exists("C:\\Users\\ASUS\\Desktop\\CSDN\\高性能异步爬虫\\线程池\\同步爬虫爬取4K美女图片"):        os.mkdir("C:\\Users\\ASUS\\Desktop\\CSDN\\高性能异步爬虫\\线程池\\同步爬虫爬取4K美女图片")    # UA伪装    header = {        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"    }    # 指定url    url = "https://pic.netbian.com/4kmeinv/"    # 发送请求,获取源码    page = requests.get(url = url, headers = header).text    # xpath 解析,获取图片的下载地址的列表    tree = etree.HTML(page)    url_list = tree.xpath('//*[@id="main"]/div[3]/ul/li/a/@href')    # 通过下载地址获取高清图片的地址和图片名称    for href in url_list:        new_url = "https://pic.netbian.com" + href        # 再一次发送请求        page = requests.get(url = new_url, headers = header).text        # 再一次 xpath 解析        new_tree = etree.HTML(page)        src = "https://pic.netbian.com" + new_tree.xpath('//*[@id="img"]/img/@src')[0]        title = new_tree.xpath('//*[@id="img"]/img/@title')[0].split(" ")[0]        # 编译文字        title = title.encode("iso-8859-1").decode("gbk")        # 下载,保存        save_photo(src, title)    end = time.time()    print(end - start)

让我们看看同步爬虫需要多长时间

Python爬虫之线程池的使用方法

然后再让我们看看使用线程池的异步爬虫爬取这些图片需要多久

五、使用线程池的异步爬虫爬取4K美女图片

import requestsimport timeimport osfrom lxml import etreefrom multiprocessing import Pooldef save_photo(src_title):    # UA伪装    header = {        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"    }    # 发送请求    url = src_title[0]    title = src_title[1]    photo = requests.get(url=url, headers=header).content    # 创建路径,避免重复下载    if not os.path.exists("C:\\Users\\ASUS\\Desktop\\CSDN\\高性能异步爬虫\\线程池\\异步爬虫爬取4K美女图片\\" + title + ".jpg"):        with open("C:\\Users\\ASUS\\Desktop\\CSDN\\高性能异步爬虫\\线程池\\异步爬虫爬取4K美女图片\\" + title + ".jpg", "wb") as fp:            print(title, "开始下载!!!")            fp.write(photo)            print(title, "下载完成!!!")if __name__ == '__main__':    start = time.time()    # 创建文件夹    if not os.path.exists("C:\\Users\\ASUS\\Desktop\\CSDN\\高性能异步爬虫\\线程池\\异步爬虫爬取4K美女图片"):        os.mkdir("C:\\Users\\ASUS\\Desktop\\CSDN\\高性能异步爬虫\\线程池\\异步爬虫爬取4K美女图片")    # UA伪装    header = {        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"    }    # 指定url    url = "https://pic.netbian.com/4kmeinv/"    # 发送请求,获取源码    page = requests.get(url = url, headers = header).text    # xpath 解析,获取图片的下载地址的列表    tree = etree.HTML(page)    url_list = tree.xpath('//*[@id="main"]/div[3]/ul/li/a/@href')    # 存储最后的网址和标题的列表    src_list = []    title_list = []    # 通过下载地址获取高清图片的地址和图片名称    for href in url_list:        new_url = "https://pic.netbian.com" + href        # 再一次发送请求        page = requests.get(url = new_url, headers = header).text        # 再一次 xpath 解析        new_tree = etree.HTML(page)        src = "https://pic.netbian.com" + new_tree.xpath('//*[@id="img"]/img/@src')[0]        src_list.append(src)        title = new_tree.xpath('//*[@id="img"]/img/@title')[0].split(" ")[0]        # 编译文字        title = title.encode("iso-8859-1").decode("gbk")        title_list.append(title)    # 下载,保存。使用线程池    pool = Pool()    src_title = zip(src_list, title_list)    pool.map(save_photo, list(src_title))    end = time.time()    print(end - start)

让我们来看看运行的结果

Python爬虫之线程池的使用方法

只用了 17 秒,可不要小瞧这几秒,如果数据太大,这些差距后来就会更大了。

注意

不过我们必须要明白 线程池 是有上限的,这就是说数据太大,线程池的效率也会降低,所以这就要用到协程模块了。

Python主要用来做什么

Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬虫;4、嵌入式应用开发;5、游戏开发;6、桌面应用开发。

感谢你能够认真阅读完这篇文章,希望小编分享的“Python爬虫之线程池的使用方法”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯