范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

知乎热门如何提高爬虫速度?

  作者:闲欢
  来源:Python 技术
  今天在浏览知乎时,发现一个有趣的问题:
  如何优化 Python 爬虫的速度?
  他的问题描述是:
  目前在写一个 Python 爬虫,单线程 urllib 感觉过于慢了,达不到数据量的要求(十万级页面)。求问有哪些可以提高爬取效率的方法?
  这个问题还蛮多人关注的,但是回答的人却不多。
  我今天就来尝试着回答一下这个问题。
  程序提速这个问题其实解决方案就摆在那里,要么通过并发来提高单位时间内处理的工作量,要么从程序本身去找提效点,比如爬取的数据用gzip传输、提高处理数据的速度等。
  我会分别从几种常见的并发方法去做同一件事情,从而比较处理效率。  简单版本爬虫
  我们先来一个简单的爬虫,看看单线程处理会花费多少时间?  import time import requests from datetime import datetime   def fetch(url):     r = requests.get(url)     print(r.text)  start = datetime.now()  t1 = time.time() for i in range(100):     fetch("http://httpbin.org/get")  print("requests版爬虫耗时:", time.time() - t1)  # requests版爬虫耗时:54.86306357383728
  我们用一个爬虫的测试网站,测试爬取100次,用时是54.86秒。  多线程版本爬虫
  下面我们将上面的程序改为多线程版本:  import threading import time import requests   def fetch():     r = requests.get("http://httpbin.org/get")     print(r.text)  t1 = time.time()  t_list = [] for i in range(100):     t = threading.Thread(target=fetch, args=())     t_list.append(t)     t.start()  for t in t_list:     t.join()  print("多线程版爬虫耗时:", time.time() - t1)  # 多线程版爬虫耗时:0.8038511276245117
  我们可以看到,用上多线程之后,速度提高了68倍。其实用这种方式的话,由于我们并发操作,所以跑100次跟跑一次的时间基本是一致的。这只是一个简单的例子,实际情况中我们不可能无限制地增加线程数。  多进程版本爬虫
  除了多线程之外,我们还可以使用多进程来提高爬虫速度:  import requests import time import multiprocessing from multiprocessing import Pool  MAX_WORKER_NUM = multiprocessing.cpu_count()  def fetch():     r = requests.get("http://httpbin.org/get")     print(r.text)  if __name__ == "__main__":     t1 = time.time()     p = Pool(MAX_WORKER_NUM)     for i in range(100):         p.apply_async(fetch, args=())     p.close()     p.join()      print("多进程爬虫耗时:", time.time() - t1)  多进程爬虫耗时: 7.9846765995025635
  我们可以看到多进程处理的时间是多线程的10倍,比单线程版本快7倍。  协程版本爬虫
  我们将程序改为使用 aiohttp 来实现,看看效率如何:  import aiohttp import asyncio import time   async def fetch(client):     async with client.get("http://httpbin.org/get") as resp:         assert resp.status == 200         return await resp.text()   async def main():     async with aiohttp.ClientSession() as client:         html = await fetch(client)         print(html)  loop = asyncio.get_event_loop()  tasks = [] for i in range(100):     task = loop.create_task(main())     tasks.append(task)  t1 = time.time()  loop.run_until_complete(main())  print("aiohttp版爬虫耗时:", time.time() - t1)  aiohttp版爬虫耗时: 0.6133313179016113
  我们可以看到使用这种方式实现,比单线程版本快90倍,比多线程还快。  结论
  通过上面的程序对比,我们可以看到,对于多任务爬虫来说,多线程、多进程、协程这几种方式处理效率的排序为:aiohttp > 多线程 > 多进程。因此,对于简单的爬虫任务,如果想要提高效率,可以考虑使用协程。但是同时也要注意,这里只是简单的示例,实际运用中,我们一般会用线程池、进程池、协程池去操作。
  这就是问题的答案了吗?
  对于一个严谨的程序员来说,当然不是,实际上还有一些优化的库,例如grequests,可以从请求上解决并发问题。实际的处理过程中,肯定还有其他的优化点,这里只是从最常见的几种并发方式去比较而已,应付简单爬虫还是可以的,其他的方式欢迎大家在评论区留言探讨。

