動的ページ用の 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