迷宮を抜け出す:動的コンテンツスクレイピングのための無料プロキシワークフロー
動的コンテンツスクレイピングを理解する
現代のウェブページを動かす気まぐれな力である動的コンテンツは、単純なHTTPリクエストでは理解できません。JavaScriptでレンダリングされるため、単純なGETリクエスト以上の処理が要求されます。正規のブラウザを装ったリクエスト、IPアドレス制限をすり抜けるプロキシ、そして行間を読むコードなど、オーケストレーションが必要になります。
動的スクレイピングにおけるプロキシの役割
プロキシはデジタル仮面劇のマスクであり、以下の点で不可欠です。
- IPベースのレート制限の回避
- 地理的制限の回避
- 検出を回避するためにトラフィックを分散する
しかし、金庫に手を付けずにこの匿名性を確保するにはどうすればいいのだろうか?無料のプロキシ――はかなく、手に負えない、しかし不可欠な存在だ。その利用法を、外科手術のような精密さで分析してみよう。
ワークフロー 1: Requests と BeautifulSoup を使用した無料パブリックプロキシのローテーション
材料
- 無料プロキシリスト
リクエスト
,美しいスープ
Pythonで
手順
- 収穫プロキシ
無料のプロキシのリストをスクレイピングします。例: 無料プロキシリスト.
「`python
輸入リクエスト
bs4からBeautifulSoupをインポート
get_proxies() を定義します:
url = 'https://free-proxy-list.net/'
soup = BeautifulSoup(requests.get(url).content, 'html.parser')
プロキシ = set()
soup.find('table', id='proxylisttable').tbody.find_all('tr') 内の行を検索します。
row.find_all('td')[6].text == 'yes'の場合: # HTTPSプロキシのみ
ip = row.find_all('td')[0].text
ポート = row.find_all('td')[1].text
プロキシ.add(f'{ip}:{port}')
リストを返す(プロキシ)
“`
- リクエストのプロキシをローテーションする
「`python
ランダムにインポート
プロキシ = get_proxies()
def fetch_with_proxy(url):
proxy = random.choice(プロキシ)
試す:
resp = リクエスト.get(url, プロキシ={“http”: f”http://{proxy}”, “https”: f”http://{proxy}”}, タイムアウト=5)
resp.status_code == 200の場合:
対応するテキストを返す
例外を除く:
合格
なしを返す
“`
- 動的コンテンツの処理
JS が最小限のページの場合は、ネットワーク トラフィックを検査して XHR エンドポイントを見つけ、データを直接取得します。
利点と欠点
特徴 | 長所 | 短所 |
---|---|---|
設定 | 早くて簡単 | プロキシは信頼できないことが多い |
匿名 | IPローテーションにより禁止が減少 | 頻繁にデッド/遅いプロキシ |
動的コンテンツ | シンプルなJSレンダリングサイトにのみ機能します | 完全なJSサイトにはブラウザエミュが必要です |
ワークフロー 2: Selenium と Free Proxy Rotation によるスクレイピング
材料
手順
- プロキシリストを取得する
上記と同様の論理だが、ターゲットを絞る sslproxies.org.
- プロキシを使用するようにSeleniumを構成する
「`python
セレンからWebDriverをインポート
selenium.webdriver.chrome.options からオプションをインポートする
def get_chrome_driver(プロキシ):
オプション = オプション()
options.add_argument(f'–proxy-server=http://{proxy}')
options.add_argument('–headless')
webdriver.Chrome(options=options) を返す
“`
- 動的コンテンツをスクレイピングする
パイソン
プロキシ = get_proxies()
ドライバー = get_chrome_driver(ランダムな選択(プロキシ))
ドライバー.get('https://quotes.toscrape.com/js/')
コンテンツ = ドライバー.ページソース
ドライバー終了()
詩的なメモ
Selenium では、ブラウザがブラシとなり、JavaScript、CSS、そしてインタラクティブ性の微妙な色合いなど、人間のユーザーが見るのと同じようにページを描画します。
利点と欠点
特徴 | 長所 | 短所 |
---|---|---|
JSレンダリング | あらゆる動的コンテンツを処理 | リソースが豊富 |
プロキシローテーション | IPを効果的にマスク | プロキシはブラウザの速度を低下させたりブロックしたりする可能性がある |
検出 | より人間らしく、より検知されにくい | 無料プロキシは大手サイトでブロックされることが多い |
ワークフロー 3: Node.js 愛好家のための ProxyChain を使用した Puppeteer
材料
手順
- 無料プロキシを取得する
ジャバスクリプト
const axios = require('axios');
非同期関数 getProxies() {
const res = axios.get('https://www.proxy-list.download/api/v1/get?type=https'); を待機します。
res.data.split('\r\n').filter(Boolean) を返します。
}
- PuppeteerでProxyChainを使用してプロキシをローテーションする
「`javascript
const 操り人形師 = require('操り人形師');
const ProxyChain = require('proxy-chain');
(非同期() => {
const proxies = await getProxies();
for (const proxyUrl of proxys) {
const 匿名化プロキシ = ProxyChain.anonymizeProxy( を待機しますhttp://${プロキシURL}
);
const browser = await puppeteer.launch({
引数: [--proxy-server=${匿名プロキシ}
, '–no-sandbox', '–disable-setuid-sandbox'],
ヘッドレス:本当、
});
const page = browser.newPage() を待機します。
試す {
page.goto('https://quotes.toscrape.com/js/', {waitUntil: 'networkidle2'}); を待機します。
const content = page.content() を待機します。
// コンテンツを処理します…
} キャッチ (e) {
// 不正なプロキシをスキップする
}
ブラウザを閉じるのを待ちます。
}
})();
“`
利点と欠点
特徴 | 長所 | 短所 |
---|---|---|
オートメーション | Node.js での堅牢なスクリプト | Node.js 依存関係 |
プロキシローテーション | ProxyChainは障害を管理する | 無料プロキシは不安定/遅いことが多い |
動的コンテンツ | PuppeteerはすべてのJSをレンダリングします | プロキシ速度によるレート制限 |
ワークフロー4: Scrapy + 無料プロキシミドルウェアを使用したスマートリクエストスケジューリング
材料
- スクレイピー
- scrapy-rotating-proxys
- 無料プロキシリスト(proxyscrape.com)
手順
- ミドルウェアをインストールする
pip で scrapy-rotating-proxies をインストールします
- Scrapy設定を構成する
パイソン
# 設定.py
ROTATING_PROXY_LIST_PATH = 'proxies.txt'
ダウンローダーミドルウェア = {
'rotating_proxies.middlewares.RotatingProxyMiddleware': 610,
'rotating_proxies.middlewares.BanDetectionMiddleware': 620,
}
- プロキシリストの作成
プロキシをダウンロードして保存する プロキシ.txt
:
https://api.proxyscrape.com/v2/?request=getproxies&protocol=http&timeout=1000&country=all&ssl=all&anonymity=all
- スクレイピースパイダーで削る
Scrapyは、プロキシをローテーションさせながら、動的コンテンツの庭をつま先立ちで歩き回ります。完全なJavaScriptを使用するには、 スクラップ劇作家:
バッシュ
pip で scrapy-playwright をインストールします
そしてあなたのスパイダーでは:
「`python
スクレイピーをインポートする
クラス QuotesSpider(scrapy.Spider):
名前 = “引用符”
start_urls = ['https://quotes.toscrape.com/js/']
def start_requests(self): for url in self.start_urls: yield scrapy.Request(url, meta={"playwright": True}) def parse(self, response): for quote in response.css("div.quote"): yield { "text": quote.css("span.text::text").get(), "author": quote.css("small.author::text").get(), }
“`
利点と欠点
特徴 | 長所 | 短所 |
---|---|---|
スピード | 効率的なリクエストスケジューリング | Scrapyの学習曲線 |
プロキシローテーション | ミドルウェアが禁止事項を処理 | 無料プロキシの信頼性が低い |
JSサポート | Playwrightでは完全なJSを扱う | ヘビー級のセットアップ |
ワークフロー5: 無料プロキシゲートウェイを介したAPI指向のスクレイピング
材料
- ウェブ共有API (無料枠は限定的)
- ScraperAPI無料プラン (使用制限あり)
手順
- APIキーまたはプロキシエンドポイントを取得する
登録して無料のエンドポイントを入手してください。
- プロキシゲートウェイ経由のルートリクエスト
ScraperAPIの場合:
パイソン
api_key = 'YOUR_API_KEY'
url = f'http://api.scraperapi.com/?api_key={api_key}&url=https://quotes.toscrape.com/js/'
レスポンス = リクエスト.get(url)
Web 共有プロキシの場合は、前の例と同じように使用します。
利点と欠点
特徴 | 長所 | 短所 |
---|---|---|
信頼性 | マネージドプロキシ、ダウンタイムの短縮 | 限定無料リクエスト |
使いやすさ | 抄録プロキシローテーション | 特定のサイトをブロックする場合があります |
動的コンテンツ | 一部のAPIはJSをレンダリングしてから返します | 頻繁に使用する場合は有料プランをご利用ください |
比較概要表
ワークフロー | 動的JSサポート | プロキシローテーション | 信頼性 | 無料の制限 | ベストユースケース |
---|---|---|---|---|---|
リクエスト + 無料プロキシ | 低い | マニュアル | 低い | ブロックされた/遅いプロキシ | シンプルなXHR API |
Selenium + 無料プロキシ | 高い | マニュアル | 中くらい | ブロックされたプロキシ、高いCPU使用率 | 複雑なJSサイト、小規模 |
パペティア + プロキシチェーン | 高い | 自動化 | 中くらい | 頻繁なプロキシ障害 | Node.jsの自動化 |
Scrapy + ローテーションプロキシ | ハイ(劇作家と共演) | 自動化 | 中くらい | ミドルウェア構成、低速プロキシ | スケーラブルで高度なスクレイピング |
プロキシAPIゲートウェイ | 高(APIに依存) | 自動化 | 高い | リクエストは限定されており、登録が必要です | 一度きりの確実なスクレイピング |
リソース
- 無料プロキシリスト
- sslproxies.org
- プロキシリスト.ダウンロード
- proxyscrape.com/無料プロキシリスト
- scrapy-rotating-proxys
- スクラップ劇作家
- パペティア エクストラプラグイン プロキシ
- Web Share無料プロキシリスト
- スクレーパーAPI
コードを彫刻刀、プロキシを大理石に見立てて、忍耐強く彫刻してください。すべての動的なページは、表面の下で啓示を待つデジタル彫刻なのです。
コメント (0)
まだコメントはありません。あなたが最初のコメントを投稿できます!