援驰河南,小米打脸华为遭质疑,网友拿华为跟小米比不掉价吗由于河南发生了重大水灾,许多企业纷纷伸出援手,进行捐助。各家数码企业也不甘落后,小米反应迅速,在灾区开始的晚上就已经声明捐助5000万元OPPOVIVO紧跟其后华为也发表声明,为河真啪啪打脸,河南慈善机构晒出华为捐了三千万7月25日下午三点,河南慈善网晒出华为支援河南省抗洪救灾捐赠三千万的消息,震惊了不少网友,原来华为不是没有捐,任正非是真的低调!郑州暴雨后,华为一直没有大动静,键盘侠见机行事,一直这些事很容易影响夫妻感情,双方都要避免点个关注吧没有人十全十美的,每个人都或多或少的会有一些小毛病,而有的毛病是可以让人接受的,而有的毛病却让人无法忍受,再好的感情也需要夫妻双方配合来维护,而不是无限制的挑战对方的低线心理学会表达,人到了中年也要了解该怎么让对方更加爱你点关注不迷路所有人都有爱与被爱的权利,每个人爱对方的方式都是不一样的,所有人都渴望被人爱着,所有人都在以自己的方式爱着别人,每个人所表达出来的方式也不尽相同。有的人重视行动,有些人GMIC大会荣耀赵明再次点出电视广告,呼吁行业变革众所周知,我们忙完回家后打开智能电视,一定得先看几秒开机广告,而这个情况已经让越来越多消费者心生不满。荣耀作为智能电视行业的改革者,从推出第一台荣耀智慧屏产品时,就没有广告加持,到大麻公司CrescoLabs视觉形象升级CrescoLabs成立于2013年,是美国最大的大麻经营者之一,公司总部位于芝加哥,他们控制着自己的种植制造提取和包装,涉及种子到销售过程的每一个环节。该公司已经创建了八个品牌的讲谈社Kodansha视觉形象升级讲谈社(Kodansha)全称株式会社讲谈社,前身为大日本雄辩会讲谈社,1909年由野间清治在日本东京创立,为音羽集团成员,现为日本最大的综合性出版社及版权持有者,也是日本主要的漫米斯特拉尔文化中心GAM视觉形象升级米斯特拉尔文化中心(GabrielaMistralCulturalCenter,简称GAM)创办于2010年,是智利圣地亚哥的文化和表演艺术中心,以智利女诗人卢西拉戈多伊阿尔卡亚加门户网站UniversoOnline视觉形象升级UniversoOnline(缩写为UOL)始于1996年,是巴西的一家网络内容,产品和服务公司,也是全球最大的葡萄牙语门户网站。该门户网站提供网站托管数据存储公开交易在线支付和安音频娱乐公司Realm视觉形象升级新更名的Realm成立于2015年,原来的名字为SerialBox,是一家制作原创小说播客和有声读物系列的音频娱乐公司。最近,随着名字的改变,商业模式也发生了转变,以前听众们可以按纽约豪华酒店ParkLane视觉形象升级ParkLane于1971年开业,是纽约的一家豪华酒店,位于中央公园南标志性的东南端第59街第5大道和第6大道之间。该酒店建筑由EmeryRothSons设计,高47层,拥有611
Flask框架Day5abort()函数的使用使用abort()可以退出请求,重定向到一个错误的页面并返回错误代码(如404)。还可以使用errorhandler()装饰器可以定制出错页面,当出现参数中太!科!幻!了一群闪着蓝光的微型空中机器人悬停半空,继而灵巧自如地穿梭在一片茂密竹林中5月5日,一项在未知复杂环境中实现机器人成群快速避障飞行的成果以封面文章形式发表在机器人领域权威期刊科学机器中兴发布Axon40Ultra,继续押注屏下摄像技术新京报贝壳财经讯(记者许诺)5月9日,中兴手机正式发布中兴Axon40Ultra新机。作为首家实现量产屏下摄像技术的厂商,中兴在Axon40Ultra上采用了新一代柔性屏下摄像技术埃隆马斯克火星王子复仇记图片来源视觉中国文威廉01前言前不久440亿美元豪购推特,一夜之间,让埃隆马斯克的名字出现在了各大新闻的头版头条上。要问到本世纪谁是最伟大的科技创业者,埃隆马斯克,想必是很多人心中花钱修改IP属地,心怀坦荡何惧见光?郭元鹏海外博主的IP归属地却在国内,各省吃喝玩乐博主的IP归属地都在湖南随着IP归属地功能的上新,在各网红大V惨遭翻车的同时,IP代改业务也随之出现,记者发现甚至最低花费13元就可618天玑8100新机到底咋选?红米K50GTNeo3一加Ace618天玑8100新机到底咋选?红米K50GTNeo3一加Ace推荐一,RedmiK50这是该价位段唯一一款配备三星2KE4柔性直屏的天玑8100手机,在同价位极具竞争力。据悉,R消息称苹果iPhone将加入副屏做成多屏机型,最快明后年面世IT之家5月9日消息,据經濟日報,业界人士称,苹果携手电子纸(ePaper)龙头企业元太开发新款iPhone,似乎是在iPhone背面加入了两块以电子纸打造的副屏,搭配原本的正面主300块,残幅变全幅如果有同学注意到图一的参数,一定会觉得很奇怪ARW是索尼的RAW格式,为什么会使用EFS的镜头35mm镜头应该没有F1。0光圈的吧既然是35mm的镜头,那为什么焦段又是24。5mmColorOS13要来了?OPPO开启新一轮共创计划,可与工程师直接交流对于手机系统,大家一定不陌生。如果让广大手机用户评选当前最好的手机系统的话,OPPO手机的ColorOS一定能名列其中。其当前的版本ColorOS12就以简约高效流畅丝滑的表现获得系统丨Android13来了?谷歌开发者大会即将到来去年5月的GoogleIO2021开发者大会中,经过了几次爆料的Android12正式亮相。随后的10月,谷歌宣布将源代码推送到Android开源项目(AOSP),并正式发布最新版Pixel6a在GoogleIO2022开始前几分钟泄露拥有与Pixel6类似的设计距离Google2022年IO大会主题演讲正式开始只剩下几分钟的时候,我们看到了Pixel6a的真实渲染图,这款设备将作为Pixel5a的继任者面向中端主流市场。这款机型与Pixe