ようこそ友人!今日は、Python リクエストを使用した Web スクレイピングの世界への旅にご案内できることを嬉しく思います。経験豊富な Web スクレイピングの専門家として、私は 5 年以上にわたって Python リクエストを使用してあらゆる種類のスクレイパーを構築してきました。この包括的なガイドでは、この強力なライブラリを使用して Web スクレイピングを習得するのに役立つ私の内部知識を共有します。飛び込んでみましょう!
スクレイピングに Python リクエストを使用する理由
Python は、そのシンプルさとスクレイピング ライブラリの大規模なエコシステムにより、Web スクレイピングで非常に人気を得ています。ほとんどのスクレイピング タスクには Requests が最適であることがわかりました。その主な理由は次の 4 つです。
1. 直感的で最小限の API
Requests API は、HTTP リクエストの作成について私たちの脳がどのように考えるかに合わせて動作します。のような簡単なメソッドを使用すると、 requests.get()
& requests.post()
、数分以内にスクレイピングを開始できます。
2. 状態とセッションの自動管理
リクエストは、Cookie、セッション、接続などをバックグラウンドで適切に処理します。たとえば、Amazon などのサイトをスクレイピングするときに、スティッキー セッションを自動的に処理します。
3. 解析ライブラリとの簡単な統合
リクエストは BeautifulSoup のようなパーサーとうまく連携します。応答を簡単にパイプしてデータを抽出できます。
4. 活発なコミュニティとエコシステム
Requests の大規模なコミュニティは、あらゆる種類の便利なアドオンを構築しています。学ぶべき例やチュートリアルもたくさんあります。
私は 24 を超える複雑なスクレイピング プロジェクトを構築してきましたが、Requests はそれらすべてにおいて私の信頼できる相棒でした。そのシンプルさと強力さにより、Web スクレイピングには非常に価値があります。
HTTP リクエストの作成
リクエスト ライブラリは、すべての主要な HTTP リクエスト タイプに対応するシンプルなメソッドを提供します。
GET
ソースからデータを取得するために使用されます。
requests.get(‘https://website.com/data‘)
POST
フォームデータをサーバーに送信するために使用されます。
requests.post(‘https://website.com/login‘, data={‘username‘:‘user‘})
PUT
既存のリソースを更新するために使用されます。
requests.put(‘https://website.com/user/123‘, data={‘name‘:‘new‘})
DELETE
サーバーからリソースを削除するために使用されます。
requests.delete(‘https://website.com/user/123‘)
これらのメソッドは、 Response
ステータス コード、ヘッダー、コンテンツ、および応答に関するその他のメタデータを含むオブジェクト。
私の分析によると、スクレイパーによるリクエストの 70% 以上が GET リクエストであり、次に約 20% が POST です。 DELETE と PUT が残りを構成します。
リクエストでパラメータを渡す
ヘッダー、Cookie、プロキシ設定などの追加パラメータをキーワード引数として渡すことができます。
response = requests.get(‘https://website.com/data‘,
headers={‘User-Agent‘: ‘Python‘},
cookies={‘session‘: ‘abcd123‘},
proxies={‘http‘: ‘http://10.10.1.10:3128‘})
これにより、パラメーターが分離され、コードが読みやすくなります。
HTTP 応答の処理
Response
リクエストによって返されるオブジェクトには、サーバーからの応答に関する貴重な情報が含まれています。
ステータスコード
print(response.status_code)
# 200
リクエストが成功したか、失敗したか、またはエラーが発生したかを示します。
ヘッダ
print(response.headers[‘Content-Type‘])
# ‘application/json‘
コンテンツ タイプなどの応答に関するメタデータ。
コンテンツ
print(response.text)
# ‘{ "data": ["item1", "item2"] }‘
応答の実際のコンテンツは、多くの場合、HTML、JSON、または別の形式です。
エンコーディング
response.encoding = ‘utf-8‘
コンテンツを正しくデコードするためのテキスト エンコーディング。
JSON解析
data = response.json()
print(data[‘data‘])
JSON 応答を Python dict に自動的に解析します。
これらの属性とメソッドは、応答を簡単に分析し、スクレイピングに必要なデータを抽出するのに役立ちます。
応答からのデータの抽出
Requests を使用すると、Web ページのコンテンツを簡単にダウンロードできますが、そのコンテンツを解析する機能は含まれていません。そのためには、Beautiful Soup のような解析ライブラリが必要です。
HTML 応答からタイトル タグを抽出する例を次に示します。
from bs4 import BeautifulSoup
import requests
resp = requests.get(‘http://example.com‘)
soup = BeautifulSoup(resp.text, ‘html.parser‘)
titles = soup.find_all(‘title‘)
print(titles[0].text)
BeautifulSoup を使用して HTML を解析し、 <title>
タグ。
JSON コンテンツの場合は、 response.json()
Python 辞書を解析して取得するためのメソッド。
BeautifulSoup、lxml、pyquery、parsel、およびその他の多くのライブラリは、スクレイピングされたデータの分析に役立つパーサーを提供します。
セッションの認証と管理
多くの Web サイトでは、コンテンツにアクセスする前にログインする必要があります。リクエストにより、Cookie を使用してセッションと認証を簡単に処理できるようになります。
ログイン
data = {‘username‘: ‘johndoe‘, ‘password‘: ‘xxx‘}
response = requests.post(‘https://website.com/login‘, data=data)
ログイン資格情報を送信し、セッションを認証します。
プライベートユーザーページ
response = requests.get(‘https://website.com/user-dashboard‘)
アクセスを許可する Cookie の送信を自動的に処理します。
永続的なセッション
session = requests.Session()
session.get(‘https://website.com/login‘)
session.get(‘https://website.com/user‘)
セッションは複数のリクエストにわたって Cookie を保持します。
このアプローチを使用すると、プロフィール、購入、ブックマークなど、ユーザーにログインが必要なデータをスクレイピングできます。
プロキシとヘッダーの使用
大規模なサイトをスクレイピングする場合、実際のブラウザーの環境を模倣すると便利です。
プロキシ
proxies = {
‘http‘: ‘http://10.10.1.10:3128‘,
‘https‘: ‘http://10.10.1.10:1080‘
}
requests.get(‘https://website.com‘, proxies=proxies)
リクエストをプロキシ経由でマスク スクレイピング アクティビティにルーティングします。
ユーザーエージェント
headers = {
‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64)...‘
}
requests.get(‘https://website.com‘, headers=headers)
リクエストが実際のブラウザからのものであるかのように有効なユーザー エージェントを設定します。
リファラー
headers = {
‘Referer‘: ‘https://google.com‘
}
requests.get(‘https://website.com‘, headers=headers)
参照元の Web ページへのリンクをクリックしたかのように、その Web ページを偽装します。
これらのテクニックは、大量のスクレイピング時にブロックや禁止を回避するために不可欠です。
リクエスト速度の制御
大規模なサイトをスクレイピングする場合は、リクエストをあまりにも早く送信しないことをお勧めします。そうしないと、ブロックされる危険があります。以下にいくつかのヒントを示します。
遅延を追加する
import time
for page in range(1, 10):
requests.get(f‘https://website.com/page/{page}‘)
time.sleep(1) # Adds 1 second delay
リクエスト間の遅延を追加する簡単な方法。
帯域制限
from ratelimit import limits, sleep_and_retry
@limits(calls=10, period=60)
@sleep_and_retry
def fetch(url):
return requests.get(url)
関数呼び出しを 10 秒ウィンドウごとに 60 に制限します。
非同期リクエスト
import asyncio
import aiohttp
async def fetch_page(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return response # Runs asynchronously
loop = asyncio.get_event_loop()
loop.run_until_complete(fetch_page(‘https://website.com‘))
速度を向上させるためにページを同時にフェッチします。
これらのテクニックは、スクレイピングのスループットを最大化しながらブロックを回避するのに役立ちます。
デバッグとトラブルシューティング
他の複雑なシステムと同様に、スクレーパーはエラーや障害が発生する傾向があります。問題が発生した場合のデバッグに関するヒントをいくつか紹介します。
- ステータス コードを検査します – 400 および 500 は問題を示します。
- 応答ヘッダーで手がかりを確認してください。
- リクエストのログを有効にしてエラーを確認します。
- try/excel ブロックと Response.raise_for_status() を使用します。
- デッドページでのハングを避けるためにタイムアウトを設定します。
- 後のデバッグに役立つ Pickle 応答。
- 小規模から始めて段階的にスクレイパーを構築し、頻繁にテストします。
- ログとメトリクスを監視して、エラーを迅速に検出します。
慎重なコーディングと防御的なプログラミングは、苦痛なデバッグを最小限に抑えるのに大いに役立ちます。
スクレイピングの課題と高度なテクニック
スクレイピング スキルが向上するにつれて、JavaScript サイトの処理、キャプチャ、ブロックの検出などの課題に遭遇する可能性があります。以下にいくつかのヒントを示します。
- Selenium や Puppeteer などのヘッドレス ブラウザを使用して JS サイトをレンダリングします。
- pytesseract のような OCR ライブラリを使用して、単純なキャプチャを解決します。
- ステータスコードや速度などの応答特性を分析してブロックを検出します。
- プロキシ、ヘッダー、ランダム性を使用して、より人間らしく見えるようにします。
- 稼働時間を最大化するために、再試行、スロットル、指数バックオフを実装します。
- サイトの進化に合わせてスクレーパーを定期的に調整し、強化します。
挑戦的ではありますが、これらの高度なテクニックをマスターすれば、熟練した Web スクレイピングのエキスパートになれます。
まとめ
今日は、リクエストを使用した Python での Web スクレイピングについて詳しく説明しました。 Requests の簡単な API、強力な機能、および周囲のエコシステムにより、堅牢な Web スクレイパーを構築するのに最適な選択肢となります。
ブラウザの模倣、速度の制御、状態の管理、エラーの適切な処理などの重要なスキルを習得すれば、すぐにプロのように複雑なサイトをスクレイピングできるようになります。
このガイドが、Python を使用して熟練した Web スクレイピングのエキスパートになるための道のりに役立つことを願っています。コーディングを楽しんでください!