最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python如何提升爬蟲(chóng)效率

 更新時(shí)間:2020年09月27日 14:44:14   作者:straightup  
這篇文章主要介紹了python如何提升爬蟲(chóng)效率,幫助大家更好的理解和使用python 爬蟲(chóng),感興趣的朋友可以參考下

單線程+多任務(wù)異步協(xié)程

  • 協(xié)程

在函數(shù)(特殊函數(shù))定義的時(shí)候,使用async修飾,函數(shù)調(diào)用后,內(nèi)部語(yǔ)句不會(huì)立即執(zhí)行,而是會(huì)返回一個(gè)協(xié)程對(duì)象

  • 任務(wù)對(duì)象

任務(wù)對(duì)象=高級(jí)的協(xié)程對(duì)象(進(jìn)一步封裝)=特殊的函數(shù)
任務(wù)對(duì)象必須要注冊(cè)到時(shí)間循環(huán)對(duì)象中
給任務(wù)對(duì)象綁定回調(diào):爬蟲(chóng)的數(shù)據(jù)解析中

  • 事件循環(huán)

當(dāng)做是一個(gè)裝載任務(wù)對(duì)象的容器
當(dāng)啟動(dòng)事件循環(huán)對(duì)象的時(shí)候,存儲(chǔ)在內(nèi)的任務(wù)對(duì)象會(huì)異步執(zhí)行

  • 特殊函數(shù)內(nèi)部不能寫(xiě)不支持異步請(qǐng)求的模塊,如time,requests...否則雖然不報(bào)錯(cuò)但實(shí)現(xiàn)不了異步

time.sleep -- asyncio.sleep
requests -- aiohttp

import asyncio
import time

start_time = time.time()
async def get_request(url):
  await asyncio.sleep(2)
  print(url,'下載完成!')

urls = [
  'www.1.com',
  'www.2.com',
]

task_lst = [] # 任務(wù)對(duì)象列表
for url in urls:
  c = get_request(url) # 協(xié)程對(duì)象
  task = asyncio.ensure_future(c) # 任務(wù)對(duì)象
  # task.add_done_callback(...)  # 綁定回調(diào)
  task_lst.append(task)

loop = asyncio.get_event_loop() # 事件循環(huán)對(duì)象
loop.run_until_complete(asyncio.wait(task_lst)) # 注冊(cè),手動(dòng)掛起

線程池+requests模塊

# 線程池
import time
from multiprocessing.dummy import Pool

start_time = time.time()
url_list = [
  'www.1.com',
  'www.2.com',
  'www.3.com',
]
def get_request(url):
  print('正在下載...',url)
  time.sleep(2)
  print('下載完成!',url)

pool = Pool(3)
pool.map(get_request,url_list)
print('總耗時(shí):',time.time()-start_time)

兩個(gè)方法提升爬蟲(chóng)效率

起一個(gè)flask服務(wù)端

from flask import Flask
import time

app = Flask(__name__)

@app.route('/bobo')
def index_bobo():
  time.sleep(2)
  return 'hello bobo!'

@app.route('/jay')
def index_jay():
  time.sleep(2)
  return 'hello jay!'

@app.route('/tom')
def index_tom():
  time.sleep(2)
  return 'hello tom!'

if __name__ == '__main__':
  app.run(threaded=True)

aiohttp模塊+單線程多任務(wù)異步協(xié)程

import asyncio
import aiohttp
import requests
import time

start = time.time()
async def get_page(url):
  # page_text = requests.get(url=url).text
  # print(page_text)
  # return page_text
  async with aiohttp.ClientSession() as s: #生成一個(gè)session對(duì)象
    async with await s.get(url=url) as response:
      page_text = await response.text()
      print(page_text)
  return page_text

urls = [
  'http://127.0.0.1:5000/bobo',
  'http://127.0.0.1:5000/jay',
  'http://127.0.0.1:5000/tom',
]
tasks = []
for url in urls:
  c = get_page(url)
  task = asyncio.ensure_future(c)
  tasks.append(task)
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

end = time.time()
print(end-start)

# 異步執(zhí)行!
# hello tom!
# hello bobo!
# hello jay!
# 2.0311079025268555
'''
aiohttp模塊實(shí)現(xiàn)單線程+多任務(wù)異步協(xié)程
并用xpath解析數(shù)據(jù)
'''
import aiohttp
import asyncio
from lxml import etree
import time

start = time.time()
# 特殊函數(shù):請(qǐng)求的發(fā)送和數(shù)據(jù)的捕獲
# 注意async with await關(guān)鍵字
async def get_request(url):
  async with aiohttp.ClientSession() as s:
    async with await s.get(url=url) as response:
      page_text = await response.text()
      return page_text    # 返回頁(yè)面源碼

# 回調(diào)函數(shù),解析數(shù)據(jù)
def parse(task):
  page_text = task.result()
  tree = etree.HTML(page_text)
  msg = tree.xpath('/html/body/ul//text()')
  print(msg)

urls = [
  'http://127.0.0.1:5000/bobo',
  'http://127.0.0.1:5000/jay',
  'http://127.0.0.1:5000/tom',
]
tasks = []
for url in urls:
  c = get_request(url)
  task = asyncio.ensure_future(c)
  task.add_done_callback(parse) #綁定回調(diào)函數(shù)!
  tasks.append(task)
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

