ホームページ > バックエンド開発 > Python チュートリアル > 速度と効率を高めるための Python の高度な非同期 Web スクレイピング テクニック

速度と効率を高めるための Python の高度な非同期 Web スクレイピング テクニック

Linda Hamilton
リリース: 2025-01-03 20:01:39
オリジナル
307 人が閲覧しました

dvanced Asynchronous Web Scraping Techniques in Python for Speed and Efficiency

ベストセラー作家として、アマゾンで私の本を探索することをお勧めします。 Medium で私をフォローしてサポートを示すことを忘れないでください。ありがとう!あなたのサポートは世界を意味します!

Web スクレイピングは、デジタル時代のデータ抽出と分析に不可欠なツールとなっています。オンライン情報の量が増え続けるにつれて、効率的でスケーラブルなスクレイピング技術の必要性が最も重要になってきています。 Python は、ライブラリとフレームワークの豊富なエコシステムを備えており、非同期 Web スクレイピングのための強力なソリューションを提供します。この記事では、非同期プログラミングを活用して Web スクレイピング操作の速度と効率を向上させる 6 つの高度なテクニックについて説明します。

非同期プログラミングでは複数のタスクを同時に実行できるため、多くのソースから同時にデータを取得する必要がある Web スクレイピングに最適です。非同期技術を利用することで、Web から大量のデータを収集するのに必要な時間を大幅に短縮できます。

aiohttp から始めましょう。これは、非同期 HTTP リクエストを作成するための強力なライブラリです。 aiohttp は、複数のリクエストを同時に送信する効率的な方法を提供します。これは、大規模な Web スクレイピング操作にとって重要です。 aiohttp を使用して複数の Web ページを同時に取得する方法の例を次に示します。

import aiohttp
import asyncio

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

async def main():
    urls = ['https://example.com', 'https://example.org', 'https://example.net']
    async with aiohttp.ClientSession() as session:
        tasks = [fetch(session, url) for url in urls]
        responses = await asyncio.gather(*tasks)
        for response in responses:
            print(len(response))

asyncio.run(main())
ログイン後にコピー
ログイン後にコピー

この例では、セッションと URL をパラメータとして受け取る非同期関数フェッチを作成します。 main 関数は、リスト内包表記を使用してタスクのリストを作成し、asyncio.gather を使用してすべてのタスクを同時に実行します。このアプローチにより、複数の Web ページを並行して取得できるようになり、操作に必要な全体の時間を大幅に短縮できます。

次に、BeautifulSoup を非同期スクレイピング設定と統合する方法を見てみましょう。 BeautifulSoup は、HTML および XML ドキュメントを解析するための人気のあるライブラリです。 BeautifulSoup 自体は非同期ではありませんが、aiohttp と組み合わせて使用​​すると、非同期で取得した HTML コンテンツを解析できます。

import aiohttp
import asyncio
from bs4 import BeautifulSoup

async def fetch_and_parse(session, url):
    async with session.get(url) as response:
        html = await response.text()
        soup = BeautifulSoup(html, 'html.parser')
        return soup.title.string if soup.title else "No title found"

async def main():
    urls = ['https://example.com', 'https://example.org', 'https://example.net']
    async with aiohttp.ClientSession() as session:
        tasks = [fetch_and_parse(session, url) for url in urls]
        titles = await asyncio.gather(*tasks)
        for url, title in zip(urls, titles):
            print(f"{url}: {title}")

asyncio.run(main())
ログイン後にコピー
ログイン後にコピー

この例では、BeautifulSoup による解析を含めるようにフェッチ関数を変更しました。 fetch_and_parse 関数は各 Web ページのタイトルを返すようになり、HTML コンテンツから特定の情報を非同期で抽出する方法を示しています。

大量のスクレイピングされたデータを扱う場合、多くの場合、情報をファイルに保存する必要があります。 aiofiles は、ファイル I/O 操作のための非同期インターフェイスを提供するライブラリです。 aiofile を使用してスクレイピングしたデータを非同期的に保存する方法は次のとおりです:

import aiohttp
import asyncio

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

async def main():
    urls = ['https://example.com', 'https://example.org', 'https://example.net']
    async with aiohttp.ClientSession() as session:
        tasks = [fetch(session, url) for url in urls]
        responses = await asyncio.gather(*tasks)
        for response in responses:
            print(len(response))

asyncio.run(main())
ログイン後にコピー
ログイン後にコピー

このスクリプトは、HTML コンテンツをフェッチし、タイトルを抽出し、ファイルに保存します。すべて非同期で行われます。このアプローチは、ディスクに永続化する必要がある大規模なデータセットを扱う場合に特に役立ちます。

より複雑な Web スクレイピング タスクの場合、Scrapy フレームワークは堅牢でスケーラブルなソリューションを提供します。 Scrapy は非同期プログラミングを中心に構築されているため、大規模な Web クローリングおよびスクレイピング プロジェクトに最適です。以下は Scrapy スパイダーの簡単な例です:

import aiohttp
import asyncio
from bs4 import BeautifulSoup

async def fetch_and_parse(session, url):
    async with session.get(url) as response:
        html = await response.text()
        soup = BeautifulSoup(html, 'html.parser')
        return soup.title.string if soup.title else "No title found"

