4

最大10の同時ダウンロードでプールを整理しようとしています。この関数はベースURLをダウンロードしてから、このページのすべてのURLを解析してそれぞれをダウンロードする必要がありますが、同時ダウンロードの全体的な数は10を超えてはなりません。

from lxml import etree 
import gevent
from gevent import monkey, pool
import requests

monkey.patch_all()
urls = [
    'http://www.google.com', 
    'http://www.yandex.ru', 
    'http://www.python.org', 
    'http://stackoverflow.com',
    # ... another 100 urls
    ]

LINKS_ON_PAGE=[]
POOL = pool.Pool(10)

def parse_urls(page):
    html = etree.HTML(page)
    if html:
        links = [link for link in html.xpath("//a/@href") if 'http' in link]
    # Download each url that appears in the main URL
    for link in links:
        data = requests.get(link)
        LINKS_ON_PAGE.append('%s: %s bytes: %r' % (link, len(data.content), data.status_code))

def get_base_urls(url):
    # Download the main URL
    data = requests.get(url)
    parse_urls(data.content)

すべてのWebリクエストの一般的なグローバルプール制限を維持しながら、並行して実行するように編成するにはどうすればよいですか?

4

3 に答える 3

4

gevent.pool は、接続ではなく、同時実行の greenlet を制限します。

HTTPAdapterでセッションを使用する必要があります

接続制限 = 10
アダプター = requests.adapters.HTTPAdapter(pool_connections=connection_limit,
                                        pool_maxsize=connection_limit)
セッション = requests.session()
session.mount('http://', アダプター)
session.get('何らかの URL')
# または gevent で作業を行う
from gevent.pool import Pool
# データ処理時間の場合、接続制限よりも大きくする必要があります
# ダウニングより長く、
# 変更実行処理を与える。
プールサイズ = 15
プール = プール (pool_size)
URL 内の URL の場合:
    プール.スポーン(セッション.取得、URL)
于 2013-05-08T05:06:54.740 に答える
0

正しい方法で行うには、 gevent.queueを使用する必要があります。

また、これ(イベントレットの例)は、基本的な考え方を理解するのに役立ちます。

Gevent ソリューションはイベントレットに似ています。

アクセスした URL を保存する場所があることに注意してください。循環しないようにするため、メモリ不足エラーが発生しないようにするため、いくつかの制限を導入する必要があります。

于 2013-03-10T13:33:27.253 に答える