「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Selenium を Scrapy と統合して動的ページをスクレイピングするにはどうすればよいですか?

Selenium を Scrapy と統合して動的ページをスクレイピングするにはどうすればよいですか?

2024 年 11 月 19 日に公開
ブラウズ:911

How can Selenium be Integrated with Scrapy to Scrape Dynamic Pages?

動的ページ用の Selenium と Scrapy の統合

動的コンテンツを含む複雑な Web サイトをスクレイピングする場合、Web 自動化フレームワークである Selenium をScrapy は、課題を克服するための Web スクレイピング フレームワークです。

Scrapy への Selenium の統合Spider

Selenium を Scrapy スパイダーに統合するには、スパイダーの __init__ メソッド内で Selenium WebDriver を初期化します。

import scrapy
from selenium import webdriver

class ProductSpider(scrapy.Spider):
    name = "product_spider"
    allowed_domains = ['example.com']
    start_urls = ['http://example.com/shanghai']
    
    def __init__(self):
        self.driver = webdriver.Firefox()

次に、parse メソッド内の URL に移動し、Selenium メソッドを利用してページと対話します。

def parse(self, response):
    self.driver.get(response.url)
    next = self.driver.find_element_by_xpath('//td[@class="pagn-next"]/a')
    next.click()

このアプローチを利用すると、ユーザー インタラクションをシミュレートし、動的なページをナビゲートし、必要なデータを抽出できます。

Scrapy で Selenium を使用する代替方法

特定のシナリオでは、ScrapyJS ミドルウェアを使用すると、Selenium に依存せずにページの動的部分を十分に処理できる場合があります。たとえば、次の例を参照してください:

# scrapy.cfg
DOWNLOADER_MIDDLEWARES = {
    'scrapyjs.SplashMiddleware': 580,
}
# my_spider.py
class MySpider(scrapy.Spider):
    name = 'my_spider'
    start_urls = ['http://example.com/dynamic']
    
    def parse(self, response):
        script = 'function() { return document.querySelectorAll("div.product-info").length; }'
        return Request(url=response.url, callback=self.parse_product, meta={'render_javascript': True, 'javascript': script})

    def parse_product(self, response):
        product_count = int(response.xpath('//*[@data-scrapy-meta]/text()').extract_first())

このアプローチでは、ScrapyJS を使用した JavaScript レンダリングを使用して、必要なデータを取得します。セレンを使用しています。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3