async def main():
    urls = ['https://example.com', 'https://example.org', 'https://example.net']
    async with aiohttp.ClientSession() as session:
        tasks = [fetch_and_parse(session, url) for url in urls]
        titles = await asyncio.gather(*tasks)
        for url, title in zip(urls, titles):
            print(f"{url}: {title}")

asyncio.run(main())
ログイン後にコピー
ログイン後にコピー

このスパイダーを実行するには、通常、Scrapy コマンドライン ツールを使用します。 Scrapy は Web リクエストの非同期性を内部で処理するため、解析ロジックの定義に集中できます。

Web スクレイピングを大規模に実行する場合、ターゲット サーバーに負荷がかかることを避け、robots.txt ファイルを尊重するためにレート制限を実装することが重要です。以下は、非同期スクレーパーでレート制限を実装する方法の例です:

import aiohttp
import asyncio
import aiofiles
from bs4 import BeautifulSoup

async def fetch_and_save(session, url, filename):
    async with session.get(url) as response:
        html = await response.text()
        soup = BeautifulSoup(html, 'html.parser')
        title = soup.title.string if soup.title else "No title found"
        async with aiofiles.open(filename, 'w') as f:
            await f.write(f"{url}: {title}\n")
        return title

async def main():
    urls = ['https://example.com', 'https://example.org', 'https://example.net']
    async with aiohttp.ClientSession() as session:
        tasks = [fetch_and_save(session, url, f"title_{i}.txt") for i, url in enumerate(urls)]
        titles = await asyncio.gather(*tasks)
        for url, title in zip(urls, titles):
            print(f"Saved: {url} - {title}")

asyncio.run(main())
ログイン後にコピー

この例では、aiolimiter ライブラリを使用して、1 秒あたり 1 つのリクエストを許可するレート リミッターを作成します。これにより、スクレイパーがリクエストを送信する速度が速すぎて、ターゲット Web サイトによってブロックされる可能性がなくなることが保証されます。

エラー処理は、堅牢な Web スクレイピングのもう 1 つの重要な側面です。複数の非同期リクエストを処理する場合は、例外を適切に処理して、1 つの失敗したリクエストによってスクレイピング プロセス全体が停止するのを防ぐことが重要です。以下は、エラー処理と再試行を実装する方法の例です:

import scrapy

class TitleSpider(scrapy.Spider):
    name = 'title_spider'
    start_urls = ['https://example.com', 'https://example.org', 'https://example.net']

    def parse(self, response):
        yield {
            'url': response.url,
            'title': response.css('title::text').get()
        }
ログイン後にコピー

このスクリプトは、一時的なネットワークの問題やサーバー エラーの処理に役立つ指数バックオフを使用した再試行メカニズムを実装しています。また、遅い応答でハングアップすることを防ぐために、各リクエストにタイムアウトを設定します。

非常に大規模なスクレイピング操作の場合、ワークロードを複数のマシンに分散する必要がある場合があります。分散スクレイピングの詳細についてはこの記事の範囲を超えていますが、Celery と Redis または RabbitMQ などのツールを使用して、ワーカー マシンのクラスター全体にスクレイピング タスクを分散できます。

Python での非同期 Web スクレイピング技術の探究を終えるにあたり、倫理的なスクレイピング実践の重要性を強調することが重要です。スクレイピングしている Web サイトの robots.txt ファイルを常に確認して尊重し、大規模なスクレイピング操作を実行する場合は、Web サイト所有者に連絡して許可を求めることを検討してください。

非同期 Web スクレイピングは、特に多数の Web ページまたは API を処理する場合に、従来の同期方法に比べてパフォーマンスが大幅に向上します。同時リクエストに aiohttp を使用する、解析に BeautifulSoup を統合する、ノンブロッキング ファイル操作に aiofile を利用する、複雑なスクレイピング タスクに Scrapy を採用する、レート制限を実装する、エラーを堅牢に処理するなど、これまでに説明したテクニックを活用することで、強力で強力なシステムを構築できます。効率的な Web スクレイピング ソリューション。

Web が成長し進化し続けるにつれて、Web スクレイピングに利用できる技術やツールも進化します。最新のライブラリとベスト プラクティスを常に最新の状態に保つことで、Web スクレイピング プロジェクトの効率性、スケーラビリティを維持し、操作する Web サイトを尊重することができます。


101冊

101 Books は、著者 Aarav Joshi が共同設立した AI 主導の出版社です。高度な AI テクノロジーを活用することで、出版コストを信じられないほど低く抑えており、書籍によっては $4 という低価格で販売されており、誰もが質の高い知識にアクセスできるようになっています。

Amazon で入手できる私たちの書籍 Golang Clean Code をチェックしてください。

最新情報とエキサイティングなニュースにご期待ください。本を購入する際は、Aarav Joshi を検索して、さらに多くのタイトルを見つけてください。提供されたリンクを使用して特別割引をお楽しみください!

私たちの作品

私たちの作品をぜひチェックしてください:

インベスターセントラル | 投資家中央スペイン人 | 中央ドイツの投資家 | スマートな暮らし | エポックとエコー | 不可解な謎 | ヒンドゥーヴァ | エリート開発者 | JS スクール


私たちは中程度です

Tech Koala Insights | エポックズ&エコーズワールド | インベスター・セントラル・メディア | 不可解な謎 中 | 科学とエポックミディアム | 現代ヒンドゥーヴァ

以上が速度と効率を高めるための Python の高度な非同期 Web スクレイピング テクニックの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート