非同期爬虫類

asyncioは、Pythonは、一般に、非同期処理モジュールで使用され、同時IO動作を実現することができるねじ。このasyncioモジュールについて、著者は、今後の記事で紹介され、我々は--aiohttp asyncio HTTPベースの実装フレームワークを教えてくれる、それが私たちのプログラムの効率が大幅に改善されるように、非同期のHTTPリクエストを達成するために私たちを助けることができます。

この記事では爬虫類で簡単なアプリケーションのaiohttpをご紹介します。

私たちのプロジェクトはから来ている:Scrapyの爬虫類(5)元のプロジェクトに详细書籍ベストセラーリストをクロール、私たちは情報の详细の書籍ベストセラーリストをクロールするためのフレームワークscrapy Pythonの爬虫類を使用しています。この記事では、著者は、2つの方法の爬虫類、爬虫類と比較的同期非同期爬虫類(使用aiohttpが達成)効率で製造される、爬虫類の点でaiohttp利点を実証しました。

まずは、一般的な方法、すなわち、同期方法、次のように完全なPythonのコードがあると実装爬虫類を見てみましょう:

'''
同步方式爬取当当畅销书的图书信息
'''

import time
import requests
import pandas as pd
from bs4 import BeautifulSoup

# table表格用于储存书本信息
table = []

# 处理网页
def download(url):
    html = requests.get(url).text

    # 利用BeautifulSoup将获取到的文本解析成HTML
    soup = BeautifulSoup(html, "lxml")
    # 获取网页中的畅销书信息
    book_list = soup.find('ul', class_="bang_list clearfix bang_list_mode")('li')

    for book in book_list:
        info = book.find_all('div')

        # 获取每本畅销书的排名,名称,评论数,作者,出版社
        rank = info[0].text[0:-1]
        name = info[2].text
        comments = info[3].text.split('条')[0]
        author = info[4].text
        date_and_publisher = info[5].text.split()
        publisher = date_and_publisher[1] if len(date_and_publisher) >= 2 else ''

        # 将每本畅销书的上述信息加入到table中
        table.append([rank, name, comments, author, publisher])


# 全部网页
urls = ['http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-recent7-0-0-1-%d' % i for i in range(1, 26)]

# 统计该爬虫的消耗时间
print('#' * 50)
t1 = time.time()  # 开始时间

for url in urls:
    download(url)

# 将table转化为pandas中的DataFrame并保存为CSV格式的文件
df = pd.DataFrame(table, columns=['rank', 'name', 'comments', 'author', 'publisher'])
df.to_csv('E://douban/dangdang.csv', index=False)

t2 = time.time()  # 结束时间
print('使用一般方法,总共耗时:%s' % (t2 - t1))
print('#' * 50)

出力:

##################################################
使用一般方法,总共耗时:23.522345542907715
##################################################

次はaiohttp作ら非同期爬虫類、完全なソースコードの効率を見て、次のとおりです。

'''
异步方式爬取当当畅销书的图书信息
'''

import time
import aiohttp
import asyncio
import pandas as pd
from bs4 import BeautifulSoup

# table表格用于储存书本信息
table = []

# 获取网页(文本信息)
async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text(encoding='gb18030')

# 解析网页
async def parser(html):
    
    # 利用BeautifulSoup将获取到的文本解析成HTML
    soup = BeautifulSoup(html, "lxml")
    # 获取网页中的畅销书信息
    book_list = soup.find('ul', class_="bang_list clearfix bang_list_mode")('li')

    for book in book_list:
        
        info = book.find_all('div')

        # 获取每本畅销书的排名,名称,评论数,作者,出版社
        rank = info[0].text[0:-1]
        name = info[2].text
        comments = info[3].text.split('条')[0]
        author = info[4].text
        date_and_publisher = info[5].text.split()
        publisher = date_and_publisher[1] if len(date_and_publisher) >=2 else ''

        # 将每本畅销书的上述信息加入到table中
        table.append([rank,name,comments,author,publisher])
        
# 处理网页    
async def download(url):
    async with aiohttp.ClientSession() as session:
        html = await fetch(session, url)
        await parser(html)

# 全部网页
urls = ['http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-recent7-0-0-1-%d'%i for i in range(1,26)]

# 统计该爬虫的消耗时间
print('#' * 50)
t1 = time.time() # 开始时间

# 利用asyncio模块进行异步IO处理
loop = asyncio.get_event_loop()
tasks = [asyncio.ensure_future(download(url)) for url in urls]
tasks = asyncio.gather(*tasks)
loop.run_until_complete(tasks)

# 将table转化为pandas中的DataFrame并保存为CSV格式的文件
df = pd.DataFrame(table, columns=['rank','name','comments','author','publisher'])
df.to_csv('E://douban/dangdang.csv',index=False)
    
t2 = time.time() # 结束时间
print('使用aiohttp,总共耗时:%s' % (t2 - t1))
print('#' * 50)

このアプローチとは基本的考えクローラとクローラ前の一般的な方法HTTPリクエストとコルーチン関数(コルーチン)にページを解析するときに使用aiohttp同じだけ処理モジュールは、aysncio再利用することを我々が見ることができます同時処理は、これは間違いなく爬虫類の効率を改善することはできないであろう。次のようにその業績は以下のとおりです。

##################################################
使用aiohttp,总共耗时:2.405137538909912
##################################################

要約すると、それは見ることができ、同期および非同期メソッド効率クローラの方法作る使用が広く変化するので、我々は、クローラの実際の製造において、非同期爬虫類、例えばaysncio、aiohttpとして非同期モジュールの大きい使用を考慮することを望むかもしれません。また、aiohttpしか以降のバージョン3.5.3のPythonをサポートしています。

もちろん、これはのみ非同期爬虫類の例としては、具体的に非同期の後ろに話をしていなかった、と非同期のアイデアは広く私たちの現実の生活と生産、および他のサイトで使用されてきた、私は非同期プログラミングの自分の理解が紹介され、懸念へようこそ。

この記事では、マイクロチャネル公衆番号に、歓迎の注意を終了:Pythonの爬虫類を習得しやすい(マイクロ信号:easy_web_scrape)。〜ACへようこそ

https://www.cnblogs.com/jclian91/p/9641856.htmlから

おすすめ

転載: www.cnblogs.com/hankleo/p/11139876.html