国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

在Python3中使用asyncio庫(kù)進(jìn)行快速數(shù)據(jù)抓取的教程

2020-02-23 00:30:52
字體:
供稿:網(wǎng)友

web數(shù)據(jù)抓取是一個(gè)經(jīng)常在python的討論中出現(xiàn)的主題。有很多方法可以用來進(jìn)行web數(shù)據(jù)抓取,然而其中好像并沒有一個(gè)最好的辦法。有一些如scrapy這樣十分成熟的框架,更多的則是像mechanize這樣的輕量級(jí)庫(kù)。DIY自己的解決方案同樣十分流行:你可以使用requests、beautifulsoup或者pyquery來實(shí)現(xiàn)。

方法如此多樣的原因在于,數(shù)據(jù)“抓取”實(shí)際上包括很多問題:你不需要使用相同的工具從成千上萬(wàn)的頁(yè)面中抓取數(shù)據(jù),同時(shí)使一些Web工作流自動(dòng)化(例如填一些表單然后取回?cái)?shù)據(jù))。我喜歡DIY的原因在于其靈活性,但是卻不適合用來做大量數(shù)據(jù)的抓取,因?yàn)樾枰?qǐng)求同步,所以大量的請(qǐng)求意味著你不得不等待很長(zhǎng)時(shí)間。

在本文中,我將會(huì)為你展示一個(gè)基于新的異步庫(kù)(aiohttp)的請(qǐng)求的代替品。我使用它寫了一些速度的確很快的小數(shù)據(jù)抓取器,下面我將會(huì)為你演示是如何做到的。

asyncio的基本概念
asyncio是在python3.4中被引進(jìn)的異步IO庫(kù)。你也可以通過python3.3的pypi來安裝它。它相當(dāng)?shù)膹?fù)雜,而且我不會(huì)介紹太多的細(xì)節(jié)。相反,我將會(huì)解釋你需要知道些什么,以利用它來寫異步的代碼。

簡(jiǎn)而言之,有兩件事情你需要知道:協(xié)同程序和事件循環(huán)。協(xié)同程序像是方法,但是它們可以在代碼中的特定點(diǎn)暫停和繼續(xù)。當(dāng)在等待一個(gè)IO(比如一個(gè)HTTP請(qǐng)求),同時(shí)執(zhí)行另一個(gè)請(qǐng)求的時(shí)候,可以用來暫停一個(gè)協(xié)同程序。我們使用關(guān)鍵字yield from來設(shè)定一個(gè)狀態(tài),表明我們需要一個(gè)協(xié)同程序的返回值。而事件循環(huán)則被用來安排協(xié)同程序的執(zhí)行。

關(guān)于asyncio還有很多很多,但是以上是我們到目前為止需要知道的。可能你還有些不清楚,那么讓我們來看一些代碼吧。

aiohttp
aiohttp是一個(gè)利用asyncio的庫(kù),它的API看起來很像請(qǐng)求的API。到目前為止,相關(guān)文檔還不健全。但是這里有一些非常有用的例子。我們將會(huì)演示它的基本用法。

首先,我們會(huì)定義一個(gè)協(xié)同程序用來獲取頁(yè)面,并打印出來。我們使用 asyncio.coroutine將一個(gè)方法裝飾成一個(gè)協(xié)同程序。aiohttp.request是一個(gè)協(xié)同程序,所以它是一個(gè)可讀方法,我們需要使用yield from來調(diào)用它們。除了這些,下面的代碼看起來相當(dāng)直觀:
 

@asyncio.coroutinedef print_page(url):  response = yield from aiohttp.request('GET', url)  body = yield from response.read_and_close(decode=True)  print(body)

如你所見,我們可以使用yield from從另一個(gè)協(xié)同程序中調(diào)用一個(gè)協(xié)同程序。為了從同步代碼中調(diào)用一個(gè)協(xié)同程序,我們需要一個(gè)事件循環(huán)。我們可以通過asyncio.get_event_loop()得到一個(gè)標(biāo)準(zhǔn)的事件循環(huán),之后使用它的run_until_complete()方法來運(yùn)行協(xié)同程序。所以,為了使之前的協(xié)同程序運(yùn)行,我們只需要做下面的步驟:

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 钟祥市| 宣城市| 文登市| 本溪| 崇文区| 遂昌县| 呼伦贝尔市| 漯河市| 固镇县| 六盘水市| 额尔古纳市| 黔南| 米易县| 丰镇市| 巴东县| 迁安市| 将乐县| 万宁市| 黔西| 武威市| 绿春县| 沈阳市| 九龙县| 乌鲁木齐县| 汽车| 沽源县| 辽阳县| 安图县| 朝阳县| 清涧县| 陕西省| 始兴县| 重庆市| 甘孜县| 来凤县| 奇台县| 阿荣旗| 肃宁县| 太保市| 景德镇市| 淮安市|