Python爬虫-速度(2)

本文介绍了Python爬虫速度优化的相关概念,包括并发与并行的区别,同步与异步、阻塞与非阻塞的解释,以及多进程、多线程和协程在爬虫中的应用。通过实际例子展示了不同方法对爬虫速度的影响,指出多进程和多线程可以提高程序速度,而协程在适当调整下能够处理大量任务。
摘要由CSDN通过智能技术生成

Python爬虫-速度(2)


018.9.17

Python爬虫-速度(1)
Python爬虫-速度(3)

前言

我原有个习惯,就是每写个什么东西,都会在开头记下日期。今天得空复查这篇内容的时候,发现居然赫然显示着:018.9.17

十天就这么过去了。

很难说我这10天里到底做了什么,收获了什么。因为我确实未发现自己在这时间里有如何的长进。倒是再一次加深了对时间飞速的体会。

继而说说这次的内容吧。由于进程线程协程涉及到的知识点很多,如果细讲起来,够写好几篇了。所以只好提供自己学习时用到的资料,包括书籍《Python Cook》,以及一些博客文章。为了方便你我他,是全部附上了链接的。

并发与并行

我们先来说说什么是并发,什么又是并行。

并发:指程序有处理多个任务的能力
并行:指程序有同时处理多个任务的能力

二者之间的差别,就在同时二字。可以举个例子:并发就是一群人从一个独木桥上过,而并行则是一群人从多个独木桥上过。
在这里插入图片描述
在这里插入图片描述

其实网上我看到许多人爱用“一个人吃十个馒头与十个人吃十个馒头”的例子,倒是很好的解释了并发与并行的区别,然而乍一看,似乎并发没啥用呀!所以庆幸自己想出一个过独木桥的例子【不要脸.jpg】,这样一来不但给了二者区别,还可以体现出并发的提速作用:一群人过独木桥(所有人人可以都在桥上)肯定是比这群人挨个挨个的过独木桥(桥上最多允许一个人存在)要快许多。

异步与同步/阻塞和非阻塞

可以用一个在知乎看到的段子来理解:

老张爱喝茶,废话不说,煮开水。
出场人物:老张。
道具:水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。

(1) 老张把水壶放到火上,立等水开。(同步阻塞)
【老张觉得自己有点傻】
(2) 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)
【老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的噪音。】

(3) 老张把响水壶放到火上,立等水开。(异步阻塞)
【老张觉得这样傻等意义不大。】
(4) 老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞)
【老张觉得自己聪明了。】

所谓同步异步,只是对于水壶而言。
普通水壶,同步;响水壶,异步。虽然都能干活,但响水壶可以在自己完工之后,提示老张水开了。这是普通水壶所不能及的。同步只能让调用者去轮询自己(情况2中),造成老张效率的低下。

所谓阻塞非阻塞,仅仅对于老张而言。
立等的老张,阻塞;看电视的老张,非阻塞。情况(1)和情况(3)中老张就是阻塞的,媳妇喊他都不知道。虽然(3)中响水壶是异步的,可对于立等的老张没有太大的意义。所以一般异步是配合非阻塞使用的,这样才能发挥异步的效用。

——来源网络,作者不明。

作者:愚抄
链接:https://www.zhihu.com/question/19732473/answer/23434554
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

多进程

由于主要是为爬虫程序提速,所以过多的原理暂不讲的。但需要记得的是:多进程是并行的

我们可以通过实例来观察,首先来一个单进程单线程的爬虫程序:

import requests
import time

def get_one_html(url):
    response = requests.get(url=url, headers=HEADERS)
    return response.url

if __name__  == "__main__":
    HEADERS = {
   "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) "
                             "AppleWebKit/537.36 (KHTML, like Gecko) "
                             "Chrome/65.0.3325.183 Safari/537.36 "
                             "Vivaldi/1.96.1147.64"
Python爬虫速度慢的原因可能是由于单线程的Urllib库的效率问题。为了提高爬取效率,有几种方法可以尝试。 第一种方法是使用多线程。可以使用Python的multiprocessing库来实现多线程爬虫。通过将任务分配给多个线程同时执行,可以提高爬取效率。可以使用Pool类来创建一个线程池,然后使用apply_async函数来分配任务。这样可以同时处理多个请求,从而加快爬取的速度。 第二种方法是利用多进程来提高爬虫速度。使用Python的multiprocessing库可以实现多进程爬虫。通过将任务分配给多个进程同时执行,可以提高爬取效率。可以使用Pool类来创建一个进程池,然后使用apply_async函数来分配任务。多进程爬虫可以同时处理多个请求,从而加快爬取的速度。 另外,还可以考虑使用其他的网络请求库,比如Requests库。Requests库相比Urllib库有更好的性能,可以提高爬虫速度。可以使用多线程多进程的方式来使用Requests库进行爬取,并且可以通过设置并发数来进一步提高爬取效率。 综上所述,通过使用多线程多进程以及其他高性能的网络请求库,可以有效提高Python爬虫速度。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Python技巧:如何提高爬虫速度?](https://blog.csdn.net/cainiao_python/article/details/120944518)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值