end = time.time()
print(end-start)

requests模塊+線程池

import time
import requests
from multiprocessing.dummy import Pool

start = time.time()
urls = [
  'http://127.0.0.1:5000/bobo',
  'http://127.0.0.1:5000/jay',
  'http://127.0.0.1:5000/tom',
]
def get_request(url):
  page_text = requests.get(url=url).text
  print(page_text)
  return page_text

pool = Pool(3)
pool.map(get_request, urls)
end = time.time()
print('總耗時(shí):', end-start)

# 實(shí)現(xiàn)異步請(qǐng)求
# hello jay!
# hello bobo!
# hello tom!
# 總耗時(shí): 2.0467123985290527

小結(jié)

  • 爬蟲(chóng)的加速目前掌握了兩種方法:

aiohttp模塊+單線程多任務(wù)異步協(xié)程
requests模塊+線程池

  • 爬蟲(chóng)接觸的模塊有三個(gè):

requests
urllib
aiohttp

  • 接觸了一下flask開(kāi)啟服務(wù)器

以上就是python如何提升爬蟲(chóng)效率的詳細(xì)內(nèi)容,更多關(guān)于python提升爬蟲(chóng)效率的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python使用技巧之實(shí)現(xiàn)Excel轉(zhuǎn)為PDF

    Python使用技巧之實(shí)現(xiàn)Excel轉(zhuǎn)為PDF

    這篇文章主要為大家詳細(xì)介紹了使用第三方Python庫(kù)Spire.XLS?for?Python?實(shí)現(xiàn)Excel轉(zhuǎn)PDF的簡(jiǎn)單方法,文中的示例代碼講解詳細(xì),需要的可以參考下
    2023-11-11
  • Python plt.boxplot函數(shù)及其參數(shù)使用小結(jié)

    Python plt.boxplot函數(shù)及其參數(shù)使用小結(jié)

    plt.boxplot函數(shù)用于繪制箱線圖,本文介紹了Python plt.boxplot函數(shù)及其參數(shù)使用小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • python lambda函數(shù)及三個(gè)常用的高階函數(shù)

    python lambda函數(shù)及三個(gè)常用的高階函數(shù)

    這篇文章主要介紹了python lambda函數(shù)及三個(gè)常用的高階函數(shù),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Python3內(nèi)置模塊pprint讓打印比print更美觀詳解

    Python3內(nèi)置模塊pprint讓打印比print更美觀詳解

    這篇文章主要給大家介紹了關(guān)于Python3內(nèi)置模塊pprint讓打印比print更美觀的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python3具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • 如何理解Python中包的引入

    如何理解Python中包的引入

    在本篇文章里小編給各位分享的是一篇關(guān)于Python中包的引入詳解內(nèi)容,需要的朋友們可以參考學(xué)習(xí)下。
    2020-05-05
  • python并發(fā)2之使用asyncio處理并發(fā)

    python并發(fā)2之使用asyncio處理并發(fā)

    本篇文章主要介紹了python并發(fā)2之使用asyncio處理并發(fā),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • 詳解python方法之綁定方法與非綁定方法

    詳解python方法之綁定方法與非綁定方法

    這篇文章主要介紹了python方法之綁定方法與非綁定方法的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-08-08
  • Python標(biāo)準(zhǔn)庫(kù)shutil用法實(shí)例詳解

    Python標(biāo)準(zhǔn)庫(kù)shutil用法實(shí)例詳解

    這篇文章主要介紹了Python標(biāo)準(zhǔn)庫(kù)shutil用法,結(jié)合實(shí)例形式分析了shutil庫(kù)針對(duì)文件與文件夾各種常見(jiàn)操作技巧與相關(guān)使用注意事項(xiàng),需要的朋友可以參考下
    2018-08-08
  • 關(guān)于python 的legend圖例,參數(shù)使用說(shuō)明

    關(guān)于python 的legend圖例,參數(shù)使用說(shuō)明

    這篇文章主要介紹了關(guān)于python 的legend圖例,參數(shù)使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04
  • python對(duì)比兩個(gè)字典dict的差異詳解

    python對(duì)比兩個(gè)字典dict的差異詳解

    這篇文章主要為大家詳細(xì)介紹了python?如何對(duì)比兩個(gè)字典dict的不同差異,文中的示例代碼簡(jiǎn)潔易懂,具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下
    2023-05-05

最新評(píng)論

汨罗市| 尉氏县| 昌都县| 石门县| 易门县| 绍兴市| 民勤县| 阿鲁科尔沁旗| 报价| 双峰县| 乐都县| 连云港市| 孟津县| 灵宝市| 如皋市| 龙山县| 亳州市| 永清县| 金塔县| 日土县| 吕梁市| 墨江| 察隅县| 新闻| 林周县| 永德县| 广宁县| 衡阳县| 大厂| 清新县| 孟州市| 慈溪市| 司法| 昌邑市| 铁岭县| 吴旗县| 江源县| 宜黄县| 邮箱| 马鞍山市| 综艺|